Як в Linux визначити кілька підключених Arduinos через USB?


17

Якщо у мене є кілька підключених Arduinos через USB до комп'ютера Linux, вони відображаються як

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

Як я можу визначити, що таке Arduino, не підключаючись до них через послідовне з'єднання ? Чи є серійний номер або унікальний ідентифікатор на Arduino?

Спасибі за ваш час.

Ситуація: Uno R3, Мега, Леонардо з / ttyACM [1,2,3]

Виведення lsusb з пристроями у зазначеному вище порядку:

...
Автобус 001 Пристрій 011: ID 2341: 0043
Автобус 001 Пристрій 013: ID 2341: 8036
...
Автобус 001 Пристрій 014: ID 2341: 0042

lsusb -d постачальник: device -vvv показує для кожного

Уно

Автобус 001 Пристрій 014: ID 2341: 0042
Дескриптор пристрою:
  bLength 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
  Дескриптор конфігурації:
    bLength 9
    bDescriptorType 2
    wTotalLength 62
    bNumInterfaces 2
    bConfigurationValue 1
    iConfiguration 0
    bm Розподіляє 0xc0
      Самозабезпечений
    MaxPower 100mA
    Дескриптор інтерфейсу:
      bLength 9
      bDescriptorType 4
      bInterfaceNumber 0
      bAlternateSetting 0
      bNumEndpoints 1
      bInterfaceClass 2 Communications
      bInterfaceSubClass 2 Анотація (модем)
      bInterfaceProtocol 1 AT-команди (v.25ter)
      iInterface 0
      Заголовок CDC:
        bcdCDC 10.01
      CDC ACM:
        bmCapability 0x06
          відправляє перерву
          лінійне кодування та серійний стан
      Союз CDC:
        bMasterInterface 0
        bSlaveInterface 1
      Дескриптор кінцевої точки:
        bLength 7
        bDescriptorType 5
        bEndpointAddress 0x82 EP 2 IN
        bmРазподіляє 3
          Тип переривання Переривання
          Тип синхронізації немає
          Дані про тип використання
        wMaxPacketSize 0x0008 1x 8 байт
        bІнтервал 255
    Дескриптор інтерфейсу:
      bLength 9
      bDescriptorType 4
      bInterfaceNumber 1
      bAlternateSetting 0
      bNumEndpoints 2
      bInterfaceClass 10 Дані CDC
      bInterfaceSubClass 0 Невикористаний
      bInterfaceProtocol 0
      iInterface 0
      Дескриптор кінцевої точки:
        bLength 7
        bDescriptorType 5
        bEndpointAddress 0x04 EP 4 OUT
        bmРазподіляє 2
          Тип передачі Навальний
          Тип синхронізації немає
          Дані про тип використання
        wMaxPacketSize 0x0040 1x 64 байт
        bІнтервал 1
      Дескриптор кінцевої точки:
        bLength 7
        bDescriptorType 5
        bEndpointAddress 0x83 EP 3 IN
        bmРазподіляє 2
          Тип передачі Навальний
          Тип синхронізації немає
          Дані про тип використання
        wMaxPacketSize 0x0040 1x 64 байт
        bІнтервал 1
Статус пристрою: 0x0000
  (На автобусі)

Леонардо:

