Si j'ai plusieurs Arduinos connectés via USB à un ordinateur Linux, et ils apparaissent comme
- / tty / ACM0
- / tty / ACM1
- / tty / ACM2
Comment puis-je identifier quel Arduino est lequel sans me connecter via une connexion série ? Y a-t-il un numéro de série ou un identifiant unique sur l'Arduino?
Merci pour votre temps.
Situation: Uno R3, Mega, Leonardo avec / ttyACM [1,2,3]
Sortie lsusb avec des périphériques dans l'ordre mentionné ci-dessus:
... Bus 001 Périphérique 011: ID 2341: 0043 Bus 001 Périphérique 013: ID 2341: 8036 ... Bus 001 Périphérique 014: ID 2341: 0042
lsusb -d vendor: périphérique -vvv s'affiche pour chacun
Uno
Bus 001 Périphérique 014: ID 2341: 0042 Descripteur de périphérique: bLongueur 18 bDescriptorType 1 bcdUSB 1.10 Communications avec bDeviceClass 2 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 Descripteur de configuration: bLongueur 9 bDescriptorType 2 wTotalLength 62 bNumInterfaces 2 bConfigurationValue 1 iConfiguration 0 bmAttributes 0xc0 Auto-alimenté MaxPower 100mA Descripteur d'interface: bLongueur 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 2 Communications Résumé bInterfaceSubClass 2 (modem) Commandes AT bInterfaceProtocol 1 (v.25ter) iInterface 0 En-tête CDC: bcdCDC 10.01 CDC ACM: bmCapabilities 0x06 envoie une pause codage de ligne et état série Union CDC: bMasterInterface 0 bSlaveInterface 1 Descripteur de point final: bLongueur 7 bDescriptorType 5 bEndpointAddress 0x82 EP 2 IN bmAttributes 3 Type de transfert interrompu Type de synchronisation Aucun Données de type d'utilisation wMaxPacketSize 0x0008 1x 8 octets bInterval 255 Descripteur d'interface: bLongueur 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 10 CDC Data bInterfaceSubClass 0 Inutilisé bInterfaceProtocol 0 iInterface 0 Descripteur de point final: bLongueur 7 bDescriptorType 5 bEndpointAddress 0x04 EP 4 OUT bmAttributes 2 Type de transfert en vrac Type de synchronisation Aucun Données de type d'utilisation wMaxPacketSize 0x0040 1x 64 octets bIntervalle 1 Descripteur de point final: bLongueur 7 bDescriptorType 5 bEndpointAddress 0x83 EP 3 IN bmAttributes 2 Type de transfert en vrac Type de synchronisation Aucun Données de type d'utilisation wMaxPacketSize 0x0040 1x 64 octets bIntervalle 1 État du périphérique: 0x0000 (Alimenté par bus)
Leonardo:
Bus 001 Périphérique 013: ID 2341: 8036 Descripteur de périphérique: bLongueur 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 0 (défini au niveau de l'interface) 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 Descripteur de configuration: bLongueur 9 bDescriptorType 2 wTotalLength 100 bNumInterfaces 3 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Alimenté par bus) MaxPower 500mA Association d'interface: bLongueur 8 bDescriptorType 11 bFirstInterface 0 bInterfaceCount 2 Communications bFunctionClass 2 Résumé de bFunctionSubClass 2 (modem) Commandes bFunctionProtocol 1 AT (v.25ter) iFunction 0 Descripteur d'interface: bLongueur 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 2 Communications Résumé bInterfaceSubClass 2 (modem) bInterfaceProtocol 0 Aucun iInterface 0 En-tête CDC: bcdCDC 1.10 Gestion des appels CDC: bmCapabilities 0x01 gestion des appels bDataInterface 1 CDC ACM: bmCapabilities 0x06 envoie une pause codage de ligne et état série Union CDC: bMasterInterface 0 bSlaveInterface 1 Descripteur de point final: bLongueur 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Type de transfert interrompu Type de synchronisation Aucun Données de type d'utilisation wMaxPacketSize 0x0040 1x 64 octets bInterval 0 Descripteur de point final: bLongueur 7 bDescriptorType 5 bEndpointAddress 0x83 EP 3 IN bmAttributes 2 Type de transfert en vrac Type de synchronisation Aucun Données de type d'utilisation wMaxPacketSize 0x0040 1x 64 octets bInterval 0 Descripteur d'interface: bLongueur 9 bDescriptorType 4 bInterfaceNumber 2 bAlternateSetting 0 bNumEndpoints 1 Périphérique d'interface humaine bInterfaceClass 3 bInterfaceSubClass 0 Aucune sous-classe bInterfaceProtocol 0 Aucun iInterface 0 Descripteur de périphérique HID: bLongueur 9 bDescriptorType 33 bcdHID 1.01 bCountryCode 0 Non pris en charge bNumDescriptors 1 Rapport bDescriptorType 34 wDescriptorLength 101 Descripteur de rapport: (la longueur est de 101) Élément (global): page d'utilisation, données = [0x01] 1 Commandes de bureau génériques Élément (local): utilisation, données = [0x02] 2 Souris Élément (principal): collection, données = [0x01] 1 Application Élément (local): utilisation, données = [0x01] 1 Aiguille Élément (principal): collection, données = [0x00] 0 Physique Élément (global): ID de rapport, données = [0x01] 1 Élément (global): page d'utilisation, données = [0x09] 9 Boutons Élément (local): utilisation minimale, données = [0x01] 1 Bouton 1 (principal) Élément (local): utilisation maximale, données = [0x03] 3 Bouton 3 (tertiaire) Élément (global): minimum logique, données = [0x00] 0 Élément (global): maximum logique, données = [0x01] 1 Élément (global): nombre de rapports, données = [0x03] 3 Élément (global): taille du rapport, données = [0x01] 1 Élément (principal): entrée, données = [0x02] 2 Variable de données absolue No_Wrap linéaire Preferred_State No_Null_Position Champ de bits non volatil Élément (global): nombre de rapports, données = [0x01] 1 Élément (global): taille du rapport, données = [0x05] 5 Élément (principal): entrée, données = [0x03] 3 Variable constante absolue No_Wrap linéaire Preferred_State No_Null_Position Champ de bits non volatil Élément (global): page d'utilisation, données = [0x01] 1 Commandes de bureau génériques Élément (local): utilisation, données = [0x30] 48 Direction-X Élément (local): utilisation, données = [0x31] 49 Direction-Y Élément (local): utilisation, données = [0x38] 56 Roue Élément (global): minimum logique, données = [0x81] 129 Élément (global): maximum logique, données = [0x7f] 127 Élément (global): taille du rapport, données = [0x08] 8 Élément (global): nombre de rapports, données = [0x03] 3 Élément (principal): entrée, données = [0x06] 6 Variable de données relative No_Wrap linéaire Preferred_State No_Null_Position Champ de bits non volatil Article (principal): Fin de la collecte, données = aucune Article (principal): Fin de la collecte, données = aucune ...... Descripteur de point final: bLongueur 7 bDescriptorType 5 bEndpointAddress 0x84 EP 4 IN bmAttributes 3 Type de transfert interrompu Type de synchronisation Aucun Données de type d'utilisation wMaxPacketSize 0x0040 1x 64 octets bIntervalle 1 État du périphérique: 0x0000 (Alimenté par bus)
Et Mega256:
Bus 001 Périphérique 014: ID 2341: 0042 Descripteur de périphérique: bLongueur 18 bDescriptorType 1 bcdUSB 1.10 Communications avec bDeviceClass 2 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 Descripteur de configuration: bLongueur 9 bDescriptorType 2 wTotalLength 62 bNumInterfaces 2 bConfigurationValue 1 iConfiguration 0 bmAttributes 0xc0 Auto-alimenté MaxPower 100mA Descripteur d'interface: bLongueur 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 2 Communications Résumé bInterfaceSubClass 2 (modem) Commandes AT bInterfaceProtocol 1 (v.25ter) iInterface 0 En-tête CDC: bcdCDC 10.01 CDC ACM: bmCapabilities 0x06 envoie une pause codage de ligne et état série Union CDC: bMasterInterface 0 bSlaveInterface 1 Descripteur de point final: bLongueur 7 bDescriptorType 5 bEndpointAddress 0x82 EP 2 IN bmAttributes 3 Type de transfert interrompu Type de synchronisation Aucun Données de type d'utilisation wMaxPacketSize 0x0008 1x 8 octets bInterval 255 Descripteur d'interface: bLongueur 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 10 CDC Data bInterfaceSubClass 0 Inutilisé bInterfaceProtocol 0 iInterface 0 Descripteur de point final: bLongueur 7 bDescriptorType 5 bEndpointAddress 0x04 EP 4 OUT bmAttributes 2 Type de transfert en vrac Type de synchronisation Aucun Données de type d'utilisation wMaxPacketSize 0x0040 1x 64 octets bIntervalle 1 Descripteur de point final: bLongueur 7 bDescriptorType 5 bEndpointAddress 0x83 EP 3 IN bmAttributes 2 Type de transfert en vrac Type de synchronisation Aucun Données de type d'utilisation wMaxPacketSize 0x0040 1x 64 octets bIntervalle 1 État du périphérique: 0x0000 (Alimenté par bus)
lsusb -vvv
dit?Réponses:
En supposant que votre distribution utilise
udev
:Vous pourriez avoir besoin des privilèges root pour exécuter ceci (sudo / su). Il affichera une liste d'informations comme celle-ci:
Il s'agit d'un Uno avec un firmware modifié sur l'atmega16u2 (USB vers série). Les lignes d'intérêt sont probablement ID_MODEL_ID et ID_MODEL_FROM_DATABASE.
la source
Vous pouvez ajouter un alias pour chacun. Vous savez alors qui est lequel. Voici un joli tutoriel sur la façon de configurer cela.
Voici un extrait que j'ai écrit sur la base du tutoriel. Dans l'exemple ci-dessous, j'utilise un adaptateur USB vers série FTDI RS232RL, qui, je crois, est également utilisé par l'Arduino.
lsusb
Par conséquent, nous pouvons lire ce fichier et trouver le bon USB:
Vous pouvez également utiliser "usb"
Voici tous les messages étiquetés avec ftdi:
À côté de ftdi_sio, il y a un nombre comme 1-1.2. Ceci est le périphérique USB
grep "usb 1-1.2" /var/log/messages
Ou vous pouvez utiliser:
Dans cet exemple, mon alias s'appelle 'lcdbox'
Enregistrez le fichier et tapez
sudo udevadm control --reload-rules
Type
ls –l / dev / lcdbox
lrwxrwxrwx 1 root root 7 1 janvier 1970 / dev / lcdbox -> ttyUSB0
la source
C'est assez simple! Vous devez personnaliser le firmware des puces ftdi et ajouter une règle udev:
Tout d'abord, obtenez
ftdi_eeprom
viaapt-get
ou à partir des sources. Identifiez votre appareil via lsusb et obtenez l'identifiant:Préparer une config et assurez - vous que
vendor_id
etproduct_id
correspondre. Personnalisez les chaînes de laStrings
section pour obtenir un identifiant unique pour votre appareil.Vider le firmware ftdi actuel:
ftdi_eeprom --read-eprom
Cette commande crée
${pwd}/eeprom.old
, qui contient le firmware actuel sur le ftdi. Sauvegardez ce fichier avant de continuer , car pendantflash-eeprom
le fichier est réécrit. Après la sauvegarde, flashez le ftdi:Maintenant, créez une règle udev, comme ça
dans
/etc/udev/rules.d/90-arduino-usb.rules
et udev restart.Débranchez et rebranchez votre appareil et essayez
Où
arduino1
est la chaîne définieserial
ci-dessous.conf
.Voir aussi: Risques de ftdi_eeprom? - TX toujours élevé après clignotement
la source
J'aurais utilisé un script pour créer un alias sous
/dev/
et également défini le groupe et les droits avecudev
comme les autres réponses.Mais si je n'en avais pas,
udev
je me jetteraislsusb
surgrep
ouawk
, commelsusb|grep -e "idProduct"
.Quoi qu'il en soit, avec des
udev
règles ou aveclsusb
etgrep
pour identifier les périphériques USB, l' utilisationidVendor
,idProduct
etiSerial
enDevice descriptor
partie delsusb
faire le bon idenification. LeidVendor
vous indique que leidProduct
fabricant doit identifier le produit auprès du fabricant, mais il utilise parfois le même identifiant de produit pour plusieurs produits. Enfin, si nécessaire, leiSerial
doit être un identifiant unique pour chaque exemple de ce produit.la source
Sur Ubuntu 16.04 (et peut-être les versions précédentes ou d'autres distributions aussi), vous pouvez faire:
qui affiche (sur ma box où un Arduino UNO est connecté):
Vous pouvez facilement repérer l'ID de périphérique 0043 (UNO) ici.
Ce fichier est en fait un lien vers
/dev/ttyACM0
dans ma boîte.la source
Vous pouvez toujours faire une sorte d'impression d'identité via série dans la configuration void (). Une fois la carte connectée, il enverra cet identifiant à votre interface USB (que vous écoutez avec une sorte d'application démon sur votre box Linux). Une fois que vous recevez l'identifiant, vous pouvez le mapper sur son chemin 'Arduino1': '/ dev / ttyACM0', 'Arduino2': '/ dev / ttyACM1', 'Arduino3': '/dev/ttyACM2'...etc
Sachez que lorsque l'appareil est déconnecté pour une raison quelconque, il peut changer son chemin physique, vous devrez donc peut-être les remapper tous. Dans ce cas, il peut être utile d'écrire une fonction distincte ex: get_id () que vous pouvez appeler à tout moment (pas seulement au démarrage).
la source
Je serais très tenté d'identifier une autre manière, comme faire en sorte que le croquis lui-même réponde à une commande d'identification spéciale, juste pour éviter les façons étranges de l'USB d'identifier les périphériques.
la source
Aperçu
Une façon, comme ansi_lumen l'a mentionné dans sa réponse, est de flasher la puce EEPROM ftdi pour avoir un numéro de série unique qui pourrait ensuite être identifié par les règles UDEV.
Mais il s'avère que cela ne fonctionnera pas sur les Arduinos chinois bon marché qui, au lieu de FTDI, ont une puce CH340G qui n'a pas d'EEPROM pour stocker l'ID unique ( CH340B devrait fonctionner ).
Identification par port
Donc, le moyen le plus simple que j'ai trouvé était d'utiliser les règles UDEV et d'identifier les Arduinos par le port USB (devpath) afin de connecter Arduino au même port (même dans les concentrateurs USB imbriqués) créera un nom persistant .
Configuration TLDR:
Version modifiée de cette
lsusb
Vous obtiendrez quelque chose comme ceci:
En connectant / déconnectant Arduino, trouvez-en un (j'en ai 3 connectés). Nous recherchons son identifiant. Dans mon cas "... ID 1a86: 7523 QinHeng ...". Donc 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*
Qui produira:
/dev/ttyUSB1 /dev/ttyUSB3 /dev/ttyUSB-arduino2.1 /dev/ttyUSB-arduino2.4 /dev/ttyUSB2 /dev/ttyUSB4 /dev/ttyUSB-arduino2.2 /dev/ttyUSB-arduino3
Comme vous pouvez le voir, nous obtenons toujours / dev / ttyUSBx comme avant, qui changent toujours en fonction de celui qui a été connecté en premier. Mais maintenant, nous avons également / dev / ttyUSB-arduino {port} qui sont toujours les mêmes pour le même port et uniquement pour Arduinos. Pour analyser ce que "..arduino2.4" signifie: 2 se réfère au deuxième port de l'ordinateur portable et 4 au quatrième port du concentrateur USB.
Pour mieux le voir, tapez:
Production:
En vous connectant / déconnectant, vous pouvez voir quels appareils se trouvent sur quels ports
la source