In Linux, come identificare più Arduinos collegati tramite USB?


17

Se ho più Arduinos collegati tramite USB a un computer Linux e vengono visualizzati come

  • / Tty / ACM0
  • / Tty / ACM1
  • / Tty / ACM2

Come posso identificare quale Arduino è quale senza connettersi ad essi tramite connessione seriale ? Esiste un numero seriale o un ID univoco su Arduino?

Grazie per il tuo tempo.

Situazione: Uno R3, Mega, Leonardo con / ttyACM [1,2,3]

Uscita USB con dispositivi nell'ordine sopra menzionato:

...
Bus 001 Dispositivo 011: ID 2341: 0043
Bus 001 Dispositivo 013: ID 2341: 8036
...
Bus 001 Dispositivo 014: ID 2341: 0042

lsusb -d vendor: device -vvv mostra per ognuno

Uno

Bus 001 Dispositivo 014: ID 2341: 0042
Descrittore dispositivo:
  bLunghezza 18
  bDescriptorType 1
  bcdUSB 1.10
  bDeviceClass 2 Communications
  bDeviceSubClass 0
  bDeviceProtocol 0
  bMaxPacketSize0 8
  idVendor 0x2341
  idProduct 0x0042
  bcdDevice 0.01
  iManufacturer 1 Arduino (www.arduino.cc)
  iProduct 2
  iSerial 220 55330313735351910141
  bNumConfigurations 1
  Descrittore di configurazione:
    bLunghezza 9
    bDescriptorType 2
    wTotalLength 62
    bNumInterfaces 2
    bConfigurationValue 1
    iConfigurazione 0
    bmAttributes 0xc0
      Autoalimentato
    MaxPower 100mA
    Descrittore di interfaccia:
      bLunghezza 9
      bDescriptorType 4
      bInterfaceNumber 0
      bAlternateSetting 0
      bNumEndpoints 1
      bInterfaceClass 2 Communications
      bInterfaceSubClass 2 Abstract (modem)
      bInterfaceProtocol 1 AT-comandi (v.25ter)
      Interfaccia 0
      Intestazione CDC:
        bcdCDC 10.01
      CDC ACM:
        bmCapabilities 0x06
          invia una pausa
          codifica di linea e stato seriale
      Unione CDC:
        bMasterInterface 0
        bInterfaccia slave 1
      Descrittore endpoint:
        bLunghezza 7
        bDescriptorType 5
        bEndpointAddress 0x82 EP 2 IN
        bmAttributes 3
          Tipo di trasferimento interrotto
          Tipo di sincronizzazione Nessuno
          Dati sul tipo di utilizzo
        wMaxPacketSize 0x0008 1x 8 byte
        bIntervallo 255
    Descrittore di interfaccia:
      bLunghezza 9
      bDescriptorType 4
      bInterfaceNumber 1
      bAlternateSetting 0
      bNumEndpoints 2
      bInterfaceClass 10 Dati CDC
      bInterfaceSubClass 0 Non utilizzato
      bInterfaceProtocol 0
      Interfaccia 0
      Descrittore endpoint:
        bLunghezza 7
        bDescriptorType 5
        bEndpointAddress 0x04 EP 4 OUT
        bmAttributes 2
          Tipo di trasferimento alla rinfusa
          Tipo di sincronizzazione Nessuno
          Dati sul tipo di utilizzo
        wMaxPacketSize 0x0040 1x 64 byte
        bIntervallo 1
      Descrittore endpoint:
        bLunghezza 7
        bDescriptorType 5
        bEndpointAddress 0x83 EP 3 IN
        bmAttributes 2
          Tipo di trasferimento alla rinfusa
          Tipo di sincronizzazione Nessuno
          Dati sul tipo di utilizzo
        wMaxPacketSize 0x0040 1x 64 byte
        bIntervallo 1
Stato del dispositivo: 0x0000
  (Bus alimentato)

Leonardo:

