Wenn ich mehrere Arduinos über USB an einen Linux-Computer angeschlossen habe, werden sie als angezeigt
- / tty / ACM0
- / tty / ACM1
- / tty / ACM2
Wie kann ich feststellen, welches Arduino welches ist, ohne eine Verbindung über eine serielle Verbindung herzustellen ? Gibt es eine Seriennummer oder eine eindeutige ID auf dem Arduino?
Vielen Dank für Ihre Zeit.
Situation: Uno R3, Mega, Leonardo mit / ttyACM [1,2,3]
lsusb-Ausgabe mit Geräten in der oben angegebenen Reihenfolge:
... Bus 001 Gerät 011: ID 2341: 0043 Bus 001 Gerät 013: ID 2341: 8036 ... Bus 001 Gerät 014: ID 2341: 0042
lsusb -d Anbieter: Gerät -vvv zeigt für jeden
Uno
Bus 001 Gerät 014: ID 2341: 0042 Gerätebeschreibung: bLänge 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 2-Kommunikation bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 8 idVendor 0x2341 idProduct 0x0042 bcdDevice 0.01 iManufacturer 1 Arduino (www.arduino.cc) iProduct 2 iSerial 220 55330313735351910141 bAnzahlKonfigurationen 1 Konfigurationsdeskriptor: bLänge 9 bDescriptorType 2 Gesamtlänge 62 bNumInterfaces 2 bKonfigurationswert 1 iConfiguration 0 bmAttributes 0xc0 Selbstversorgt MaxPower 100mA Schnittstellendeskriptor: bLänge 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bAnzahlEndpunkte 1 bInterfaceClass 2-Kommunikation bInterfaceSubClass 2 Abstract (Modem) bInterfaceProtocol 1 AT-Befehle (v.25ter) iInterface 0 CDC-Header: bcdCDC 10.01 CDC ACM: bmCapabilities 0x06 Sendet Pause Leitungscodierung und serieller Zustand CDC Union: bMasterInterface 0 bSlaveInterface 1 Endpunkt-Deskriptor: bLänge 7 bDescriptorType 5 bEndpointAddress 0x82 EP 2 IN bmAttributes 3 Übertragungstyp Interrupt Synchronisationstyp Keine Verwendungsart Daten wMaxPacketSize 0x0008 1x 8 Bytes bIntervall 255 Schnittstellendeskriptor: bLänge 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 0 bAnzahlEndpunkte 2 bInterfaceClass 10 CDC-Daten bInterfaceSubClass 0 Nicht verwendet bInterfaceProtocol 0 iInterface 0 Endpunkt-Deskriptor: bLänge 7 bDescriptorType 5 bEndpointAddress 0x04 EP 4 OUT bmAttributes 2 Übertragungsart Bulk Synchronisationstyp Keine Verwendungsart Daten wMaxPacketSize 0x0040 1x 64 Bytes bIntervall 1 Endpunkt-Deskriptor: bLänge 7 bDescriptorType 5 bEndpointAddress 0x83 EP 3 IN bmAttributes 2 Übertragungsart Bulk Synchronisationstyp Keine Verwendungsart Daten wMaxPacketSize 0x0040 1x 64 Bytes bIntervall 1 Gerätestatus: 0x0000 (Bus Powered)
Leonardo:
Bus 001 Gerät 013: ID 2341: 8036 Gerätebeschreibung: bLänge 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 0 (auf Schnittstellenebene definiert) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x2341 idProduct 0x8036 bcdDevice 1.00 iManufacturer 1 Arduino LLC iProduct 2 Arduino Leonardo iSerial 0 bAnzahlKonfigurationen 1 Konfigurationsdeskriptor: bLänge 9 bDescriptorType 2 wTotalLength 100 bNumInterfaces 3 bKonfigurationswert 1 iConfiguration 0 bmAttributes 0x80 (Bus Powered) MaxPower 500mA Schnittstellenzuordnung: bLänge 8 bDescriptorType 11 bErste Schnittstelle 0 bInterfaceCount 2 bFunktionsklasse 2 Kommunikation bFunctionSubClass 2 Zusammenfassung (Modem) bFunctionProtocol 1 AT-Befehle (v.25ter) iFunktion 0 Schnittstellendeskriptor: bLänge 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bAnzahlEndpunkte 1 bInterfaceClass 2-Kommunikation bInterfaceSubClass 2 Abstract (Modem) bInterfaceProtocol 0 Keine iInterface 0 CDC-Header: bcdCDC 1.10 CDC-Anrufverwaltung: bmCapabilities 0x01 Anrufverwaltung bDataInterface 1 CDC ACM: bmCapabilities 0x06 Sendet Pause Leitungscodierung und serieller Zustand CDC Union: bMasterInterface 0 bSlaveInterface 1 Endpunkt-Deskriptor: bLänge 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Übertragungstyp Interrupt Synchronisationstyp Keine Verwendungsart Daten wMaxPacketSize 0x0040 1x 64 Bytes bIntervall 0 Endpunkt-Deskriptor: bLänge 7 bDescriptorType 5 bEndpointAddress 0x83 EP 3 IN bmAttributes 2 Übertragungsart Bulk Synchronisationstyp Keine Verwendungsart Daten wMaxPacketSize 0x0040 1x 64 Bytes bIntervall 0 Schnittstellendeskriptor: bLänge 9 bDescriptorType 4 bInterfaceNumber 2 bAlternateSetting 0 bAnzahlEndpunkte 1 bInterfaceClass 3 Human Interface Device bInterfaceSubClass 0 Keine Unterklasse bInterfaceProtocol 0 Keine iInterface 0 HID Device Descriptor: bLänge 9 bDescriptorType 33 bcdHID 1.01 bCountryCode 0 Wird nicht unterstützt bNumDescriptors 1 bDescriptorType 34-Bericht wDescriptorLength 101 Berichtsdeskriptor: (Länge ist 101) Objekt (global): Nutzungsseite, Daten = [0x01] 1 Allgemeine Desktop-Steuerelemente Objekt (lokal): Verwendung, Daten = [0x02] 2 Maus Gegenstand (Haupt): Sammlung, Daten = [0x01] 1 Anwendung Objekt (lokal): Verwendung, Daten = [0x01] 1 Zeiger Gegenstand (Haupt): Sammlung, Daten = [0x00] 0 Körperlich Element (global): Berichts-ID, Daten = [0x01] 1 Item (Global): Usage Page, data = [0x09] 9 Tasten Element (lokal): Verwendungsminimum, Daten = [0x01] 1 Taste 1 (primär) Objekt (lokal): Nutzungsmaximum, Daten = [0x03] 3 Knopf 3 (Tertiär) Element (global): Logisches Minimum, Daten = [0x00] 0 Element (global): Logisches Maximum, Daten = [0x01] 1 Element (global): Berichtsanzahl, Daten = [0x03] 3 Element (global): Berichtsgröße, Daten = [0x01] 1 Gegenstand (Haupt): Eingang, Daten = [0x02] 2 Datenvariable Absolut No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Element (global): Berichtsanzahl, Daten = [0x01] 1 Element (global): Berichtsgröße, Daten = [0x05] 5 Gegenstand (Haupt): Eingang, Daten = [0x03] 3 Konstante Variable Absolut No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Objekt (global): Nutzungsseite, Daten = [0x01] 1 Allgemeine Desktop-Steuerelemente Element (lokal): Verwendung, Daten = [0x30] 48 Richtung-X Element (lokal): Verwendung, Daten = [0x31] 49 Richtung-Y Element (lokal): Verwendung, Daten = [0x38] 56 Rad Element (global): Logisches Minimum, Daten = [0x81] 129 Element (global): Logisches Maximum, Daten = [0x7f] 127 Element (global): Berichtsgröße, Daten = [0x08] 8 Element (global): Berichtsanzahl, Daten = [0x03] 3 Punkt (Haupt): Eingang, Daten = [0x06] 6 Datenvariable Relativ No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Gegenstand (Haupt): Sammlung beenden, Daten = keine Gegenstand (Haupt): Sammlung beenden, Daten = keine ...... Endpunkt-Deskriptor: bLänge 7 bDescriptorType 5 bEndpointAddress 0x84 EP 4 IN bmAttributes 3 Übertragungstyp Interrupt Synchronisationstyp Keine Verwendungsart Daten wMaxPacketSize 0x0040 1x 64 Bytes bIntervall 1 Gerätestatus: 0x0000 (Bus Powered)
Und Mega256:
Bus 001 Gerät 014: ID 2341: 0042 Gerätebeschreibung: bLänge 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 2-Kommunikation bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 8 idVendor 0x2341 idProduct 0x0042 bcdDevice 0.01 iManufacturer 1 Arduino (www.arduino.cc) iProduct 2 iSerial 220 55330313735351910141 bAnzahlKonfigurationen 1 Konfigurationsdeskriptor: bLänge 9 bDescriptorType 2 Gesamtlänge 62 bNumInterfaces 2 bKonfigurationswert 1 iConfiguration 0 bmAttributes 0xc0 Selbstversorgt MaxPower 100mA Schnittstellendeskriptor: bLänge 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bAnzahlEndpunkte 1 bInterfaceClass 2-Kommunikation bInterfaceSubClass 2 Abstract (Modem) bInterfaceProtocol 1 AT-Befehle (v.25ter) iInterface 0 CDC-Header: bcdCDC 10.01 CDC ACM: bmCapabilities 0x06 Sendet Pause Leitungscodierung und serieller Zustand CDC Union: bMasterInterface 0 bSlaveInterface 1 Endpunkt-Deskriptor: bLänge 7 bDescriptorType 5 bEndpointAddress 0x82 EP 2 IN bmAttributes 3 Übertragungstyp Interrupt Synchronisationstyp Keine Verwendungsart Daten wMaxPacketSize 0x0008 1x 8 Bytes bIntervall 255 Schnittstellendeskriptor: bLänge 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 0 bAnzahlEndpunkte 2 bInterfaceClass 10 CDC-Daten bInterfaceSubClass 0 Nicht verwendet bInterfaceProtocol 0 iInterface 0 Endpunkt-Deskriptor: bLänge 7 bDescriptorType 5 bEndpointAddress 0x04 EP 4 OUT bmAttributes 2 Übertragungsart Bulk Synchronisationstyp Keine Verwendungsart Daten wMaxPacketSize 0x0040 1x 64 Bytes bIntervall 1 Endpunkt-Deskriptor: bLänge 7 bDescriptorType 5 bEndpointAddress 0x83 EP 3 IN bmAttributes 2 Übertragungsart Bulk Synchronisationstyp Keine Verwendungsart Daten wMaxPacketSize 0x0040 1x 64 Bytes bIntervall 1 Gerätestatus: 0x0000 (Bus Powered)
lsusb -vvv
sagt?Antworten:
Angenommen, Ihre Distribution verwendet
udev
:Möglicherweise benötigen Sie Root-Rechte, um dies auszuführen (sudo / su). Es wird eine Liste mit Informationen wie die folgende ausgegeben:
Dies ist für ein Uno mit geänderter Firmware auf dem atmega16u2 (USB zu Seriell). Die Linien von Interesse sind wahrscheinlich ID_MODEL_ID und ID_MODEL_FROM_DATABASE.
quelle
Sie können für jedes einen Alias hinzufügen. Dann weißt du was was ist. Hier ist ein nettes Tutorial, wie man das einrichtet.
Hier ist ein Ausschnitt, den ich basierend auf dem Tutorial geschrieben habe. Im folgenden Beispiel verwende ich einen FTDI RS232RL USB to Serial-Adapter, von dem ich glaube, dass er auch vom Arduino verwendet wird.
lsusb
Daher können wir diese Datei lesen und den richtigen USB finden:
Sie können auch "USB" verwenden
Hier finden Sie alle mit ftdi getaggten Nachrichten:
Neben ftdi_sio steht eine Zahl wie 1-1.2. Dies ist das USB-Gerät
grep "usb 1-1.2" /var/log/messages
Oder Sie können verwenden:
In diesem Beispiel heißt mein Alias 'lcdbox'
Speichern Sie die Datei und geben Sie sie ein
sudo udevadm control --reload-rules
Art
ls –l / dev / lcdbox
lrwxrwxrwx 1 root root 7. Januar 1970 / dev / lcdbox -> ttyUSB0
quelle
Das ist ganz einfach! Sie müssen die Firmware des ftdi-Chips anpassen und eine udev-Regel hinzufügen:
Holen Sie sich zunächst
ftdi_eeprom
überapt-get
oder aus den Quellen. Identifizieren Sie Ihr Gerät über lsusb und erhalten Sie die ID:Bereiten Sie eine Konfiguration und stellen Sie sicher, dass
vendor_id
und anzeigenproduct_id
lassen. Passen Sie die Zeichenfolgen imStrings
Abschnitt an, um eine eindeutige ID für Ihr Gerät zu erhalten.Sichern Sie sich die aktuelle ftdi-Firmware:
ftdi_eeprom --read-eprom
Dieser Befehl erstellt
${pwd}/eeprom.old
, welcher die aktuelle Firmware auf dem ftdi enthält. Sichern Sie diese Datei, bevor Sie fortfahren , da sie währendflash-eeprom
der Datei neu geschrieben wird. Flashen Sie nach dem Backup die ftdi:Erstellen Sie nun wie folgt eine udev-Regel
in
/etc/udev/rules.d/90-arduino-usb.rules
und starten Sie udev neu.Trennen Sie das Gerät vom Stromnetz und schließen Sie es erneut an
Wo
arduino1
ist die Zeichenfolge unter definiertenserial
in der oben.conf
.Siehe auch: Risiken von ftdi_eeprom? - TX nach dem Blinken immer hoch
quelle
Ich hätte ein Skript verwendet, um einen Alias unter zu erstellen
/dev/
undudev
wie bei den anderen Antworten auch Gruppe und Rechte darauf festzulegen.Aber wenn ich nicht hätte,
udev
würde ichlsusb
ingrep
oderawk
wie pfeifenlsusb|grep -e "idProduct"
.Wie auch immer, mit
udev
Regeln oder mitlsusb
undgrep
USB - Geräten, die Verwendung zu identifizierenidVendor
,idProduct
undiSerial
inDevice descriptor
Teillsusb
zu der richtigen idenification zu machen. DasidVendor
sagt Ihnen der Hersteller,idProduct
sollte das Produkt vom Hersteller identifizieren, aber manchmal verwenden sie die gleiche Produkt-ID für mehr als ein Produkt. SchließlichiSerial
sollte bei Bedarf eine eindeutige ID für jedes Beispiel dieses Produkts angegeben werden.quelle
Unter Ubuntu 16.04 (und möglicherweise auch früheren Versionen oder anderen Distributionen) können Sie Folgendes tun:
welches Display (auf meiner Box, an der ein Arduino UNO angeschlossen ist):
Sie können die Geräte-ID 0043 (UNO) hier leicht erkennen.
Diese Datei ist eigentlich ein Link zu
/dev/ttyACM0
meiner Box.quelle
Sie können in void setup () immer eine Art ID-Druck über die serielle Schnittstelle erstellen. Nachdem das bestimmte Board angeschlossen ist, sendet es diese ID an Ihre USB-Schnittstelle (die Sie mit einer Art Daemon-App auf Ihrer Linux-Box hören). Sobald Sie die ID erhalten haben, können Sie sie dem Pfad 'Arduino1' zuordnen: '/ dev / ttyACM0', 'Arduino2': '/ dev / ttyACM1', 'Arduino3': '/dev/ttyACM2' ... etc
Beachten Sie, dass das Gerät den physischen Pfad ändern kann, wenn es aus irgendeinem Grund getrennt wird, sodass Sie möglicherweise alle neu zuordnen müssen. In diesem Fall kann es sinnvoll sein, die Funktion ex: get_id () zu schreiben, die Sie jederzeit aufrufen können (nicht nur beim Start).
quelle
Ich wäre in der Versuchung, mich auf eine andere Art zu identifizieren, zum Beispiel, wenn die Skizze selbst auf einen speziellen Identifizierungsbefehl reagiert, nur um die ungewöhnlichen Möglichkeiten von USB zu vermeiden, Geräte zu identifizieren.
quelle