Tengo un Arduino que a veces se une /dev/ttyUSB0
y otras veces /dev/ttyUSB1
, lo que hace que mi script falle.
No quiero enumerar todas las posibilidades de dónde podría estar mi dispositivo, sino que preferiría que esté vinculado a un lugar estático, por ejemplo /dev/arduino
.
¿Cómo lo logro?
linux
arch-linux
usb
serial-port
arduino
k0pernikus
fuente
fuente
Respuestas:
Como se sugiere, puede agregar algunas reglas de udev. Edité el
/etc/udev/rules.d/10-local.rules
para contener:Puede verificar las variables de su dispositivo ejecutando
Hay una guía más detallada que puede leer en http://www.reactivated.net/writing_udev_rules.html
fuente
udevam
? Y es importante tener en cuenta quemy_uart
crea el enlace simbólico debajo/dev/my_uart
. Escribí por/dev/arduino
primera vez la primera vez y falló mientrasarduino
es suficiente.udevadm
debería salir por sí solo cuando esté hecho.La sintaxis de la regla anterior puede funcionar en algunas distribuciones, pero no funcionó en la mía (Raspbian). Como nunca encontré un solo documento que explica todos los entresijos, escribí el mío, que se encuentra aquí . Esto es a lo que se reduce.
1. descubre lo que hay en ttyUSB:
2. enumere todos los atributos del dispositivo:
(con su (s) número (s) de dispositivo en lugar de x, por supuesto). Elija un conjunto de identificadores únicos, por ejemplo, idVendor + idProduct. También puede necesitar SerialNumber si tiene más de un dispositivo con el mismo idVendor e idProduct. Los números de serie deben ser únicos para cada dispositivo.
3. Cree un archivo
/etc/udev/rules.d/99-usb-serial.rules
con algo como esta línea:(suponiendo que no necesita un número de serie allí y, por supuesto, con los números de idVendor e idProduct que encontró en el paso 2.
4. Cargue la nueva regla:
5. Verifique lo que sucedió:
mostrará a qué número ttyUSB fue el enlace simbólico. Si es así
/dev/ttyUSB1
, verifique quién es el propietario y a qué grupo pertenece:Entonces solo por el gusto de hacerlo:
fuente
idVendor
yidProduct
son exactamente iguales? (dos sensores conectados en un modelo idéntico de USB a módulos UART)udevadm info --name=/dev/ttyUSB1 --attribute-walk
ambos dispositivos y busque los números de serie, deben ser únicos para cada dispositivo. Si sus sensores no tienen número de serie, ¿puede especificar cuáles son?El problema de múltiples dispositivos USB idénticos
Tengo un Rasperry Pi con cuatro cámaras. Tomo pix con las
fswebcam
que se identifican las cámaras como/dev/video0
..video3
. A veces, la cámara esvideo0
,vide02
,video4
yvideo6
pero puede olvidarse de eso por ahora.Necesito una identificación persistente para identificar un número de cámara para que, por ejemplo,
video0
sea siempre la misma cámara porque subtitulo las imágenes. Desafortunadamente, esto no sucede de manera confiable: en el arranque, las cámaras se enumeran comovideo0
...video3
pero no siempre de la misma manera.Todas las cámaras tienen la misma identificación y número de serie.
La solución a este problema involucra las reglas de udev, pero también hay muchos anzuelos allí.
Si emite el comando
obtienes una regla de salida, pero los bits más destacados son
El bit KERNELS es un puerto concentrador USB. Con cuatro cámaras hay cuatro de estas: no cambian al reiniciar, pero las
video{x}
asociadas con un puerto pueden cambiar.Por lo tanto, necesitamos una regla udev para vincular un número de video a un puerto concentrador USB, algo como:
Parece simple: acceda a la cámara con
Excepto que no funciona: si coloca esto en una regla udev y el sistema ha asignado video0 (en el arranque) a un puerto diferente, la regla udev se ignora. El enlace simbólico a
/dev/camera0
básicamente diceno such device
. Un cuadrado.Lo que queremos es vincular un enlace simbólico a una dirección de concentrador USB, no un
video{x}
número. Tomó un programa de Python.El primer paso fue correr
para
x
entre 1 y 8. La existencia detst.jpg
después de cada llamada identifica si hay una cámara en este número de video. A partir de esto, haga una lista de números de video activos. Mi experiencia ha sido que es0,1,2,3
o0,2,4,6
para las cámaras que he usado.Otros, por supuesto, pueden construir esta lista utilizando un proceso diferente.
Luego, para cada número de video en la lista,
y extraer el
KERNELS= line
dedd
. De este proceso, termina con una lista de las direcciones de puerto USB para las cámaras. Ordene esta lista para que en el siguiente paso, siempre la procese en el mismo orden. Llame a esto la "lista de direcciones".Ejecute la
udevadm … > dd
cosa nuevamente y haga una lista que se vea comoAhora recorra la lista de direcciones: para cada entrada, busque la entrada correspondiente en la lista de videos. Cree una nueva lista que se parezca a una colección de líneas como
La x (número de enlace simbólico) se reemplaza por el número de secuencia en la lista de direcciones.
Ahora tienes una regla de udev que funciona. Un enlace simbólico vinculado a una dirección de concentrador USB, sin importar el número de video asignado a ese puerto en el arranque.
Escribe la lista final en un archivo
/etc/udev/rules.d/cam.rules
. Ejecuteudevadm trigger
para activarlo y el trabajo está hecho./dev/camera2
será la misma cámara (puerto USB) independientemente de su número de video.fuente
También pude encontrar un dispositivo único en
/dev/serial/by-id
. Todavía no he intentado reiniciar, pero los archivos en ese directorio eran solo enlaces al archivo de dispositivo apropiado (ttyACM[0-9]
).Estoy ejecutando Arch Linux en Raspberry Pi, pero me topé con ellos simplemente haciendo un
find
nombre de archivo que contiene "Arduino". Mis programas de Python funcionan bien usando esos archivos como dispositivos para leer / escribir datos en / desde mis Arduinos (hasta ahora, dos en una sola Pi).fuente
Solo para decir que lo anterior funcionó para mí y también montó automáticamente el dispositivo para mí después de haber colocado una entrada en / etc / fstab (y también llama a umount después de quitar el dispositivo)
es decir
/ etc / fstab
cat /etc/udev/rules.d/5-usb-stick.rules
Entonces, después de insertar mi memoria USB obtengo:
fuente