Bus 001 Dispositivo 013: ID 2341: 8036
Descrittore dispositivo:
  bLunghezza 18
  bDescriptorType 1
  bcdUSB 2.00
  bDeviceClass 0 (definito a livello di interfaccia)
  bDeviceSubClass 0
  bDeviceProtocol 0
  bMaxPacketSize0 64
  idVendor 0x2341
  idProduct 0x8036
  bcdDevice 1.00
  iManufacturer 1 Arduino LLC
  iProduct 2 Arduino Leonardo
  iSerial 0
  bNumConfigurations 1
  Descrittore di configurazione:
    bLunghezza 9
    bDescriptorType 2
    wTotalLength 100
    bNumInterfaces 3
    bConfigurationValue 1
    iConfigurazione 0
    bmAttributes 0x80
      (Bus alimentato)
    MaxPower 500mA
    Associazione interfaccia:
      bLunghezza 8
      bDescriptorType 11
      bFirstInterface 0
      bInterfaceCount 2
      bFunctionClass 2 Communications
      bFunctionSubClass 2 Abstract (modem)
      bFunctionProtocol 1 AT-comandi (v.25ter)
      iFunction 0
    Descrittore di interfaccia:
      bLunghezza 9
      bDescriptorType 4
      bInterfaceNumber 0
      bAlternateSetting 0
      bNumEndpoints 1
      bInterfaceClass 2 Communications
      bInterfaceSubClass 2 Abstract (modem)
      bInterfaceProtocol 0 Nessuno
      Interfaccia 0
      Intestazione CDC:
        bcdCDC 1.10
      Gestione delle chiamate CDC:
        bmCapabilities 0x01
          gestione delle chiamate
        bDataInterface 1
      CDC ACM:
        bmCapabilities 0x06
          invia una pausa
          codifica di linea e stato seriale
      Unione CDC:
        bMasterInterface 0
        bInterfaccia slave 1
      Descrittore endpoint:
        bLunghezza 7
        bDescriptorType 5
        bEndpointAddress 0x81 EP 1 IN
        bmAttributes 3
          Tipo di trasferimento interrotto
          Tipo di sincronizzazione Nessuno
          Dati sul tipo di utilizzo
        wMaxPacketSize 0x0040 1x 64 byte
        bInterval 0
      Descrittore endpoint:
        bLunghezza 7
        bDescriptorType 5
        bEndpointAddress 0x83 EP 3 IN
        bmAttributes 2
          Tipo di trasferimento alla rinfusa
          Tipo di sincronizzazione Nessuno
          Dati sul tipo di utilizzo
        wMaxPacketSize 0x0040 1x 64 byte
        bInterval 0
    Descrittore di interfaccia:
      bLunghezza 9
      bDescriptorType 4
      bInterfaceNumber 2
      bAlternateSetting 0
      bNumEndpoints 1
      bInterfaceClass 3 Human Interface Device
      bInterfaceSubClass 0 Nessuna sottoclasse
      bInterfaceProtocol 0 Nessuno
      Interfaccia 0
        Descrittore dispositivo HID:
          bLunghezza 9
          bDescriptorType 33
          bcdHID 1.01
          bCountryCode 0 Non supportato
          bNumDescriptors 1
          bDescriptorType 34 Report
          wDescriptorLength 101
          Descrittore rapporto: (la lunghezza è 101)
            Articolo (globale): pagina di utilizzo, dati = [0x01] 1
                            Controlli desktop generici
            Articolo (locale): Utilizzo, dati = [0x02] 2
                            Topo
            Item (Main): Collection, data = [0x01] 1
                            Applicazione
            Elemento (locale): Utilizzo, dati = [0x01] 1
                            pointer
            Item (Main): Collection, data = [0x00] 0
                            Fisico
            Elemento (globale): ID rapporto, dati = [0x01] 1
            Articolo (globale): pagina di utilizzo, dati = [0x09] 9
                            pulsanti
            Articolo (locale): minimo di utilizzo, dati = [0x01] 1
                            Pulsante 1 (primario)
            Articolo (locale): massimo utilizzo, dati = [0x03] 3
                            Pulsante 3 (terziario)
            Elemento (globale): minimo logico, dati = [0x00] 0
            Elemento (globale): massimo logico, dati = [0x01] 1
            Elemento (globale): conteggio rapporti, dati = [0x03] 3
            Elemento (globale): dimensioni report, dati = [0x01] 1
            Voce (principale): input, data = [0x02] 2
                            Variabile di dati assoluto No_Wrap lineare
                            Preferred_State No_Null_Position Bit bit non volatile
            Elemento (globale): conteggio rapporti, dati = [0x01] 1
            Elemento (globale): dimensioni report, dati = [0x05] 5
            Voce (principale): input, data = [0x03] 3
                            Assoluto variabile costante No_Wrap lineare
                            Preferred_State No_Null_Position Bit bit non volatile
            Articolo (globale): pagina di utilizzo, dati = [0x01] 1
                            Controlli desktop generici
            Articolo (locale): Utilizzo, dati = [0x30] 48
                            Direzione-X
            Articolo (locale): Utilizzo, dati = [0x31] 49
                            Direzione-Y
            Articolo (locale): Utilizzo, dati = [0x38] 56
                            Ruota
            Elemento (globale): minimo logico, dati = [0x81] 129
            Elemento (globale): massimo logico, dati = [0x7f] 127
            Elemento (globale): dimensioni report, dati = [0x08] 8
            Elemento (globale): conteggio rapporti, dati = [0x03] 3
            Voce (principale): input, data = [0x06] 6
                            Variabile dati relativa No_Wrap lineare
                            Preferred_State No_Null_Position Bit bit non volatile
            Item (Main): End Collection, data = none
            Item (Main): End Collection, data = none

            ......

      Descrittore endpoint:
        bLunghezza 7
        bDescriptorType 5
        bEndpointAddress 0x84 EP 4 IN
        bmAttributes 3
          Tipo di trasferimento interrotto
          Tipo di sincronizzazione Nessuno
          Dati sul tipo di utilizzo
        wMaxPacketSize 0x0040 1x 64 byte
        bIntervallo 1
