En Linux, ¿cómo identificar múltiples Arduinos conectados a través de USB?


17

Si tengo varios Arduinos conectados por USB a una computadora Linux, y aparecen como

  • / tty / ACM0
  • / tty / ACM1
  • / tty / ACM2

¿Cómo puedo identificar qué Arduino es cuál sin conectarme a ellos mediante una conexión en serie ? ¿Hay un número de serie o una identificación única en el Arduino?

Gracias por tu tiempo.

Situación: Uno R3, Mega, Leonardo con / ttyACM [1,2,3]

Salida lsusb con dispositivos en el orden mencionado anteriormente:

...
Bus 001 Dispositivo 011: ID 2341: 0043
Bus 001 Dispositivo 013: ID 2341: 8036
...
Bus 001 Dispositivo 014: ID 2341: 0042

lsusb -d vendor: dispositivo -vvv muestra para cada uno

Uno

Bus 001 Dispositivo 014: ID 2341: 0042
Descriptor de dispositivo:
  bLongitud 18
  bDescriptorType 1
  bcdUSB 1.10
  bDeviceClass 2 Communications
  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
  Descriptor de configuración:
    bLongitud 9
    bDescriptorType 2
    wTotalLength 62
    bNumInterfaces 2
    bConfigurationValue 1
    iConfiguration 0
    bmAttributes 0xc0
      Autoalimentado
    MaxPower 100mA
    Descriptor de interfaz:
      bLongitud 9
      bDescriptorType 4
      bInterfaceNumber 0
      bAlternateSetting 0
      bNumEndpoints 1
      bInterfaceClass 2 Communications
      bInterfaceSubClass 2 Abstract (módem)
      bInterfaceProtocol 1 Comandos AT (v.25ter)
      iInterface 0
      Encabezado de CDC:
        bcdCDC 10.01
      CDC ACM:
        bmCapabilities 0x06
          envía descanso
          codificación de línea y estado serial
      Unión de los CDC:
        bMasterInterface 0
        bSlaveInterface 1
      Descriptor de punto final:
        bLongitud 7
        bDescriptorType 5
        bEndpointAddress 0x82 EP 2 IN
        bmAttributes 3
          Tipo de transferencia interrupción
          Tipo de sincronización Ninguno
          Datos de tipo de uso
        wMaxPacketSize 0x0008 1x 8 bytes
        bIntervalo 255
    Descriptor de interfaz:
      bLongitud 9
      bDescriptorType 4
      bInterfaceNumber 1
      bAlternateSetting 0
      bNumEndpoints 2
      bInterfaceClass 10 CDC Data
      bInterfaceSubClass 0 sin usar
      bInterfaceProtocol 0
      iInterface 0
      Descriptor de punto final:
        bLongitud 7
        bDescriptorType 5
        bEndpointAddress 0x04 EP 4 OUT
        bmAttributes 2
          Tipo de transferencia a granel
          Tipo de sincronización Ninguno
          Datos de tipo de uso
        wMaxPacketSize 0x0040 1x 64 bytes
        bIntervalo 1
      Descriptor de punto final:
        bLongitud 7
        bDescriptorType 5
        bEndpointAddress 0x83 EP 3 IN
        bmAttributes 2
          Tipo de transferencia a granel
          Tipo de sincronización Ninguno
          Datos de tipo de uso
        wMaxPacketSize 0x0040 1x 64 bytes
        bIntervalo 1
Estado del dispositivo: 0x0000
  (Bus alimentado)

Leonardo

