Sous Linux, comment identifier plusieurs Arduinos connectés via USB?

17

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)
vlad b.
la source
lsusb -vvvdit?
Ignacio Vazquez-Abrams
Pouvez-vous débrancher un et voir lequel disparaît?
Anonymous Penguin
1
Pas vraiment, je veux le faire pour un réseau de capteurs à distance solaire qui sera très loin pour que quelqu'un le fasse lors du redémarrage.
vlad b.
Ignacio Vasquez-Abrams - comment mapper les informations de lsusb -vvv vers / dev / ttyACM <x>? Y a-t-il quelque chose dans la sortie lsusb que je peux analyser? Merci pour l'idée!
vlad b.
Avez-vous un autre Arduino avec lequel vous pouvez comparer la sortie?
Ignacio Vazquez-Abrams

Réponses:

6

En supposant que votre distribution utilise udev:

udevadm info --query=all --name=/dev/ttyACM0

Vous pourriez avoir besoin des privilèges root pour exécuter ceci (sudo / su). Il affichera une liste d'informations comme celle-ci:

P: /devices/pci0000:00/0000:00:1d.2/usb4/4-2/4-2:1.0/tty/ttyACM0
N: ttyACM0
S: serial/by-id/usb-Dean_Camera_LUFA_USB-RS232_Adapter_74133353537351403012-if00
S: serial/by-path/pci-0000:00:1d.2-usb-0:2:1.0
E: DEVLINKS=/dev/serial/by-id/usb-Dean_Camera_LUFA_USB-RS232_Adapter_74133353537351403012-if00 /dev/serial/by-path/pci-0000:00:1d.2-usb-0:2:1.0
E: DEVNAME=/dev/ttyACM0
E: DEVPATH=/devices/pci0000:00/0000:00:1d.2/usb4/4-2/4-2:1.0/tty/ttyACM0
E: ID_BUS=usb
E: ID_MM_CANDIDATE=1
E: ID_MODEL=LUFA_USB-RS232_Adapter
E: ID_MODEL_ENC=LUFA\x20USB-RS232\x20Adapter
E: ID_MODEL_FROM_DATABASE=Uno R3 (CDC ACM)
E: ID_MODEL_ID=0043
E: ID_PATH=pci-0000:00:1d.2-usb-0:2:1.0
E: ID_PATH_TAG=pci-0000_00_1d_2-usb-0_2_1_0
E: ID_REVISION=0001
E: ID_SERIAL=Dean_Camera_LUFA_USB-RS232_Adapter_74133353537351403012
E: ID_SERIAL_SHORT=74133353537351403012
E: ID_TYPE=generic
E: ID_USB_DRIVER=cdc_acm
E: ID_USB_INTERFACES=:020201:0a0000:
E: ID_USB_INTERFACE_NUM=00
E: ID_VENDOR=Dean_Camera
E: ID_VENDOR_ENC=Dean\x20Camera
E: ID_VENDOR_FROM_DATABASE=Arduino SA
E: ID_VENDOR_ID=2341
E: MAJOR=166
E: MINOR=0
E: SUBSYSTEM=tty
E: UDEV_LOG=3
E: USEC_INITIALIZED=751387324986

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.

user2973
la source
Je vous remercie. J'utilise OpenWrt dans ce cas avec hotplug2 par défaut mais j'essaierai de passer à udev et de le tester.
vlad b.
5

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.

  1. Pour attribuer un alias à un périphérique USB-série, nous devons trouver des informations sur le périphérique
  2. Branchez l'USB. Cela suppose que vous avez déjà installé les pilotes pour cette utilisation be device et que le périphérique est visible lors de la frappe:

lsusb

  1. Nous allons avoir besoin des éléments suivants a. L'ID du vendeur b. L'identifiant du produit c. Le numéro de série de l'appareil
  2. Pour ce faire, il faut un peu de chasse. Tous vos appareils enregistrent les entrées dans '/ var / log / messages'.

Par conséquent, nous pouvons lire ce fichier et trouver le bon USB:

grep "ftdi" /var/log/messages

Vous pouvez également utiliser "usb"

  1. Voici tous les messages étiquetés avec ftdi:

  2. À 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:

dmesg | grep "usb 1-1.3"
  1. Cela nous donne toutes les informations dont nous avons besoin:

Alias ​​USB

  1. Maintenant, avec la liste des numéros de série en main, créons un ensemble de règles UDEV qui fera un joli lien symbolique pour chacun de ces appareils. Les règles UDEV sont généralement dispersées dans de nombreux fichiers dans /etc/udev/rules.d. Créez un nouveau fichier appelé 99-usb-serial.rules et insérez-y les lignes suivantes:

Dans cet exemple, mon alias s'appelle 'lcdbox'

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A601ERJJ", SYMLINK+="lcdbox"
  1. SYMLINK est le nom de votre alias. Dans ce cas, mon alias est lcdbox.
  2. Enregistrez le fichier et tapez

    sudo udevadm control --reload-rules

  3. Type

    ls –l / dev / lcdbox

lrwxrwxrwx 1 root root 7 1 janvier 1970 / dev / lcdbox -> ttyUSB0

  1. Cela montre que mon alias lcdbox est mappé sur ttyUSB0
PhillyNJ
la source
4

C'est assez simple! Vous devez personnaliser le firmware des puces ftdi et ajouter une règle udev:

Tout d'abord, obtenez ftdi_eepromvia apt-getou à partir des sources. Identifiez votre appareil via lsusb et obtenez l'identifiant:

lsusb

Bus 001 Périphérique 005: ID 0403: 6001 Future Technology Devices International, Ltd FT232 IC série (UART)
....

Préparer une config et assurez - vous que vendor_idet product_idcorrespondre. Personnalisez les chaînes de la Stringssection pour obtenir un identifiant unique pour votre appareil.

vendor_id = 0x0403 # ID fournisseur
product_id = 0x6001 # ID produit

max_power = 50 # Max. consommation électrique: valeur * 2 mA. Utilisez 0 si self_powered = true.

###########
# Cordes #
########### 
manufacturer = "FTDI" # Fabricant
product = "Arduino Nano" # Produit
serial = "arduino1" # Serial

###########
# Options #
###########
self_powered = false # Désactivez cette option pour le bus alimenté
remote_wakeup = false # Activez cette fonction pour la fonction de réveil à distance
use_serial = true # Utilisez la chaîne de numéro de série

# Normalement, il n'est pas nécessaire de changer l'un de ces drapeaux
# BM_type_chip = true # Les puces plus récentes sont toutes de type BM
in_is_isochronous = false # In Endpoint is Isochronous
out_is_isochronous = false # Le point de terminaison de sortie est isochrone
suspend_pull_downs = false # Activer les menus déroulants de suspension pour une puissance inférieure
change_usb_version = false # Changer la version USB
usb_version = 0x0200 # Uniquement utilisé lorsque change_usb_version est activé

########
# Misc #
########

filename = "eeprom.old" # Filename, laissez vide pour ignorer l'écriture du fichier
cbus0 = RXLED #
cbus1 = TXLED #

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 pendant flash-eepromle fichier est réécrit. Après la sauvegarde, flashez le ftdi:

ftdi_eeprom --flash-eeprom myconfig.conf

Maintenant, créez une règle udev, comme ça

SUBSYSTEMS=="usb", ATTRS{idProduct}=="6001", ATTRS{idVendor}=="0403", SYMLINK+="$attr{serial}", OWNER="bananapi", GROUP="pi", MODE="0777"

dans /etc/udev/rules.d/90-arduino-usb.ruleset udev restart.

service udev restart

Débranchez et rebranchez votre appareil et essayez

ls -lah /dev/arduino1

arduino1est la chaîne définie serialci-dessous .conf.

Voir aussi: Risques de ftdi_eeprom? - TX toujours élevé après clignotement

ansi_lumen
la source
3

J'aurais utilisé un script pour créer un alias sous /dev/et également défini le groupe et les droits avec udevcomme les autres réponses.

Mais si je n'en avais pas, udevje me jetterais lsusbsur grepou awk, comme lsusb|grep -e "idProduct".

Quoi qu'il en soit, avec des udevrègles ou avec lsusbet greppour identifier les périphériques USB, l' utilisation idVendor, idProductet iSerialen Device descriptorpartie de lsusbfaire le bon idenification. Le idVendorvous indique que le idProductfabricant 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, le iSerialdoit être un identifiant unique pour chaque exemple de ce produit.

Anders
la source
3

Sur Ubuntu 16.04 (et peut-être les versions précédentes ou d'autres distributions aussi), vous pouvez faire:

> ls /dev/serial/by-id

qui affiche (sur ma box où un Arduino UNO est connecté):

usb-Arduino__www.arduino.cc__0043_A4139363931351318241-if00

Vous pouvez facilement repérer l'ID de périphérique 0043 (UNO) ici.

Ce fichier est en fait un lien vers /dev/ttyACM0dans ma boîte.

jfpoilpret
la source
2

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).

cyber-cerveau
la source
1

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.

EternityForest
la source
0

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 ).

  • Cette réponse suggère d'écrire la règle UDEV avec un script spécial qui demande à Arduino d'envoyer son ID unique via série. Le problème est que vous devez modifier le croquis Arduino et en général c'est assez complexe.

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

  1. Trouvez Arduino idVendor et idProduct:

lsusb

Vous obtiendrez quelque chose comme ceci:

...
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 124: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 003 Device 123: ID 214b:7000  
Bus 003 Device 122: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 003 Device 121: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 003 Device 120: ID 1a40:0101 Terminus Technology Inc. Hub
...

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

  1. Créez un nouveau fichier de règles UDEV:

sudo nano /etc/udev/rules.d/99-usb-serial.rules

  1. Modifiez les valeurs idVendor et idProduct par ce que vous avez trouvé à l'étape précédente lors de la copie, collez-le dans le fichier de règles que nous avons créé:

SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="ttyUSB-arduino%s{/devpath}"

  1. Recharger les règles UDEV

sudo udevadm control --reload

  1. Rebranchez Arduinos et maintenant il aura un nom unique. Pour le tester, tapez:

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:

lsusb -t

Production:

...
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 480M
    |__ Port 1: Dev 5, If 0, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 1: Dev 5, If 1, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 2: Dev 84, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 1: Dev 85, If 0, Class=Vendor Specific Class, Driver=ch341, 12M
        |__ Port 2: Dev 86, If 0, Class=Vendor Specific Class, Driver=ch341, 12M
        |__ Port 3: Dev 87, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 4: Dev 88, If 0, Class=Vendor Specific Class, Driver=ch341, 12M
    |__ Port 3: Dev 89, If 0, Class=Vendor Specific Class, Driver=ch341, 12M
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/6p, 480M
...

En vous connectant / déconnectant, vous pouvez voir quels appareils se trouvent sur quels ports

Gintaras Grėbliūnas
la source