Stato del dispositivo: 0x0000
  (Bus alimentato)

E Mega256:

Bus 001 Dispositivo 014: ID 2341: 0042
Descrittore dispositivo:
  bLunghezza 18
  bDescriptorType 1
  bcdUSB 1.10
  bDeviceClass 2 Communications
  bDeviceSubClass 0
  bDeviceProtocol 0
  bMaxPacketSize0 8
  idVendor 0x2341
  idProduct 0x0042
  bcdDevice 0.01
  iManufacturer 1 Arduino (www.arduino.cc)
  iProduct 2
  iSerial 220 55330313735351910141
  bNumConfigurations 1
  Descrittore di configurazione:
    bLunghezza 9
    bDescriptorType 2
    wTotalLength 62
    bNumInterfaces 2
    bConfigurationValue 1
    iConfigurazione 0
    bmAttributes 0xc0
      Autoalimentato
    MaxPower 100mA
    Descrittore di interfaccia:
      bLunghezza 9
      bDescriptorType 4
      bInterfaceNumber 0
      bAlternateSetting 0
      bNumEndpoints 1
      bInterfaceClass 2 Communications
      bInterfaceSubClass 2 Abstract (modem)
      bInterfaceProtocol 1 AT-comandi (v.25ter)
      Interfaccia 0
      Intestazione CDC:
        bcdCDC 10.01
      CDC ACM:
        bmCapabilities 0x06
          invia una pausa
          codifica di linea e stato seriale
      Unione CDC:
        bMasterInterface 0
        bInterfaccia slave 1
      Descrittore endpoint:
        bLunghezza 7
        bDescriptorType 5
        bEndpointAddress 0x82 EP 2 IN
        bmAttributes 3
          Tipo di trasferimento interrotto
          Tipo di sincronizzazione Nessuno
          Dati sul tipo di utilizzo
        wMaxPacketSize 0x0008 1x 8 byte
        bIntervallo 255
    Descrittore di interfaccia:
      bLunghezza 9
      bDescriptorType 4
      bInterfaceNumber 1
      bAlternateSetting 0
      bNumEndpoints 2
      bInterfaceClass 10 Dati CDC
      bInterfaceSubClass 0 Non utilizzato
      bInterfaceProtocol 0
      Interfaccia 0
      Descrittore endpoint:
        bLunghezza 7
        bDescriptorType 5
        bEndpointAddress 0x04 EP 4 OUT
        bmAttributes 2
          Tipo di trasferimento alla rinfusa
          Tipo di sincronizzazione Nessuno
          Dati sul tipo di utilizzo
        wMaxPacketSize 0x0040 1x 64 byte
        bIntervallo 1
      Descrittore endpoint:
        bLunghezza 7
        bDescriptorType 5
        bEndpointAddress 0x83 EP 3 IN
        bmAttributes 2
          Tipo di trasferimento alla rinfusa
          Tipo di sincronizzazione Nessuno
          Dati sul tipo di utilizzo
        wMaxPacketSize 0x0040 1x 64 byte
        bIntervallo 1