Bus 001 Dispositivo 013: ID 2341: 8036
Descriptor de dispositivo:
  bLongitud 18
  bDescriptorType 1
  bcdUSB 2.00
  bDeviceClass 0 (definido en el nivel de interfaz)
  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
  Descriptor de configuración:
    bLongitud 9
    bDescriptorType 2
    wTotalLength 100
    bNumInterfaces 3
    bConfigurationValue 1
    iConfiguration 0
    bmAttributes 0x80
      (Bus alimentado)
    MaxPower 500mA
    Asociación de interfaz:
      bLongitud 8
      bDescriptorType 11
      bFirstInterface 0
      bInterfaceCount 2
      bFunctionClass 2 Communications
      bFunctionSubClass 2 Abstract (módem)
      bFunctionProtocol 1 comandos AT (v.25ter)
      iFunction 0
    Descriptor de interfaz:
      bLongitud 9
      bDescriptorType 4
      bInterfaceNumber 0
      bAlternateSetting 0
      bNumEndpoints 1
      bInterfaceClass 2 Communications
      bInterfaceSubClass 2 Abstract (módem)
      bInterfaceProtocol 0 Ninguno
      iInterface 0
      Encabezado de CDC:
        bcdCDC 1.10
      Gestión de llamadas de los CDC:
        bmCapabilities 0x01
          gestión de llamadas
        bDataInterface 1
      CDC ACM:
        bmCapabilities 0x06
          envía descanso
          codificación de línea y estado serial
      Unión de los CDC:
        bMasterInterface 0
        bSlaveInterface 1
      Descriptor de punto final:
        bLongitud 7
        bDescriptorType 5
        bEndpointAddress 0x81 EP 1 IN
        bmAttributes 3
          Tipo de transferencia interrupción
          Tipo de sincronización Ninguno
          Datos de tipo de uso
        wMaxPacketSize 0x0040 1x 64 bytes
        bIntervalo 0
      Descriptor de punto final:
        bLongitud 7
        bDescriptorType 5
        bEndpointAddress 0x83 EP 3 IN
        bmAttributes 2
          Tipo de transferencia a granel
          Tipo de sincronización Ninguno
          Datos de tipo de uso
        wMaxPacketSize 0x0040 1x 64 bytes
        bIntervalo 0
    Descriptor de interfaz:
      bLongitud 9
      bDescriptorType 4
      bInterfaceNumber 2
      bAlternateSetting 0
      bNumEndpoints 1
      Dispositivo de interfaz humana bInterfaceClass 3
      bInterfaceSubClass 0 Sin subclase
      bInterfaceProtocol 0 Ninguno
      iInterface 0
        Descriptor de dispositivo HID:
          bLongitud 9
          bDescriptorType 33
          bcdHID 1.01
          bCountryCode 0 No compatible
          bNumDescriptors 1
          Informe bDescriptorType 34
          wDescriptorLength 101
          Descriptor de informe: (la longitud es 101)
            Elemento (global): página de uso, datos = [0x01] 1
                            Controles de escritorio genéricos
            Elemento (local): uso, datos = [0x02] 2
                            Ratón
            Elemento (Principal): Colección, datos = [0x01] 1
                            Solicitud
            Elemento (local): uso, datos = [0x01] 1
                            Puntero
            Elemento (Principal): Colección, datos = [0x00] 0
                            Físico
            Elemento (Global): ID de informe, datos = [0x01] 1
            Elemento (global): página de uso, datos = [0x09] 9
                            Botones
            Elemento (local): Uso mínimo, datos = [0x01] 1
                            Botón 1 (primario)
            Elemento (local): uso máximo, datos = [0x03] 3
                            Botón 3 (terciario)
            Elemento (Global): Mínimo lógico, datos = [0x00] 0
            Elemento (Global): Máximo lógico, datos = [0x01] 1
            Elemento (Global): Recuento de informes, datos = [0x03] 3
            Elemento (Global): Tamaño del informe, datos = [0x01] 1
            Elemento (Principal): Entrada, datos = [0x02] 2
                            Datos Variable Absoluta No_Wrap Lineal
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Elemento (Global): Recuento de informes, datos = [0x01] 1
            Elemento (Global): Tamaño del informe, datos = [0x05] 5
            Elemento (Principal): Entrada, datos = [0x03] 3
                            Constante Variable Absoluta No_Wrap Lineal
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Elemento (global): página de uso, datos = [0x01] 1
                            Controles de escritorio genéricos
            Elemento (local): uso, datos = [0x30] 48
                            Dirección-X
            Elemento (local): uso, datos = [0x31] 49
                            Dirección-Y
            Elemento (local): uso, datos = [0x38] 56
                            Rueda
            Elemento (Global): Mínimo lógico, datos = [0x81] 129
            Elemento (Global): Máximo lógico, datos = [0x7f] 127
            Elemento (Global): Tamaño del informe, datos = [0x08] 8
            Elemento (Global): Recuento de informes, datos = [0x03] 3
            Elemento (Principal): Entrada, datos = [0x06] 6
                            Datos Variable Relativo No_Envoltura Lineal
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Elemento (Principal): Finalizar colección, datos = ninguno
            Elemento (Principal): Finalizar colección, datos = ninguno

            ......

      Descriptor de punto final:
        bLongitud 7
        bDescriptorType 5
        bEndpointAddress 0x84 EP 4 IN
        bmAttributes 3
          Tipo de transferencia interrupción
          Tipo de sincronización Ninguno
          Datos de tipo de uso
        wMaxPacketSize 0x0040 1x 64 bytes
        bIntervalo 1