Автобус 001 Пристрій 013: ID 2341: 8036
Дескриптор пристрою:
  bLength 18
  bDescriptorType 1
  bcdUSB 2.00
  bDeviceClass 0 (визначено на рівні інтерфейсу)
  bDeviceSubClass 0
  bDeviceProtocol 0
  bMaxPacketSize0 64
  idVendor 0x2341
  idProduct 0x8036
  bcdDevice 1.00
  iManufacturer 1 ТОВ «Ардуїно»
  iProduct 2 Arduino Leonardo
  iSerial 0
  bNumConfigurations 1
  Дескриптор конфігурації:
    bLength 9
    bDescriptorType 2
    wTotalLength 100
    bNumInterfaces 3
    bConfigurationValue 1
    iConfiguration 0
    bm Розподіляє 0x80
      (На автобусі)
    MaxPower 500mA
    Інтерфейсна асоціація:
      bLength 8
      bDescriptorType 11
      bFirstInterface 0
      bInterfaceCount 2
      bFunctionClass 2 Communications
      bFunctionSubClass 2 Анотація (модем)
      bFunctionProtocol 1 AT-команди (v.25ter)
      iFunction 0
    Дескриптор інтерфейсу:
      bLength 9
      bDescriptorType 4
      bInterfaceNumber 0
      bAlternateSetting 0
      bNumEndpoints 1
      bInterfaceClass 2 Communications
      bInterfaceSubClass 2 Анотація (модем)
      bInterfaceProtocol 0 Немає
      iInterface 0
      Заголовок CDC:
        bcdCDC 1.10
      Управління викликами CDC:
        bmCapability 0x01
          управління викликами
        bDataInterface 1
      CDC ACM:
        bmCapability 0x06
          відправляє перерву
          лінійне кодування та серійний стан
      Союз CDC:
        bMasterInterface 0
        bSlaveInterface 1
      Дескриптор кінцевої точки:
        bLength 7
        bDescriptorType 5
        bEndpointAddress 0x81 EP 1 IN
        bmРазподіляє 3
          Тип переривання Переривання
          Тип синхронізації немає
          Дані про тип використання
        wMaxPacketSize 0x0040 1x 64 байт
        bІнтервал 0
      Дескриптор кінцевої точки:
        bLength 7
        bDescriptorType 5
        bEndpointAddress 0x83 EP 3 IN
        bmРазподіляє 2
          Тип передачі Навальний
          Тип синхронізації немає
          Дані про тип використання
        wMaxPacketSize 0x0040 1x 64 байт
        bІнтервал 0
    Дескриптор інтерфейсу:
      bLength 9
      bDescriptorType 4
      bInterfaceNumber 2
      bAlternateSetting 0
      bNumEndpoints 1
      bInterfaceClass 3 Пристрій людського інтерфейсу
      bInterfaceSubClass 0 Без підкласу
      bInterfaceProtocol 0 Немає
      iInterface 0
        Дескриптор пристрою HID:
          bLength 9
          bDescriptorType 33
          bcdHID 1,01
          bCountryCode 0 Не підтримується
          bNumDescriptors 1
          bDescriptorType 34 Звіт
          wDescriptorLength 101
          Дескриптор звіту: (довжина 101)
            Елемент (глобальний): сторінка використання, дані = [0x01] 1
                            Загальне управління робочим столом
            Елемент (локальний): використання, дані = [0x02] 2
                            Миша
            Елемент (головний): Збір, дані = [0x01] 1
                            Застосування
            Елемент (локальний): використання, дані = [0x01] 1
                            Покажчик
            Елемент (головний): Збір, дані = [0x00] 0
                            Фізичні
            Елемент (глобальний): ідентифікатор звіту, дані = [0x01] 1
            Елемент (глобальний): сторінка використання, дані = [0x09] 9
                            Кнопки
            Елемент (локальний): мінімум використання, дані = [0x01] 1
                            Кнопка 1 (первинна)
            Елемент (локальний): максимум використання, дані = [0x03] 3
                            Кнопка 3 (третя частина)
            Елемент (Глобальний): Логічний мінімум, дані = [0x00] 0
            Елемент (Глобальний): Логічний максимум, дані = [0x01] 1
            Елемент (глобальний): кількість звітів, дані = [0x03] 3
            Елемент (глобальний): Розмір звіту, дані = [0x01] 1
            Пункт (Основний): Введення, дані = [0x02] 2
                            Змінна інформація Абсолютна No_Wrap лінійна
                            Переважна_Дія No_Null_Position Недоступна бітфілд
            Елемент (глобальний): кількість звітів, дані = [0x01] 1
            Елемент (глобальний): Розмір звіту, дані = [0x05] 5
            Пункт (Основний): Введення, дані = [0x03] 3
                            Постійний змінний абсолютний No_Wrap лінійний
                            Переважна_Дія No_Null_Position Недоступна бітфілд
            Елемент (глобальний): сторінка використання, дані = [0x01] 1
                            Загальне управління робочим столом
            Елемент (локальний): використання, дані = [0x30] 48
                            Напрямок-X
            Елемент (локальний): використання, дані = [0x31] 49
                            Напрямок-Y
            Елемент (Місцевий): Використання, дані = [0x38] 56
                            Колесо
            Елемент (Глобальний): Логічний мінімум, дані = [0x81] 129
            Елемент (глобальний): логічний максимум, дані = [0x7f] 127
            Елемент (глобальний): Розмір звіту, дані = [0x08] 8
            Елемент (глобальний): кількість звітів, дані = [0x03] 3
            Пункт (Основний): Введення, дані = [0x06] 6
                            Відносні дані щодо змінної No_Wrap
                            Переважна_Дія No_Null_Position Недоступна бітфілд
            Елемент (головний): Кінцевий збір, дані = немає
            Елемент (головний): Кінцевий збір, дані = немає

            ......

      Дескриптор кінцевої точки:
        bLength 7
        bDescriptorType 5
        bEndpointAddress 0x84 EP 4 IN
        bmРазподіляє 3
          Тип переривання Переривання
          Тип синхронізації немає
          Дані про тип використання
        wMaxPacketSize 0x0040 1x 64 байт
        bІнтервал 1
