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