Règle UDEV
Sous linux, lors de la connexion de l'Arduino, un périphérique de la forme /dev/ttyACMXX est créé où XX est un incrément.
Ce périphérique représente le canal de communication avec l'Arduino. Le nom de celui-ci n'est pas prédictible car à chaque connexion, l'incrément augmente et il est donc difficile d'avoir un fichier de configuration stable.
udev est en charge de nommer les périphériques au boot ou au branchement à chaud. En lui spécifiant une règle de nommage, le nom sera fixe et vaudra : /dev/ttyArduino.
Pour se faire, créer un fichier /etc/udev/rules.d/10-tty-acm.rules :
- /etc/udev/rules.d/10-tty-acm.rules
# arduino SUBSYSTEMS=="usb", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="0001", SYMLINK+="ttyArduino"
Pour déterminer le nom du périphérique actuel, il faut scruter les logs du noyau au branche de l'Arduino :
sudo dmesg| grep ttyACM [ 7.037499] cdc_acm 1-2.1:1.0: ttyACM0: USB ACM device
Ici, le périphérique est /dev/ttyACM0.
Les valeurs idVendor et idProduct sont récupérées via la commande udevadm info sur le device /dev/ttyACM0.
sudo udevadm info -a -n /dev/ttyACM0
[...]
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2.1':
KERNELS=="1-2.1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{authorized}=="1"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{bConfigurationValue}=="1"
ATTRS{bDeviceClass}=="02"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bMaxPacketSize0}=="8"
ATTRS{bMaxPower}=="100mA"
ATTRS{bNumConfigurations}=="1"
ATTRS{bNumInterfaces}==" 2"
ATTRS{bcdDevice}=="0001"
ATTRS{bmAttributes}=="c0"
ATTRS{busnum}=="1"
ATTRS{configuration}==""
ATTRS{devnum}=="5"
ATTRS{devpath}=="2.1"
ATTRS{idProduct}=="0001"
ATTRS{idVendor}=="2341"
ATTRS{ltm_capable}=="no"
ATTRS{manufacturer}=="Arduino (www.arduino.cc)"
ATTRS{maxchild}=="0"
ATTRS{product}=="Arduino Uno"
ATTRS{quirks}=="0x0"
ATTRS{removable}=="unknown"
ATTRS{serial}=="64935343633351317262"
ATTRS{speed}=="12"
ATTRS{urbnum}=="179883"
ATTRS{version}==" 1.10"
[...]
Si nécessaire, il est possible d'ajouter des attributs supplémentaires comme serial à la règle pour qu'elle soit plus précise, dans le cas de 2 Arduino par exemple.
Recharger les règles udev :
udevadm control --reload-rules
et rebrancher l'Arduino, désormais un lien symbolique /dev/ttyArduino est lié au périphérique /dev/ttyACMXX :
ls -l /dev/ttyArduino lrwxrwxrwx 1 root root 7 Aug 8 18:37 /dev/ttyArduino -> ttyACM1