Identifier à quoi /dev/ est un périphérique USB connecté
-
20-12-2019 - |
Question
J'aimerais écrire un programme Ruby pour OSX qui communique via USB avec mon Arduino.Je vais utiliser la gemme port série à cette fin.
J'ai trouvé un exemple de code qui dit :
port_str = "/dev/ttyUSB0" #may be different for you
Comment puis-je scanner et trouver l'Arduino, et savoir à quel port je dois me connecter automatiquement ?(J'ai OSX) Merci!
La solution
Cela peut être difficile à réaliser de manière générale, car les périphériques Arduino apparaissent comme des ports série USB, ce qui rend difficile la distinction entre les ports Arduino et non Arduino.
L'approche par force brute est la suivante :énumérez les périphériques série USB, open() chacun à son tour et voyez si l'en-tête de démarrage de votre micrologiciel est envoyé à l'autre extrémité.Sous OSX, les périphériques série USB se trouvent dans /dev/tty.*, mais cela peut changer avec les futures mises à jour du système d'exploitation.Cette méthode fonctionne, mais peut être lente et sensible au timing.J'ai trouvé qu'un délai de démarrage sur l'Arduino avant l'envoi d'un en-tête aide, ainsi qu'un simple "Bonjour êtes-vous là?" commande que l'hôte peut utiliser pour détecter des signes de vie.
En outre, vous pouvez enregistrer le dernier port trouvé afin que les lancements ultérieurs d'applications essaient d'abord ce port.
Une variante :si votre application demande à l'utilisateur de brancher l'Arduino au démarrage, vous pouvez lister les ports USB dans /dev, attendre que l'utilisateur confirme qu'il est branché et lister à nouveau les ports.Tout appareil nouvellement apparu est probablement votre Arduino.
Au niveau suivant, vous pouvez consulter les identifiants du fournisseur et du produit USB (VID et PID).Cependant, ces identifiants sont partout sur la carte au pays Arduino.Ils diffèrent par le modèle, la version, la révision, les clones chinois et les différents appareils compatibles Arduino.Regarde ça article sur Adafruit.
Si vous essayez simplement de faire fonctionner les choses avec un ensemble matériel très restreint (par ex.celui Arduino sur votre banc), vous pouvez utiliser cette commande OSX pour voir les détails du périphérique USB :
system_profiler SPUSBDataType
Avec mon système, j'obtiens :
...
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
L'ID d'emplacement (0x3d100000/2) semble correspondre au nom de l'appareil : /dev/cu.usbmodem3d11
Voir cette question pour exécuter des commandes de ligne de commande à partir d'un script Ruby.