Identifizieren, an was /dev/ ein USB-Gerät angeschlossen ist
-
20-12-2019 - |
Frage
Ich möchte ein Ruby-Programm für OSX schreiben, das über USB mit meinem Arduino kommuniziert.Zu diesem Zweck werde ich das Serialport-Gem verwenden.
Ich habe einen Beispielcode gefunden, der besagt:
port_str = "/dev/ttyUSB0" #may be different for you
Wie kann ich das Arduino scannen und finden und automatisch wissen, mit welchem Port ich mich verbinden soll?(Ich habe OSX) Danke!
Lösung
Dies kann im Allgemeinen schwierig zu bewerkstelligen sein, da Arduino-Geräte als serielle USB-Anschlüsse erscheinen, was es schwierig macht, zwischen Arduino- und Nicht-Arduino-Anschlüssen zu unterscheiden.
Der Brute-Force-Ansatz ist:Listen Sie die seriellen USB-Geräte auf, öffnen Sie sie nacheinander und prüfen Sie, ob Ihr Firmware-Boot-Header am anderen Ende gesendet wird.Unter OSX befinden sich die seriellen USB-Geräte unter /dev/tty.*, aber das kann sich mit zukünftigen Betriebssystem-Updates ändern.Diese Methode funktioniert, kann jedoch langsam und zeitkritisch sein.Ich habe festgestellt, dass eine Startverzögerung auf dem Arduino vor dem Senden eines Headers hilfreich ist, ebenso wie ein einfaches „Hallo bist du da?„Befehl, mit dem der Wirt nach Lebenszeichen suchen kann.
Außerdem können Sie den zuletzt gefundenen Port speichern, sodass nachfolgende App-Starts diesen Port zuerst ausprobieren.
Eine Variante:Wenn Ihre App den Benutzer beim Start auffordert, das Arduino anzuschließen, können Sie die USB-Anschlüsse in /dev auflisten, warten, bis der Benutzer bestätigt, dass es angeschlossen ist, und die Anschlüsse erneut auflisten.Bei jedem neu erscheinenden Gerät handelt es sich wahrscheinlich um Ihr Arduino.
Auf der nächsten Ebene können Sie sich die USB-Anbieter- und Produkt-IDs (VID und PID) ansehen.Allerdings sind diese IDs im Arduino-Land allgegenwärtig.Sie unterscheiden sich je nach Modell, Version, Revision, chinesischen Klonen und den verschiedenen Arduino-kompatiblen Geräten.Sieh dir das an Artikel bei Adafruit.
Wenn Sie nur versuchen, die Dinge mit einem sehr begrenzten Hardwaresatz zum Laufen zu bringen (z. B.(das eine Arduino auf Ihrer Werkbank), können Sie diesen OSX-Befehl verwenden, um die Details des USB-Geräts anzuzeigen:
system_profiler SPUSBDataType
Mit meinem System erhalte ich:
...
USB Bus:
Host Controller Location: Built-in USB
Host Controller Driver: AppleUSBUHCI
PCI Device ID: 0x7fff000027c9
PCI Revision ID: 0x7fff00000002
PCI Vendor ID: 0x7fff00008086
Bus Number: 0x3d
Communication Device:
Product ID: 0x0043
Vendor ID: 0x2341
Version: 0.01
Serial Number: 75331313133351800000
Speed: Up to 12 Mb/sec
Manufacturer: Arduino (www.arduino.cc)
Location ID: 0x3d100000 / 2
Current Available (mA): 500
Current Required (mA): 100
Die Standort-ID (0x3d100000/2) scheint mit dem Gerätenamen übereinzustimmen: /dev/cu.usbmodem3d11
Sehen diese Frage zum Ausführen von Befehlszeilenbefehlen aus einem Ruby-Skript heraus.