Stato del dispositivo: 0x0000
  (Bus alimentato)

lsusb -vvvdice?
Ignacio Vazquez-Abrams,

Puoi scollegarne uno e vedere quale scompare?
Pinguino anonimo il

1
Non proprio, voglio farlo per un array di sensori a energia solare remota che sarà molto lontano per qualcuno che lo faccia al riavvio.
vlad b.

Ignacio Vasquez-Abrams - come posso mappare le informazioni da lsusb -vvv a / dev / ttyACM <x>? C'è qualcosa nell'output di lsusb che posso analizzare? Grazie per l'idea!
vlad b.

Hai un altro Arduino con cui puoi confrontare l'output?
Ignacio Vazquez-Abrams,

Risposte:


6

Supponendo che la tua distribuzione stia usando udev:

udevadm info --query=all --name=/dev/ttyACM0

Potresti aver bisogno dei privilegi di root per eseguire questo (sudo / su). Verrà visualizzato un elenco di informazioni come questa:

P: /devices/pci0000:00/0000:00:1d.2/usb4/4-2/4-2:1.0/tty/ttyACM0
N: ttyACM0
S: serial/by-id/usb-Dean_Camera_LUFA_USB-RS232_Adapter_74133353537351403012-if00
S: serial/by-path/pci-0000:00:1d.2-usb-0:2:1.0
E: DEVLINKS=/dev/serial/by-id/usb-Dean_Camera_LUFA_USB-RS232_Adapter_74133353537351403012-if00 /dev/serial/by-path/pci-0000:00:1d.2-usb-0:2:1.0
E: DEVNAME=/dev/ttyACM0
E: DEVPATH=/devices/pci0000:00/0000:00:1d.2/usb4/4-2/4-2:1.0/tty/ttyACM0
E: ID_BUS=usb
E: ID_MM_CANDIDATE=1
E: ID_MODEL=LUFA_USB-RS232_Adapter
E: ID_MODEL_ENC=LUFA\x20USB-RS232\x20Adapter
E: ID_MODEL_FROM_DATABASE=Uno R3 (CDC ACM)
E: ID_MODEL_ID=0043
E: ID_PATH=pci-0000:00:1d.2-usb-0:2:1.0
E: ID_PATH_TAG=pci-0000_00_1d_2-usb-0_2_1_0
E: ID_REVISION=0001
E: ID_SERIAL=Dean_Camera_LUFA_USB-RS232_Adapter_74133353537351403012
E: ID_SERIAL_SHORT=74133353537351403012
E: ID_TYPE=generic
E: ID_USB_DRIVER=cdc_acm
E: ID_USB_INTERFACES=:020201:0a0000:
E: ID_USB_INTERFACE_NUM=00
E: ID_VENDOR=Dean_Camera
E: ID_VENDOR_ENC=Dean\x20Camera
E: ID_VENDOR_FROM_DATABASE=Arduino SA
E: ID_VENDOR_ID=2341
E: MAJOR=166
E: MINOR=0
E: SUBSYSTEM=tty
E: UDEV_LOG=3
E: USEC_INITIALIZED=751387324986