Статус пристрою: 0x0000
  (На автобусі)

І Мега256:

Автобус 001 Пристрій 014: ID 2341: 0042
Дескриптор пристрою:
  bLength 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
  Дескриптор конфігурації:
    bLength 9
    bDescriptorType 2
    wTotalLength 62
    bNumInterfaces 2
    bConfigurationValue 1
    iConfiguration 0
    bm Розподіляє 0xc0
      Самозабезпечений
    MaxPower 100mA
    Дескриптор інтерфейсу:
      bLength 9
      bDescriptorType 4
      bInterfaceNumber 0
      bAlternateSetting 0
      bNumEndpoints 1
      bInterfaceClass 2 Communications
      bInterfaceSubClass 2 Анотація (модем)
      bInterfaceProtocol 1 AT-команди (v.25ter)
      iInterface 0
      Заголовок CDC:
        bcdCDC 10.01
      CDC ACM:
        bmCapability 0x06
          відправляє перерву
          лінійне кодування та серійний стан
      Союз CDC:
        bMasterInterface 0
        bSlaveInterface 1
      Дескриптор кінцевої точки:
        bLength 7
        bDescriptorType 5
        bEndpointAddress 0x82 EP 2 IN
        bmРазподіляє 3
          Тип переривання Переривання
          Тип синхронізації немає
          Дані про тип використання
        wMaxPacketSize 0x0008 1x 8 байт
        bІнтервал 255
    Дескриптор інтерфейсу:
      bLength 9
      bDescriptorType 4
      bInterfaceNumber 1
      bAlternateSetting 0
      bNumEndpoints 2
      bInterfaceClass 10 Дані CDC
      bInterfaceSubClass 0 Невикористаний
      bInterfaceProtocol 0
      iInterface 0
      Дескриптор кінцевої точки:
        bLength 7
        bDescriptorType 5
        bEndpointAddress 0x04 EP 4 OUT
        bmРазподіляє 2
          Тип передачі Навальний
          Тип синхронізації немає
          Дані про тип використання
        wMaxPacketSize 0x0040 1x 64 байт
        bІнтервал 1
      Дескриптор кінцевої точки:
        bLength 7
        bDescriptorType 5
        bEndpointAddress 0x83 EP 3 IN
        bmРазподіляє 2
          Тип передачі Навальний
          Тип синхронізації немає
          Дані про тип використання
        wMaxPacketSize 0x0040 1x 64 байт
        bІнтервал 1
Статус пристрою: 0x0000
  (На автобусі)


Чи можете ви відключити його від мережі та побачити, який зникає?
Анонімний Пінгвін

1
Насправді, я хочу зробити це для віддаленого масиву датчиків, що працює на сонячних батареях, який буде дуже далеко, щоб хтось це зробив, коли він перезавантажиться.
уряд б.

Ігнасіо Васкес-Абрамс - як я можу зіставити інформацію з lsusb -vvv в / dev / ttyACM <x>? Чи є щось у виході lsusb я можу розібратися? Дякую за ідею!
уряд б.

У вас є ще один Arduino, з яким можна порівняти вихід?
Ігнасіо Васкес-Абрамс

Відповіді:


6

Якщо ваш дистрибутив використовує udev:

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

Вам можуть знадобитися root права, щоб запустити це (sudo / su). Він видасть список такої інформації:

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

Це для Uno зі зміненою прошивкою на atmega16u2 (usb to serial). Цікаві лінії є, мабуть, ID_MODEL_ID та ID_MODEL_FROM_DATABASE.


Дякую. Я використовую OpenWrt в цьому випадку з hotplug2 за замовчуванням, але я спробую переключитися на udev і перевірити це.
уряд б.

5

Ви можете додати псевдонім для кожного. Тоді ви знаєте, що є що. Ось приємний підручник про те, як це налаштувати.

Ось фрагмент, який я написав на основі підручника. У наведеному нижче прикладі я використовую USB-серійний адаптер FTDI RS232RL, який, на мою думку, теж використовує Arduino.

  1. Для того щоб призначити псевдонім USB-послідовному пристрою, нам потрібно знайти деяку інформацію на пристрої
  2. Підключіть usb. Це передбачає, що ви вже встановили драйвери для цього використання бути пристроєм, і пристрій видно під час введення:

