Jeśli mam wiele Arduino podłączonych przez USB do komputera z systemem Linux, a pojawią się one jako
- / tty / ACM0
- / tty / ACM1
- / tty / ACM2
Jak mogę zidentyfikować, które Arduino jest, bez łączenia się z nimi przez połączenie szeregowe ? Czy na Arduino jest numer seryjny lub unikatowy identyfikator?
Dziękuję za Twój czas.
Sytuacja: Uno R3, Mega, Leonardo with / ttyACM [1,2,3]
Wyjście lsusb z urządzeniami w wyżej wymienionej kolejności:
... Magistrala 001 Urządzenie 011: ID 2341: 0043 Magistrala 001 Urządzenie 013: ID 2341: 8036 ... Magistrala 001 Urządzenie 014: ID 2341: 0042
lsusb -d vendor: urządzenie -vvv pokazuje dla każdego
ONZ
Magistrala 001 Urządzenie 014: ID 2341: 0042 Deskryptor urządzenia: bDługość 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 2 Communications bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 8 idVendor 0x2341 idProduct 0x0042 bcdDevice 0.01 iManufacture 1 Arduino (www.arduino.cc) iProdukt 2 iSerial 220 55330313735351910141 bNumConfiguracje 1 Deskryptor konfiguracji: b Długość 9 bDescriptorType 2 wTotalLength 62 bNumInterfaces 2 bConfigurationValue 1 iConfiguracja 0 bmAttributes 0xc0 Własne zasilanie MaxPower 100mA Deskryptor interfejsu: b Długość 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 2 Communications bInterfaceSubClass 2 Streszczenie (modem) bInterfaceProtocol 1 Polecenia AT (v.25ter) Interfejs 0 Nagłówek CDC: bcdCDC 10.01 CDC ACM: bmCapabilities 0x06 wysyła przerwę kodowanie linii i stan szeregowy CDC Union: bMasterInterface 0 bSlaveInterface 1 Deskryptor punktu końcowego: b Długość 7 bDescriptorType 5 b Punkt końcowy 0x82 EP 2 IN bmAttributes 3 Przenieś typ transferu Typ synchronizacji Brak Dane typu użycia wMaxPacketSize 0x0008 1x 8 bajtów b Interwał 255 Deskryptor interfejsu: b Długość 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 10 CDC Data bInterfaceSubClass 0 Nieużywany bInterfaceProtocol 0 Interfejs 0 Deskryptor punktu końcowego: b Długość 7 bDescriptorType 5 b Adres końcowy 0x04 EP 4 OUT bmAttributes 2 Rodzaj transferu luzem Typ synchronizacji Brak Dane typu użycia wMaxPacketSize 0x0040 1x 64 bajty b Interwał 1 Deskryptor punktu końcowego: b Długość 7 bDescriptorType 5 b Adres końcowy 0x83 EP 3 IN bmAttributes 2 Rodzaj transferu luzem Typ synchronizacji Brak Dane typu użycia wMaxPacketSize 0x0040 1x 64 bajty b Interwał 1 Stan urządzenia: 0x0000 (Zasilany z magistrali)
Leonardo:
Magistrala 001 Urządzenie 013: ID 2341: 8036 Deskryptor urządzenia: bDługość 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 0 (Zdefiniowane na poziomie interfejsu) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x2341 idProduct 0x8036 bcdDevice 1.00 iMan Producent 1 Arduino LLC iProduct 2 Arduino Leonardo iSerial 0 bNumConfiguracje 1 Deskryptor konfiguracji: b Długość 9 bDescriptorType 2 wTotalLength 100 bNumInterfaces 3 bConfigurationValue 1 iConfiguracja 0 bmAttributes 0x80 (Zasilany z magistrali) MaxPower 500mA Powiązanie interfejsu: b Długość 8 bDescriptorType 11 bFirstInterface 0 bInterfaceCount 2 bFunkcja Klasa 2 Komunikacja bFunctionSubClass 2 Abstract (modem) bFunctionProtocol 1 Polecenia AT (v.25ter) iFunkcja 0 Deskryptor interfejsu: b Długość 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 2 Communications bInterfaceSubClass 2 Streszczenie (modem) bInterfaceProtocol 0 Brak Interfejs 0 Nagłówek CDC: bcdCDC 1.10 Zarządzanie połączeniami CDC: bmCapabilities 0x01 zarządzanie połączeniami bDataInterface 1 CDC ACM: bmCapabilities 0x06 wysyła przerwę kodowanie linii i stan szeregowy CDC Union: bMasterInterface 0 bSlaveInterface 1 Deskryptor punktu końcowego: b Długość 7 bDescriptorType 5 b Adres końcowy 0x81 EP 1 IN bmAttributes 3 Przenieś typ transferu Typ synchronizacji Brak Dane typu użycia wMaxPacketSize 0x0040 1x 64 bajty b Interwał 0 Deskryptor punktu końcowego: b Długość 7 bDescriptorType 5 b Adres końcowy 0x83 EP 3 IN bmAttributes 2 Rodzaj transferu luzem Typ synchronizacji Brak Dane typu użycia wMaxPacketSize 0x0040 1x 64 bajty b Interwał 0 Deskryptor interfejsu: b Długość 9 bDescriptorType 4 bInterfaceNumber 2 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 3 Human Interface Device bInterfaceSubClass 0 Brak podklasy bInterfaceProtocol 0 Brak Interfejs 0 Deskryptor urządzenia HID: b Długość 9 bDescriptorType 33 bcdHID 1.01 bCountryCode 0 Nieobsługiwany bNumDescriptors 1 bDescriptorType 34 Raport wDescriptorLength 101 Deskryptor raportu: (długość wynosi 101) Pozycja (globalna): Strona użytkowania, dane = [0x01] 1 Ogólne elementy sterujące pulpitu Pozycja (lokalna): użycie, dane = [0x02] 2 Mysz Pozycja (główna): kolekcja, dane = [0x01] 1 Podanie Pozycja (lokalna): użycie, dane = [0x01] 1 Wskaźnik Pozycja (główna): kolekcja, dane = [0x00] 0 Fizyczny Pozycja (globalna): identyfikator raportu, dane = [0x01] 1 Pozycja (globalna): Strona użytkowania, dane = [0x09] 9 guziki Pozycja (lokalna): minimum użycia, dane = [0x01] 1 Przycisk 1 (podstawowy) Pozycja (lokalna): Maksymalne użycie, dane = [0x03] 3 Przycisk 3 (trzeciorzędowy) Pozycja (globalna): minimum logiczne, dane = [0x00] 0 Pozycja (globalna): logiczne maksimum, dane = [0x01] 1 Pozycja (globalna): liczba raportów, dane = [0x03] 3 Pozycja (globalna): rozmiar raportu, dane = [0x01] 1 Pozycja (główna): Dane wejściowe, dane = [0x02] 2 Zmienna danych Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Pozycja (globalna): liczba raportów, dane = [0x01] 1 Pozycja (globalna): rozmiar raportu, dane = [0x05] 5 Pozycja (główna): Dane wejściowe, dane = [0x03] 3 Stała Zmienna Absolutna No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Pozycja (globalna): Strona użytkowania, dane = [0x01] 1 Ogólne elementy sterujące pulpitu Pozycja (lokalna): użycie, dane = [0x30] 48 Kierunek-X Pozycja (lokalna): użycie, dane = [0x31] 49 Kierunek-Y Pozycja (lokalna): użycie, dane = [0x38] 56 Koło Pozycja (globalna): minimum logiczne, dane = [0x81] 129 Pozycja (globalna): maksimum logiczne, dane = [0x7f] 127 Pozycja (globalna): rozmiar raportu, dane = [0x08] 8 Pozycja (globalna): liczba raportów, dane = [0x03] 3 Pozycja (główna): Dane wejściowe, dane = [0x06] 6 Zmienna danych Relative No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Pozycja (główna): End Collection, data = none Pozycja (główna): End Collection, data = none ...... Deskryptor punktu końcowego: b Długość 7 bDescriptorType 5 b Punkt końcowy 0x84 EP 4 IN bmAttributes 3 Przenieś typ transferu Typ synchronizacji Brak Dane typu użycia wMaxPacketSize 0x0040 1x 64 bajty b Interwał 1 Stan urządzenia: 0x0000 (Zasilany z magistrali)
I Mega256:
Magistrala 001 Urządzenie 014: ID 2341: 0042 Deskryptor urządzenia: bDługość 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 2 Communications bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 8 idVendor 0x2341 idProduct 0x0042 bcdDevice 0.01 iManufacture 1 Arduino (www.arduino.cc) iProdukt 2 iSerial 220 55330313735351910141 bNumConfiguracje 1 Deskryptor konfiguracji: b Długość 9 bDescriptorType 2 wTotalLength 62 bNumInterfaces 2 bConfigurationValue 1 iConfiguracja 0 bmAttributes 0xc0 Własne zasilanie MaxPower 100mA Deskryptor interfejsu: b Długość 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 2 Communications bInterfaceSubClass 2 Streszczenie (modem) bInterfaceProtocol 1 Polecenia AT (v.25ter) Interfejs 0 Nagłówek CDC: bcdCDC 10.01 CDC ACM: bmCapabilities 0x06 wysyła przerwę kodowanie linii i stan szeregowy CDC Union: bMasterInterface 0 bSlaveInterface 1 Deskryptor punktu końcowego: b Długość 7 bDescriptorType 5 b Punkt końcowy 0x82 EP 2 IN bmAttributes 3 Przenieś typ transferu Typ synchronizacji Brak Dane typu użycia wMaxPacketSize 0x0008 1x 8 bajtów b Interwał 255 Deskryptor interfejsu: b Długość 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 10 CDC Data bInterfaceSubClass 0 Nieużywany bInterfaceProtocol 0 Interfejs 0 Deskryptor punktu końcowego: b Długość 7 bDescriptorType 5 b Adres końcowy 0x04 EP 4 OUT bmAttributes 2 Rodzaj transferu luzem Typ synchronizacji Brak Dane typu użycia wMaxPacketSize 0x0040 1x 64 bajty b Interwał 1 Deskryptor punktu końcowego: b Długość 7 bDescriptorType 5 b Adres końcowy 0x83 EP 3 IN bmAttributes 2 Rodzaj transferu luzem Typ synchronizacji Brak Dane typu użycia wMaxPacketSize 0x0040 1x 64 bajty b Interwał 1 Stan urządzenia: 0x0000 (Zasilany z magistrali)
lsusb -vvv
mówi?Odpowiedzi:
Zakładając, że twoja dystrybucja używa
udev
:Do uruchomienia tego mogą być potrzebne uprawnienia roota (sudo / su). Wyświetli listę takich informacji:
Dotyczy to Uno ze zmodyfikowanym oprogramowaniem układowym na atmega16u2 (z USB na szeregowy). Linie zainteresowania to prawdopodobnie ID_MODEL_ID i ID_MODEL_FROM_DATABASE.
źródło
Możesz dodać alias dla każdego. Wtedy wiesz, który jest który. Oto fajny samouczek jak to skonfigurować.
Oto fragment, który napisałem na podstawie samouczka. W poniższym przykładzie używam adaptera USB-szeregowego FTDI RS232RL, co moim zdaniem jest tym, czego używa Arduino.
lsusb
Dlatego możemy odczytać ten plik i znaleźć odpowiedni USB:
Możesz także użyć „usb”
Oto wszystkie wiadomości oznaczone tagiem ftdi:
Obok ftdi_sio jest liczba taka jak 1-1.2. To jest urządzenie USB
grep "usb 1-1.2" /var/log/messages
Lub możesz użyć:
W tym przykładzie mój alias nazywa się „lcdbox”
Zapisz plik i wpisz
sudo udevadm control --reload-rules
Rodzaj
ls –l / dev / lcdbox
lrwxrwxrwx 1 root root 7 sty 1 1970 / dev / lcdbox -> ttyUSB0
źródło
To całkiem proste! Musisz dostosować oprogramowanie układowe ftdi i dodać regułę udev:
Najpierw uzyskaj
ftdi_eeprom
za pośrednictwemapt-get
lub ze źródeł. Zidentyfikuj swoje urządzenie za pomocą lsusb i uzyskaj identyfikator:Przygotuj config i upewnij się, że
vendor_id
iproduct_id
dopasować. Dostosuj ciągi wStrings
sekcji, aby uzyskać unikalny identyfikator urządzenia.Zrzuć bieżące oprogramowanie sprzętowe ftdi:
ftdi_eeprom --read-eprom
To polecenie tworzy
${pwd}/eeprom.old
, które zawiera bieżące oprogramowanie układowe na ftdi. Wykonaj kopię zapasową tego pliku przed kontynuowaniem , ponieważ w trakcieflash-eeprom
jego zapisywania plik jest przepisywany. Po utworzeniu kopii zapasowej sflashuj ftdi:Teraz utwórz regułę udev
w
/etc/udev/rules.d/90-arduino-usb.rules
i ponownie uruchom udev.Odłącz i ponownie podłącz urządzenie i spróbuj
Gdzie
arduino1
jest ciąg zdefiniowanyserial
w powyższym.conf
.Zobacz także: Ryzyko związane z ftdi_eeprom? - TX zawsze wysoki po flashowaniu
źródło
Użyłbym skryptu, aby utworzyć alias poniżej,
/dev/
a także ustawić grupę i prawa do niego,udev
podobnie jak inne odpowiedzi.Ale gdybym nie miał
udev
bym ruręlsusb
podgrep
lubawk
, jaklsusb|grep -e "idProduct"
.W każdym razie, z
udev
przepisami lub zlsusb
igrep
do identyfikacji urządzeń USB, użyjidVendor
,idProduct
aiSerial
wDevice descriptor
częścilsusb
do właściwego idenification.idVendor
Informuje o Manufaturer,idProduct
powinny indentify produkt od producenta, ale czasami używać tego samego identyfikatora produktu dla więcej niż jednego produktu. Wreszcie, w razie potrzeby,iSerial
powinien być unikalnym identyfikatorem dla każdego przykładu tego produktu.źródło
W systemie Ubuntu 16.04 (a może także w poprzednich wersjach lub innych dystrybucjach) możesz:
który wyświetla (na moim urządzeniu, do którego podłączony jest Arduino UNO):
Tutaj możesz łatwo znaleźć identyfikator urządzenia 0043 (UNO).
Ten plik jest w rzeczywistości linkiem do
/dev/ttyACM0
mojej skrzynki.źródło
Zawsze możesz wykonać jakiś wydruk identyfikatora poprzez serial in void setup (). Po podłączeniu określonej płyty wyśle ten identyfikator do interfejsu USB (którego słuchasz za pomocą jakiejś aplikacji demona na twoim Linux-ie). Po otrzymaniu identyfikatora możesz zamapować go na ścieżkę „Arduino1”: „/ dev / ttyACM0”, „Arduino2”: „/ dev / ttyACM1”, „Arduino3”: „/dev/ttyACM2” ... etc
Pamiętaj, że kiedy urządzenie zostanie odłączone z jakiegoś powodu, może zmienić swoją fizyczną ścieżkę, więc może być konieczne ponowne mapowanie wszystkich z nich. W tym przypadku dobrze byłoby napisać osobną funkcję np: get_id (), którą można wywołać w dowolnym momencie (nie tylko podczas uruchamiania).
źródło
Mógłbym pokusić się o identyfikację w inny sposób, na przykład o to, że sam szkic zareaguje na specjalne polecenie identyfikacji, aby uniknąć dziwnych sposobów identyfikowania urządzeń przez USB.
źródło
Przegląd
Jednym ze sposobów, jak wspomniano w odpowiedzi na ansi_lumen, jest flashowanie pamięci EEPROM ftdi w celu uzyskania unikalnego numeru seryjnego, który mógłby następnie zostać zidentyfikowany przez reguły UDEV.
Ale okazuje się, że nie będzie działać na tanich chińskich Arduinos, które zamiast FTDI mają układ CH340G, który nie ma pamięci EEPROM do przechowywania unikalnego identyfikatora ( CH340B powinien działać ).
Identyfikacja według portu
Tak więc najprostszym sposobem, jaki znalazłem, było użycie reguł UDEV i identyfikacja Arduinos według portu USB (devpath), więc połączenie Arduino z tym samym portem (nawet w zagnieżdżonych hubach USB) stworzy trwałą nazwę .
Konfiguracja TLDR:
Zmodyfikowana wersja tego
lsusb
Otrzymasz coś takiego:
Podłączając / odłączając Arduino znajdź, który to jest (mam 3 podłączone). Szukamy jego identyfikatora. W moim przypadku „... ID 1a86: 7523 QinHeng ...”. Więc idVendor = 1a86, idProduct = 7523
sudo nano /etc/udev/rules.d/99-usb-serial.rules
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="ttyUSB-arduino%s{/devpath}"
sudo udevadm control --reload
ls /dev/ttyUSB*
Co da wynik:
/dev/ttyUSB1 /dev/ttyUSB3 /dev/ttyUSB-arduino2.1 /dev/ttyUSB-arduino2.4 /dev/ttyUSB2 /dev/ttyUSB4 /dev/ttyUSB-arduino2.2 /dev/ttyUSB-arduino3
Jak widać, nadal otrzymujemy / dev / ttyUSBx jak poprzednio, które zawsze się zmieniają w zależności od tego, który z nich został podłączony jako pierwszy. Ale teraz mamy także / dev / ttyUSB-arduino {port}, które są zawsze takie same dla tego samego portu i tylko dla Arduinos. Aby przeanalizować, co oznacza „..arduino2.4”: 2 oznacza drugi port laptopa, a 4 - czwarty port koncentratora USB.
Aby lepiej to zobaczyć, wpisz:
Wynik:
Łącząc / rozłączając możesz zobaczyć, które urządzenia są na których portach
źródło