Estado del dispositivo: 0x0000
  (Bus alimentado)

Y Mega256:

Bus 001 Dispositivo 014: ID 2341: 0042
Descriptor de dispositivo:
  bLongitud 18
  bDescriptorType 1
  bcdUSB 1.10
  bDeviceClass 2 Communications
  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
  Descriptor de configuración:
    bLongitud 9
    bDescriptorType 2
    wTotalLength 62
    bNumInterfaces 2
    bConfigurationValue 1
    iConfiguration 0
    bmAttributes 0xc0
      Autoalimentado
    MaxPower 100mA
    Descriptor de interfaz:
      bLongitud 9
      bDescriptorType 4
      bInterfaceNumber 0
      bAlternateSetting 0
      bNumEndpoints 1
      bInterfaceClass 2 Communications
      bInterfaceSubClass 2 Abstract (módem)
      bInterfaceProtocol 1 Comandos AT (v.25ter)
      iInterface 0
      Encabezado de CDC:
        bcdCDC 10.01
      CDC ACM:
        bmCapabilities 0x06
          envía descanso
          codificación de línea y estado serial
      Unión de los CDC:
        bMasterInterface 0
        bSlaveInterface 1
      Descriptor de punto final:
        bLongitud 7
        bDescriptorType 5
        bEndpointAddress 0x82 EP 2 IN
        bmAttributes 3
          Tipo de transferencia interrupción
          Tipo de sincronización Ninguno
          Datos de tipo de uso
        wMaxPacketSize 0x0008 1x 8 bytes
        bIntervalo 255
    Descriptor de interfaz:
      bLongitud 9
      bDescriptorType 4
      bInterfaceNumber 1
      bAlternateSetting 0
      bNumEndpoints 2
      bInterfaceClass 10 CDC Data
      bInterfaceSubClass 0 sin usar
      bInterfaceProtocol 0
      iInterface 0
      Descriptor de punto final:
        bLongitud 7
        bDescriptorType 5
        bEndpointAddress 0x04 EP 4 OUT
        bmAttributes 2
          Tipo de transferencia a granel
          Tipo de sincronización Ninguno
          Datos de tipo de uso
        wMaxPacketSize 0x0040 1x 64 bytes
        bIntervalo 1
      Descriptor de punto final:
        bLongitud 7
        bDescriptorType 5
        bEndpointAddress 0x83 EP 3 IN
        bmAttributes 2
          Tipo de transferencia a granel
          Tipo de sincronización Ninguno
          Datos de tipo de uso
        wMaxPacketSize 0x0040 1x 64 bytes
        bIntervalo 1
Estado del dispositivo: 0x0000
  (Bus alimentado)

lsusb -vvv¿dice?
Ignacio Vazquez-Abrams

¿Puedes desconectar uno y ver cuál desaparece?
Anonymous Penguin

1
En realidad no, quiero hacer esto para un conjunto de sensores remotos alimentados por energía solar que estará muy lejos para que alguien lo haga cuando se reinicie.
vlad b.

Ignacio Vasquez-Abrams: ¿cómo puedo asignar la información de lsusb -vvv a / dev / ttyACM <x>? ¿Hay algo en la salida de lsusb que pueda analizar? ¡Gracias por la idea!
vlad b.

¿Tiene otro Arduino con el que pueda comparar la salida?
Ignacio Vazquez-Abrams

Respuestas:


6

Suponiendo que su distribución esté usando udev:

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

Es posible que necesite privilegios de root para ejecutar esto (sudo / su). Producirá una lista de información como esta:

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

Esto es para un Uno con firmware modificado en el atmega16u2 (usb a serial). Las líneas de interés son probablemente ID_MODEL_ID e ID_MODEL_FROM_DATABASE.


Gracias. Estoy usando OpenWrt en este caso con hotplug2 por defecto, pero intentaré cambiar a udev y probar esto.
vlad b.

5

Puede agregar un alias para cada uno. Entonces sabes cuál es cuál. Aquí hay un buen tutorial sobre cómo configurar esto.

Aquí hay un fragmento que escribí basado en el tutorial. En el ejemplo a continuación, estoy usando un adaptador USB a serie FTDI RS232RL, que creo que es el que usa también el Arduino.

  1. Para asignar un alias a un dispositivo serie USB, necesitamos encontrar información sobre el dispositivo
  2. Enchufa el usb. Esto supone que ya instaló los controladores para este uso en dispositivo y el dispositivo es visible al escribir:

lsusb

  1. Vamos a necesitar lo siguiente a. La identificación del vendedor b. La identificación del producto c. El número de serie del dispositivo.
  2. Para hacer esto, se necesita un poco de caza. Todos sus dispositivos registran entradas en '/ var / log / messages'.

Por lo tanto, podemos leer este archivo y encontrar el USB correcto:

grep "ftdi" /var/log/messages

También puedes usar "usb"

  1. Esto es encontrar todos los mensajes etiquetados con ftdi:

  2. Junto a ftdi_sio, hay un número como 1-1.2. Este es el dispositivo USB

grep "usb 1-1.2" /var/log/messages

O puedes usar:

dmesg | grep "usb 1-1.3"
  1. Esto nos da toda la información que necesitamos:

Alias ​​USB

  1. Ahora con la lista de números de serie en la mano, creemos un conjunto de reglas UDEV que haga un buen enlace simbólico para cada uno de estos dispositivos. Las reglas UDEV generalmente están dispersas en muchos archivos en /etc/udev/rules.d. Cree un nuevo archivo llamado 99-usb-serial.rules y coloque las siguientes líneas allí:

En este ejemplo, mi alias se llama 'lcdbox'

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A601ERJJ", SYMLINK+="lcdbox"
  1. SYMLINK es el nombre de su alias. En este caso mi alias es lcdbox.
  2. Guarde el archivo y escriba

    control de sudo udevadm --reload-rules

  3. Tipo

    ls –l / dev / lcdbox

lrwxrwxrwx 1 root root 7 1 de enero de 1970 / dev / lcdbox -> ttyUSB0

  1. Esto muestra que mi alias lcdbox está asignado a ttyUSB0

4

¡Esto es bastante fácil! Debe personalizar el firmware de los chips ftdi y agregar una regla udev:

Primero, obtenga a ftdi_eepromtravés de apt-geto desde las fuentes. Identifique su dispositivo a través de lsusb y obtenga la identificación:

lsusb

Bus 001 Dispositivo 005: ID 0403: 6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC
....

Preparar una configuración y asegúrese de que vendor_ide product_idigualar. Personaliza las cadenas en elStrings sección para obtener una identificación única para su dispositivo.

vendor_id = 0x0403 # ID del proveedor
product_id = 0x6001 # ID del producto

max_power = 50 # Máx. consumo de energía: valor * 2 mA. Use 0 si self_powered = true.

###########
# Cuerdas #
########### 
fabricante = "FTDI" # Fabricante
producto = "Arduino Nano" # Producto
serial = "arduino1" # Serie

###########
# Opciones #
###########
self_powered = false # Apague esto para el bus alimentado
remote_wakeup = false # Active esto para la función de activación remota
use_serial = true # Use la cadena del número de serie

# Normalmente fuera no tiene que cambiar una de estas banderas
# BM_type_chip = true # Las fichas más nuevas son todas de tipo BM
in_is_isochronous = false # In Endpoint is Isochronous
out_is_isochronous = false # El punto final de salida es isócrono
suspend_pull_downs = false # Habilita las suspensiones desplegables para reducir la potencia
change_usb_version = false # Cambiar versión de USB
usb_version = 0x0200 # Solo se usa cuando change_usb_version está habilitado

########
# Varios #
########

filename = "eeprom.old" # Nombre de archivo, deje en blanco para omitir la escritura del archivo
cbus0 = RXLED #
cbus1 = TXLED #

Volcar el firmware actual de ftdi:

ftdi_eeprom --read-eprom

Este comando crea ${pwd}/eeprom.old, que contiene el firmware actual en el ftdi. Haga una copia de seguridad de este archivo antes de continuar , porque durante flash-eepromel archivo se reescribe. Después de la copia de seguridad, muestre el ftdi:

ftdi_eeprom --flash-eeprom myconfig.conf

Ahora, crea una regla de udev, así

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

en /etc/udev/rules.d/90-arduino-usb.rulesy reiniciar udev.

service udev restart

Desenchufe y vuelva a enchufar su dispositivo e intente

ls -lah /dev/arduino1

¿Dónde arduino1está la cadena definida debajo serialen lo anterior .conf?

Ver también: ¿ Riesgos de ftdi_eeprom? - TX siempre alto después de parpadear


3

Habría usado un script para crear un alias /dev/y también establecer un grupo y derechos con udevlas mismas respuestas.

Pero si no tiene udevlo haría tubería lsusben grepo awk, como lsusb|grep -e "idProduct".

