¿Cómo conectar con el Micro Maestro sin conocer exactamente su identificador puerto serie?

Causa del problema

Por defecto, el controlador Micro Maestro se asocia con /dev/ttyACM0, pero a veces, es posible que tras una caída de tensión brusca (generalmente provocada por un cambio de sentido instantáneo en los servomotores), la placa se reinicie ocurriendo lo siguiente: al reiniciarse, /dev/ttyACM0 deja de responder durante unos instantes y se vuelve a activar. Cuando esto sucede, como /dev/ttyACM0 está ya asociado con un dispositivo (aunque no esté respondiendo), Ubuntu identifica al Micro Maestro ya reiniciado con /dev/ttyACM2. Sin embargo, ya todos los programas nos devolverán un error, puesto que en la librería maestro.py se hace referencia a /dev/ttyACM0.

¿Cómo se soluciona?

Para no tener este error, vamos a usar una especie de "alias" para dispositivos. Son las llamadas udev rules. Para ello, lo primero que debemos hacer es conocer algunos atributos de nuestra placa, como el ID del vendedor (idVendor) y el ID del producto (idProduct), que nos aparecerán tras ejecutar el comando
udevadm info --name=/dev/ttyACM0 --attribute-walk.
Importante: como podréis deducir, todas las placas Micro Maestro tendrán los mismos ID de vendedor e ID de producto, por lo que si tenemos varias placas iguales y las queremos distinguir, tendremos que usar un atributo más específico, como es el número de serie (único para cada dispositivo).

Una vez hayamos identificado los dos valores mencionados, modificamos con sudo el fichero /etc/udev/rules.d/99-com.rules y añadimos las siguientes líneas:

KERNEL=="ttyACM0", ATTRS{idVendor}=="1ffb", ATTRS{idProduct}=="0089", SYMLINK+="maestro"
KERNEL=="ttyACM2", ATTRS{idVendor}=="1ffb", ATTRS{idProduct}=="0089", SYMLINK+="maestro"

En nuestro caso, el ID de Pololu es "1ffb" y, en concreto, el de la placa Micro Maestro es el "0089". Además, hemos decidido poner como alias la palabra "maestro". Es importante añadir las líneas en este orden, puesto que, por defecto, el Micro Maestro se conecta a /dev/ttyACM0. Si este no responde (a causa de un reinicio), /dev/maestro hará referencia a /dev/ttyACM2 (si es que se ha vuelto a iniciar).

Para que las reglas (udev rules) se actualicen, ejecutamos el siguiente comando:
sudo udevadm trigger

Ahora, podéis comprobar lo que ocurre cuando introducís el comando ls -l /dev/maestro y, efectivamente, /dev/maestro apunta a /dev/ttyACM0.

Por último, ahora debemos cambiar la librería maestro.py para que tampoco se vea afectada por el cambio de identificador del puerto serie. Es decir, todas las referencias hechas a /dev/ttyACM0 deberemos sustituirlas por /dev/maestro.