Questo è per uno Uno con firmware modificato su atmega16u2 (da USB a seriale). Le linee di interesse sono probabilmente ID_MODEL_ID e ID_MODEL_FROM_DATABASE.


Grazie. Sto usando OpenWrt in questo caso con hotplug2 per impostazione predefinita, ma proverò a passare a udev e testarlo.
vlad b.

5

È possibile aggiungere un alias per ciascuno. Allora sai quale è quale. Ecco un bel tutorial su come configurarlo.

Ecco uno snippet che ho scritto sulla base del tutorial. Nell'esempio seguente, sto usando un adattatore FTDI RS232RL da USB a seriale, che credo sia anche quello che Arduino usa.

  1. Per assegnare un alias a un dispositivo USB-seriale, dobbiamo trovare alcune informazioni sul dispositivo
  2. Collegare l'USB. Ciò presuppone che tu abbia già installato i driver per questo uso sia dispositivo e che il dispositivo sia visibile durante la digitazione:

lsusb

  1. Avremo bisogno di quanto segue a. L'ID fornitore b. L'ID prodotto c. Il numero di serie del dispositivo
  2. Per fare questo, ci vuole un po 'di caccia. Tutti i tuoi dispositivi registrano le voci in '/ var / log / messages'.

Pertanto possiamo leggere questo file e trovare l'USB corretto:

grep "ftdi" /var/log/messages

Puoi anche usare "usb"

  1. Questo è trovare tutti i messaggi taggati con ftdi:

  2. Accanto a ftdi_sio, c'è un numero come 1-1.2. Questo è il dispositivo USB

grep "usb 1-1.2" /var/log/messages

Oppure puoi usare:

dmesg | grep "usb 1-1.3"
  1. Questo ci dà tutte le informazioni di cui abbiamo bisogno:

Alias ​​USB

  1. Ora con l'elenco dei numeri di serie in mano creiamo un set di regole UDEV che creerà un bel collegamento simbolico per ciascuno di questi dispositivi. Le regole UDEV sono generalmente sparse in molti file in /etc/udev/rules.d. Crea un nuovo file chiamato 99-usb-serial.rules e inserisci le seguenti righe:

In questo esempio il mio alias si chiama 'lcdbox'

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A601ERJJ", SYMLINK+="lcdbox"
  1. SYMLINK è il nome del tuo alias. In questo caso il mio alias è lcdbox.
  2. Salva il file e digita

    sudo udevadm control --reload-rules

  3. genere

    ls –l / dev / lcdbox

lrwxrwxrwx 1 root root 7 gennaio 1 1970 / dev / lcdbox -> ttyUSB0

  1. Questo dimostra che il mio alias lcdbox è mappato su ttyUSB0

4

Questo è abbastanza facile! Devi personalizzare il firmware dei chip ftdi e aggiungere una regola udev:

Per prima cosa, vai ftdi_eepromvia apt-geto dalle fonti. Identifica il tuo dispositivo tramite lsusb e ottieni l'id:

lsusb

Bus 001 Dispositivo 005: ID 0403: 6001 Future Technology Devices International, Ltd FT232 Serial IC (UART) IC
....

Preparare una config e fare in modo, che vendor_ide product_idabbinare. Personalizza le stringhe nella Stringssezione per ottenere un ID univoco per il tuo dispositivo.

vendor_id = 0x0403 # ID fornitore
product_id = 0x6001 # ID prodotto

max_power = 50 # Max. consumo di energia: valore * 2 mA. Usa 0 se self_powered = true.