De todos modos, con udevreglas o con lsusby greppara identificar dispositivos USB, use idVendor, idProducty iSerialen Device descriptorparte lsusbpara hacer la identificación adecuada. El idVendorle indica que el idProductfabricante debe identificar el producto del fabricante, pero a veces usan la misma identificación de producto para más de un producto. Por último, si es necesario, iSerialdebe ser una identificación única para cada ejemplo de ese producto.


3

En Ubuntu 16.04 (y tal vez versiones anteriores u otras distribuciones también), puede hacer:

> ls /dev/serial/by-id

que muestra (en mi caja donde está conectado un Arduino UNO):

usb-Arduino__www.arduino.cc__0043_A4139363931351318241-if00

Puede detectar fácilmente la ID de dispositivo 0043 (UNO) aquí.

Este archivo es en realidad un enlace a /dev/ttyACM0mi caja.


2

Siempre puede hacer algún tipo de impresión de identificación a través de serie en la configuración nula (). Después de que se conecte cierta placa, enviará esta identificación a su interfaz USB (que está escuchando con algún tipo de aplicación daemon en su caja de Linux). Una vez que reciba la identificación, puede asignarla a su ruta 'Arduino1': '/ dev / ttyACM0', 'Arduino2': '/ dev / ttyACM1', 'Arduino3': '/dev/ttyACM2'...etc

Tenga en cuenta que cuando el dispositivo se desconecta por alguna razón, puede cambiar su ruta física, por lo que es posible que tenga que reasignarlos todos. Para este caso, podría ser bueno escribir una función separada, por ejemplo: get_id (), a la que puede llamar en cualquier momento (no solo en el inicio).


1

Me sentiría muy tentado a identificar de alguna otra manera, como hacer que el boceto responda a un comando de identificación especial, solo para evitar las formas extrañas de USB de identificar dispositivos.


0

Visión general

  • Una forma como ansi_lumen mencionó en su respuesta es flashear la EEPROM del chip ftdi para tener un número de serie único que luego podría identificarse mediante las reglas UDEV.

    Pero resulta que no funcionará en Arduinos chinos baratos que, en lugar de FTDI, tienen un chip CH340G que no tiene EEPROM para almacenar una identificación única ( CH340B debería funcionar ).

  • Esta respuesta sugiere escribir una regla UDEV con un script especial que le pide a Arduino que envíe su ID única por serie. El problema con eso es que necesita modificar el boceto de Arduino y, en general, es bastante complejo.

Identificando por puerto

Entonces, la forma más fácil que encontré fue usar reglas UDEV e identificar Arduinos por el puerto usb (devpath) para que conectar Arduino al mismo puerto (incluso en hubs usb anidados) cree un nombre persistente .

Configuración TLDR:

Versión modificada de esto

  1. Encuentra Arduino idVendor e idProduct:

lsusb

Obtendrás algo como esto:

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

Al conectar / desconectar Arduino, encuentre cuál es (tengo 3 conectados). Estamos buscando su identificación. En mi caso "... ID 1a86: 7523 QinHeng ...". Entonces idVendor = 1a86, idProduct = 7523

  1. Cree un nuevo archivo de reglas UDEV:

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

  1. Modifique los valores idVendor e idProduct según lo que encontró en el paso anterior al copiar y pegarlo en el archivo de reglas que hemos creado:

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

  1. Recargar las reglas de UDEV

sudo udevadm control --reload

  1. Vuelva a conectar Arduinos y ahora tendrá un nombre único. Para probarlo escriba:

ls /dev/ttyUSB*


Lo que dará salida:

/dev/ttyUSB1 /dev/ttyUSB3 /dev/ttyUSB-arduino2.1 /dev/ttyUSB-arduino2.4 /dev/ttyUSB2 /dev/ttyUSB4 /dev/ttyUSB-arduino2.2 /dev/ttyUSB-arduino3

Como puede ver, todavía tenemos / dev / ttyUSBx como antes, que siempre cambian dependiendo de cuál se conectó primero. Pero ahora también tenemos / dev / ttyUSB-arduino {port} que siempre son iguales para el mismo puerto y solo para Arduinos. Para analizar lo que significa "..arduino2.4": 2 se refiere al segundo puerto de la computadora portátil y 4 al cuarto puerto en el hub USB.

Para verlo mejor, escriba:

lsusb -t

Salida:

...
/:  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
...

Al conectar / desconectar puede ver qué dispositivos están en qué puertos

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.