lsusb

  1. Нам знадобиться наступне a. Ідентифікатор постачальника b. Ідентифікатор продукту c. Серійний номер пристрою
  2. Для цього потрібно трохи полювати. Усі ваші пристрої проводять записи в "/ var / log / messages".

Тому ми можемо прочитати цей файл і знайти правильний USB:

grep "ftdi" /var/log/messages

Ви також можете використовувати "usb"

  1. Тут знаходять усі повідомлення з тегом ftdi:

  2. Поруч з ftdi_sio є число на зразок 1-1.2. Це USB-пристрій

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

Або ви можете використовувати:

dmesg | grep "usb 1-1.3"
  1. Це дає нам усю необхідну інформацію:

Псевдонім USB

  1. Тепер зі списком серійних номерів у руці давайте створимо набір правил UDEV, який створить приємне символічне посилання для кожного з цих пристроїв. Правила UDEV зазвичай розкидані на багато файлів у /etc/udev/rules.d. Створіть новий файл під назвою 99-usb-serial.rules і вставте туди наступні рядки:

У цьому прикладі мій псевдонім називається "lcdbox"

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A601ERJJ", SYMLINK+="lcdbox"
  1. SYMLINK - це ім’я вашого псевдоніма. У цьому випадку мій псевдонім - lcdbox.
  2. Збережіть файл та введіть

    sudo udevadm control - правила завантаження

  3. Тип

    ls –l / dev / lcdbox

lrwxrwxrwx 1 корінь кореня 7 січня 1 1970 / dev / lcdbox -> ttyUSB0

  1. Це показує, що мій псевдонім lcdbox відображається на ttyUSB0

4

Це досить просто! Ви повинні налаштувати прошивку ftdi чіпів і додати правило udev:

По-перше, перейдіть ftdi_eepromчерез apt-getджерела або з них. Визначте свій пристрій за допомогою lsusb та отримайте ідентифікатор:

lsusb

Шина 001 Пристрій 005: ID 0403: 6001 Майбутнє технологічне обладнання International, Ltd FT232 Serial (UART) IC
….

Підготуйте конфігурацію та переконайтесь, що це vendor_idта product_idвідповідність. Налаштуйте рядки в Stringsрозділі, щоб отримати унікальний ідентифікатор для вашого пристрою.

vendor_id = 0x0403 # ідентифікатор постачальника
product_id = 0x6001 # Ідентифікатор продукту

max_power = 50 # Макс. енергоспоживання: значення * 2 мА. Використовуйте 0, якщо self_powered = вірно.

###########
# Рядки #
########### 
Manufacturer = "FTDI" # Виробник
product = "Arduino Nano" # продукт
serial = "arduino1" # Серійний

###########
# Параметри #
###########
self_powered = false # Вимкніть це для роботи з шиною
remote_wakeup = false # Увімкніть цю функцію для віддаленого пробудження
use_serial = true # Використовуйте рядок із порядковим номером

# Як правило, не потрібно змінювати один із цих прапорів
# BM_type_chip = true # Більш нові чіпи - це тип BM
in_is_isochronous = false # У кінцевій точці ізохронний
out_is_isochronous = false # Вихідна кінцева точка є ізохронною
suspend_pull_downs = false # Увімкнути призупинення спадів для меншої потужності
change_usb_version = false # Змінити версію USB
usb_version = 0x0200 # Використовується лише тоді, коли увімкнено change_usb_version

########
# Різне #
########

filename = "eeprom.old" # Ім'я файлу, залиште порожнім, щоб пропустити написання файлу
cbus0 = RXLED #
cbus1 = TXLED #

Вивантажте поточну прошивку ftdi:

ftdi_eeprom --read-eprom

Ця команда створює ${pwd}/eeprom.old, яка містить поточну прошивку на ftdi. Створіть резервну копію цього файлу перед продовженням , оскільки під flash-eepromчас файлу він буде перезаписаний. Після резервного копіювання спалахніть ftdi:

ftdi_eeprom --flash-eeprom myconfig.conf

Тепер створіть правило udev, як так

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

у /etc/udev/rules.d/90-arduino-usb.rulesта перезапустіть udev.

service udev restart

Відключіть і підключіть пристрій знову та спробуйте

ls -lah /dev/arduino1

Де arduino1рядок визначено serialвище .conf.

Дивіться також: Ризики ftdi_eeprom? - TX завжди високий після спалаху


3

Я використовував би сценарій, щоб створити псевдонім під /dev/і також встановити групу та права на нього, udevяк і інші відповіді.