###########
# Stringhe #
########### 
produttore = "FTDI" # Produttore
product = "Arduino Nano" # Prodotto
serial = "arduino1" # Seriale

###########
# Opzioni #
###########
self_powered = false # Disattivalo per bus alimentato
remote_wakeup = false # Attivalo per la funzione di riattivazione remota
use_serial = true # Usa la stringa del numero seriale

# Normalmente fuori non è necessario cambiare una di queste bandiere
# BM_type_chip = true # I chip più recenti sono tutti di tipo BM
in_is_isochronous = false # Nell'endpoint è isocrono
out_is_isochronous = false # Out L'endpoint è isocrono
suspend_pull_downs = false # Abilita i pull down di sospensione per una potenza inferiore
change_usb_version = false # Cambia versione USB
usb_version = 0x0200 # Utilizzato solo quando change_usb_version è abilitato

########
# Varie #
########

nome file = "eeprom.old" # Nome file, lascia vuoto per saltare la scrittura del file
cbus0 = RXLED #
cbus1 = TXLED #

Scarica l'attuale firmware ftdi:

ftdi_eeprom --read-eprom

Questo comando crea ${pwd}/eeprom.old, che contiene il firmware corrente su ftdi. Eseguire il backup di questo file prima di continuare , perché durante flash-eepromil file viene riscritto. Dopo il backup, invia il flash ftdi:

ftdi_eeprom --flash-eeprom myconfig.conf

Ora crea una regola udev, in questo modo

SUBSYSTEMS=="usb", ATTRS{idProduct}=="6001", ATTRS{idVendor}=="0403", SYMLINK+="$attr{serial}", OWNER="bananapi", GROUP="pi", MODE="0777"

dentro /etc/udev/rules.d/90-arduino-usb.rulese riavvia udev.

service udev restart

Scollegare e ricollegare il dispositivo e provare

ls -lah /dev/arduino1

Dove si arduino1trova la stringa definita serialin precedenza .conf.

Vedi anche: Rischi di ftdi_eeprom? - TX sempre alto dopo il lampeggiamento


3

Avrei usato una sceneggiatura per creare un alias /dev/e impostare anche gruppo e diritti su di essa con udevle stesse risposte delle altre.

Ma se non ho avuto udevlo farei tubi lsusbin grepo awk, come lsusb|grep -e "idProduct".

In ogni caso, con udevle regole o con lsusbe grepper identificare i dispositivi USB, l'uso idVendor, idProducte iSerialin Device descriptorparte lsusbper fare la corretta idenification. Il idVendorti dice il manufaturer, idProductdovrebbe identificare il prodotto dal produttore, ma a volte usano lo stesso prodotto ID per più di un prodotto. Infine, se necessario, iSerialdovrebbe essere un ID univoco per ogni esempio di quel prodotto.


3

Su Ubuntu 16.04 (e forse anche versioni precedenti o altre distribuzioni), puoi fare:

> ls /dev/serial/by-id

che visualizza (sulla mia scatola in cui è collegato un Arduino UNO):

usb-Arduino__www.arduino.cc__0043_A4139363931351318241-if00

È possibile individuare facilmente l'ID dispositivo 0043 (UNO) qui.

Questo file è in realtà un link a /dev/ttyACM0nella mia scatola.


2

Puoi sempre fare una sorta di stampa id via seriale in void setup (). Dopo aver collegato una determinata scheda, invierà questo ID all'interfaccia USB (che stai ascoltando con un qualche tipo di app daemon sulla tua scatola di Linux). Una volta ricevuto l'id, è possibile mapparlo sul percorso 'Arduino1': '/ dev / ttyACM0', 'Arduino2': '/ dev / ttyACM1', 'Arduino3': '/dev/ttyACM2'...etc