Але якби я цього не мав, udevя б накинувся lsusbна grepабо awk, як би lsusb|grep -e "idProduct".

У всякому разі, з udevправилами або з lsusbі grepдля ідентифікації USB пристроїв, використання idVendor, idProductі iSerialв Device descriptorчастині , lsusbщоб зробити правильний idenification. Як idVendorрозповідає вам виробник, idProductслід вказати товар від виробника, але іноді вони використовують один і той же ідентифікатор продукту для більш ніж одного продукту. Нарешті, якщо потрібно, то iSerialповинен бути унікальний ідентифікатор для кожного прикладу цього продукту.


3

У Ubuntu 16.04 (а може бути і попередніх версіях чи інших дистрибутивах) ви можете:

> ls /dev/serial/by-id

який відображається (у моєму вікні, де підключено Arduino UNO):

usb-Arduino__www.arduino.cc__0043_A4139363931351318241-if00

Ви можете легко помітити код пристрою 0043 (UNO) тут.

Цей файл насправді є посиланням на /dev/ttyACM0моє поле.


2

Ви завжди можете зробити якийсь друк ідентифікатора через серіал у налаштуваннях недійсності (). Після підключення певної плати вона надішле цей ідентифікатор на ваш USB-інтерфейс (який ви слухаєте з якоюсь програмою демон на вашому linux box). Щойно ви отримаєте ідентифікатор, ви можете зіставити його на шлях 'Arduino1': '/ dev / ttyACM0', 'Arduino2': '/ dev / ttyACM1', 'Arduino3': '/dev/ttyACM2'...etc

Майте на увазі, що при відключенні пристрою з якоїсь причини це може змінити його фізичний шлях, тому вам, можливо, доведеться перезавантажувати їх усі. У цьому випадку може бути добре написати окрему функцію ex: get_id (), яку ви можете зателефонувати в будь-який час (не тільки при запуску).


1

Мені б дуже сподобатись визначити інший спосіб, як, наприклад, сам ескіз відповісти на спеціальну команду ідентифікації, тільки щоб уникнути дивних способів ідентифікації USB-пристроїв.


0

Огляд

  • Один із способів, як згаданий у своїй відповіді ansi_lumen - це прошивання ftdi чіпа EEPROM, щоб він мав унікальний серійний номер, який потім міг би бути ідентифікований правилами UDEV.

    Але виявляється, що він не буде працювати на дешевому китайському Arduinos, який замість FTDI має чіп CH340G, який не має EEPROM для зберігання унікального ідентифікатора ( CH340B повинен працювати ).

  • Ця відповідь пропонує написати правило UDEV зі спеціальним сценарієм, який просить Ардуїно надсилати свій унікальний ідентифікатор через серійний. Проблема в тому, що вам потрібно змінити ескіз Ардуїно, і взагалі він досить складний.

Ідентифікація за портом

Тож найпростіший спосіб, який я знайшов, - це використовувати правила UDEV та ідентифікувати Arduinos через порт usb (devpath), тому підключення Arduino до того ж порту (навіть у вкладених usb-хабах) створить стійке ім’я .

Налаштування TLDR:

Модифікована версія цього

  1. Знайдіть Arduino idVendor та idProduct:

lsusb

У вас вийде щось подібне:

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

Підключивши / відключивши Arduino, знайдіть, який він (у мене підключено 3). Ми шукаємо його посвідчення особи. У моєму випадку "... ID 1a86: 7523 QinHeng ...". Отже idVendor = 1a86, idProduct = 7523

  1. Створіть новий файл правил UDEV:

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

  1. Змініть значення idVendor та idProduct тим, що ви знайшли на попередньому кроці щодо копіювання, вставте його у створений нами файл правил:

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

  1. Перезавантажте правила UDEV

sudo udevadm control --reload

  1. Підключіть Arduinos і тепер він буде мати унікальну назву. Щоб перевірити його, введіть:

ls /dev/ttyUSB*


Що виведе:

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

Як ви бачите, ми все ще отримуємо / dev / ttyUSBx, як і раніше, які завжди змінюються залежно від того, який з них був підключений першим. Але тепер у нас також є / dev / ttyUSB-arduino {port}, які завжди однакові для того ж порту і тільки для Arduinos. Щоб проаналізувати, що означає "..arduino2.4": 2 посилається на другий порт ноутбука і 4 на четвертий порт на концентраторі usb.

Щоб краще побачити його, введіть:

lsusb -t

Вихід:

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

Підключивши / відключившись, можна побачити, які пристрої є, в яких портах

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.