Tenere presente che quando il dispositivo viene disconnesso per qualche motivo, può cambiare il suo percorso fisico, quindi potrebbe essere necessario rimappare tutti. In questo caso potrebbe essere utile scrivere una funzione separata ex: get_id () che puoi chiamare in qualsiasi momento (non solo all'avvio).


1

Sarei fortemente tentato di identificarmi in un altro modo, come se lo schizzo stesso rispondesse a un comando di identificazione speciale, solo per evitare i modi strani di identificazione dei dispositivi USB.


0

Panoramica

  • Un modo come menzionato nella sua risposta ansi_lumen è quello di far lampeggiare la EEPROM del chip ftdi per avere un numero seriale univoco che poi potrebbe essere identificato dalle regole UDEV.

    Ma risulta che non funzionerà su Arduinos cinesi economici che invece di FTDI hanno il chip CH340G che non ha EEPROM per memorizzare un ID univoco ( CH340B dovrebbe funzionare ).

  • Questa risposta suggerisce di scrivere la regola UDEV con uno script speciale che chiede ad Arduino di inviare il suo ID univoco via seriale. Il problema è che è necessario modificare lo schizzo di Arduino e in generale è piuttosto complesso.

Identificazione per porto

Quindi il modo più semplice che ho trovato è stato quello di utilizzare le regole UDEV e identificare gli Arduinos tramite la porta USB (devpath) in modo da collegare Arduino alla stessa porta (anche negli hub USB nidificati) creerà un nome persistente .

Configurazione TLDR:

Versione modificata di questo

  1. Trova Arduino idVendor e idProduct:

lsusb

Otterrai qualcosa del genere:

...
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 124: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 003 Device 123: ID 214b:7000  
Bus 003 Device 122: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 003 Device 121: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 003 Device 120: ID 1a40:0101 Terminus Technology Inc. Hub
...

Collegando / disconnettendo Arduino trova quello che è (ne ho 3 collegati). Stiamo cercando il suo ID. Nel mio caso "... ID 1a86: 7523 QinHeng ...". Quindi idVendor = 1a86, idProduct = 7523

  1. Crea nuovo file di regole UDEV:

sudo nano /etc/udev/rules.d/99-usb-serial.rules

  1. Modifica i valori di idVendor e idProduct in base a ciò che hai trovato nel passaggio precedente su copia e incollalo nel file delle regole che abbiamo creato:

SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="ttyUSB-arduino%s{/devpath}"

  1. Ricarica le regole UDEV

sudo udevadm control --reload

  1. Sostituisci Arduinos e ora avrà un nome univoco. Per testarlo digitare:

ls /dev/ttyUSB*


Che produrrà:

/dev/ttyUSB1 /dev/ttyUSB3 /dev/ttyUSB-arduino2.1 /dev/ttyUSB-arduino2.4 /dev/ttyUSB2 /dev/ttyUSB4 /dev/ttyUSB-arduino2.2 /dev/ttyUSB-arduino3

Come puoi vedere otteniamo / dev / ttyUSBx come prima, che cambiano sempre a seconda di quale è stato collegato per primo. Ma ora abbiamo anche / dev / ttyUSB-arduino {port} che sono sempre gli stessi per la stessa porta e solo per gli Arduinos. Per analizzare cosa significa "..arduino2.4": 2 fa riferimento alla seconda porta del laptop e 4 alla quarta porta dell'hub USB.

Per vederlo meglio digitare:

lsusb -t

Produzione:

...
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 480M
    |__ Port 1: Dev 5, If 0, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 1: Dev 5, If 1, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 2: Dev 84, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 1: Dev 85, If 0, Class=Vendor Specific Class, Driver=ch341, 12M
        |__ Port 2: Dev 86, If 0, Class=Vendor Specific Class, Driver=ch341, 12M
        |__ Port 3: Dev 87, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 4: Dev 88, If 0, Class=Vendor Specific Class, Driver=ch341, 12M
    |__ Port 3: Dev 89, If 0, Class=Vendor Specific Class, Driver=ch341, 12M
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/6p, 480M
...

Collegando / disconnettendo è possibile vedere quali dispositivi si trovano su quali porte

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.