Если у меня есть несколько Arduinos, подключенных через USB к компьютеру Linux, и они отображаются как
- / TTY / ACM0
- / TTY / ACM1
- / TTY / ACM2
Как я могу определить, какой Arduino какой, не подключаясь к ним через последовательное соединение ? Есть ли на Arduino серийный номер или уникальный идентификатор?
Спасибо за уделенное время.
Ситуация: Uno R3, Mega, Leonardo с / ttyACM [1,2,3]
Вывод lsusb с устройствами в указанном выше порядке:
... Автобус 001 Устройство 011: ID 2341: 0043 Автобус 001 Устройство 013: ID 2341: 8036 ... Автобус 001 Устройство 014: ID 2341: 0042
lsusb -d vendor: устройство показывает -vvv для каждого
Организация Объединенных Наций
Автобус 001 Устройство 014: ID 2341: 0042 Дескриптор устройства: Длина 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 Дескриптор конфигурации: Длина 9 bDescriptorType 2 wTotalLength 62 bNumInterfaces 2 bConfigurationValue 1 iConfiguration 0 bmAttributes 0xc0 Самостоятельное питание MaxPower 100 мА Дескриптор интерфейса: Длина 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 2 Communications bInterfaceSubClass 2 Abstract (модем) AT-команды bInterfaceProtocol 1 (v.25ter) iInterface 0 Заголовок CDC: bcdCDC 10.01 CDC ACM: bmCapabilities 0x06 посылает перерыв линейное кодирование и серийный статус CDC Union: bMasterInterface 0 bSlaveInterface 1 Описатель конечной точки: Длина 7 bDescriptorType 5 bEndpointAddress 0x82 EP 2 IN bmAttributes 3 Тип передачи Прерывание Тип синхронизации Нет Данные типа использования wMaxPacketSize 0x0008 1x 8 байтов bInterval 255 Дескриптор интерфейса: Длина 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 0 bNumEndpoints 2 Данные CDC bInterfaceClass 10 bInterfaceSubClass 0 Не используется bInterfaceProtocol 0 iInterface 0 Описатель конечной точки: Длина 7 bDescriptorType 5 bEndpointAddress 0x04 EP 4 OUT bmAttributes 2 Тип передачи Массовая Тип синхронизации Нет Данные типа использования wMaxPacketSize 0x0040 1x 64 байта bInterval 1 Описатель конечной точки: Длина 7 bDescriptorType 5 bEndpointAddress 0x83 EP 3 IN bmAttributes 2 Тип передачи Массовая Тип синхронизации Нет Данные типа использования wMaxPacketSize 0x0040 1x 64 байта bInterval 1 Состояние устройства: 0x0000 (Питание от шины)
Леонардо:
Автобус 001 Устройство 013: ID 2341: 8036 Дескриптор устройства: Длина 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 Дескриптор конфигурации: Длина 9 bDescriptorType 2 wTotalLength 100 bNumInterfaces 3 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Питание от шины) MaxPower 500 мА Ассоциация интерфейсов: Длина 8 bDescriptorType 11 bFirstInterface 0 bInterfaceCount 2 Связь bFunctionClass 2 bFunctionSubClass 2 Abstract (модем) AT-команды bFunctionProtocol 1 (v.25ter) iFunction 0 Дескриптор интерфейса: Длина 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 2 Communications bInterfaceSubClass 2 Abstract (модем) bInterfaceProtocol 0 Нет iInterface 0 Заголовок CDC: bcdCDC 1.10 Управление вызовами CDC: bmCapabilities 0x01 управление звонками bDataInterface 1 CDC ACM: bmCapabilities 0x06 посылает перерыв линейное кодирование и серийный статус CDC Union: bMasterInterface 0 bSlaveInterface 1 Описатель конечной точки: Длина 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Тип передачи Прерывание Тип синхронизации Нет Данные типа использования wMaxPacketSize 0x0040 1x 64 байта bInterval 0 Описатель конечной точки: Длина 7 bDescriptorType 5 bEndpointAddress 0x83 EP 3 IN bmAttributes 2 Тип передачи Массовая Тип синхронизации Нет Данные типа использования wMaxPacketSize 0x0040 1x 64 байта bInterval 0 Дескриптор интерфейса: Длина 9 bDescriptorType 4 bInterfaceNumber 2 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 3 устройство интерфейса пользователя bInterfaceSubClass 0 Нет подкласса bInterfaceProtocol 0 Нет iInterface 0 HID Device Descriptor: Длина 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 Linear Preferred_State No_Null_Position Non_Volatile Битовое поле Элемент (глобальный): количество отчетов, данные = [0x01] 1 Элемент (глобальный): размер отчета, данные = [0x05] 5 Элемент (основной): вход, данные = [0x03] 3 Постоянная переменная Абсолютная No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Битовое поле Элемент (глобальный): страница использования, данные = [0x01] 1 Общие элементы управления рабочим столом Элемент (локальный): использование, данные = [0x30] 48 Направление-X Элемент (локальный): использование, данные = [0x31] 49 Направление-Y Элемент (локальный): использование, данные = [0x38] 56 Рулевое колесо Элемент (глобальный): логический минимум, данные = [0x81] 129 Элемент (глобальный): логический максимум, данные = [0x7f] 127 Элемент (глобальный): размер отчета, данные = [0x08] 8 Элемент (глобальный): количество отчетов, данные = [0x03] 3 Элемент (основной): вход, данные = [0x06] 6 Относительная переменная данных No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Битовое поле Элемент (основной): окончание сбора, данные = нет Элемент (основной): окончание сбора, данные = нет ...... Описатель конечной точки: Длина 7 bDescriptorType 5 bEndpointAddress 0x84 EP 4 IN bmAttributes 3 Тип передачи Прерывание Тип синхронизации Нет Данные типа использования wMaxPacketSize 0x0040 1x 64 байта bInterval 1 Состояние устройства: 0x0000 (Питание от шины)
И мега256:
Автобус 001 Устройство 014: ID 2341: 0042 Дескриптор устройства: Длина 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 Дескриптор конфигурации: Длина 9 bDescriptorType 2 wTotalLength 62 bNumInterfaces 2 bConfigurationValue 1 iConfiguration 0 bmAttributes 0xc0 Самостоятельное питание MaxPower 100 мА Дескриптор интерфейса: Длина 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 2 Communications bInterfaceSubClass 2 Abstract (модем) AT-команды bInterfaceProtocol 1 (v.25ter) iInterface 0 Заголовок CDC: bcdCDC 10.01 CDC ACM: bmCapabilities 0x06 посылает перерыв линейное кодирование и серийный статус CDC Union: bMasterInterface 0 bSlaveInterface 1 Описатель конечной точки: Длина 7 bDescriptorType 5 bEndpointAddress 0x82 EP 2 IN bmAttributes 3 Тип передачи Прерывание Тип синхронизации Нет Данные типа использования wMaxPacketSize 0x0008 1x 8 байтов bInterval 255 Дескриптор интерфейса: Длина 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 0 bNumEndpoints 2 Данные CDC bInterfaceClass 10 bInterfaceSubClass 0 Не используется bInterfaceProtocol 0 iInterface 0 Описатель конечной точки: Длина 7 bDescriptorType 5 bEndpointAddress 0x04 EP 4 OUT bmAttributes 2 Тип передачи Массовая Тип синхронизации Нет Данные типа использования wMaxPacketSize 0x0040 1x 64 байта bInterval 1 Описатель конечной точки: Длина 7 bDescriptorType 5 bEndpointAddress 0x83 EP 3 IN bmAttributes 2 Тип передачи Массовая Тип синхронизации Нет Данные типа использования wMaxPacketSize 0x0040 1x 64 байта bInterval 1 Состояние устройства: 0x0000 (Питание от шины)
lsusb -vvv
говорит?Ответы:
Предполагая, что ваш дистрибутив использует
udev
:Возможно, вам понадобятся права суперпользователя (sudo / su). Это выведет список информации как это:
Это для Uno с модифицированной прошивкой на atmega16u2 (от usb к serial). Интересующие линии, вероятно, ID_MODEL_ID и ID_MODEL_FROM_DATABASE.
источник
Вы можете добавить псевдоним для каждого. Тогда вы знаете, что есть что. Вот хороший учебник о том, как это настроить.
Вот фрагмент, который я написал на основе учебника. В приведенном ниже примере я использую переходник FTDI RS232RL USB-Serial, который, как я полагаю, используется и Arduino.
lsusb
Поэтому мы можем прочитать этот файл и найти правильный USB:
Вы также можете использовать «USB»
Это найти все сообщения с тегом ftdi:
Рядом с ftdi_sio есть число вроде 1-1.2. Это устройство USB
grep "usb 1-1.2" /var/log/messages
Или вы можете использовать:
В этом примере мой псевдоним называется lcdbox.
Сохраните файл и введите
sudo udevadm control --reload-rules
Тип
ls –l / dev / lcdbox
lrwxrwxrwx 1 root root 7 января 1 1970 г. / dev / lcdbox -> ttyUSB0
источник
Это довольно просто! Вы должны настроить прошивку ftdi chips и добавить правило udev:
Сначала получите
ftdi_eeprom
черезapt-get
или из источников. Определите ваше устройство через lsusb и получите идентификатор:Подготовьте конфиг и убедитесь, что
vendor_id
иproduct_id
совпадаете. Настройте строки вStrings
разделе, чтобы получить уникальный идентификатор для вашего устройства.Дамп текущей ftdi-прошивки:
ftdi_eeprom --read-eprom
Эта команда создает
${pwd}/eeprom.old
, которая содержит текущую прошивку на ftdi. Сделайте резервную копию этого файла, прежде чем продолжить , потому что воflash-eeprom
время файла перезаписывается. После резервного копирования прошить ftdi:Теперь создайте правило udev, вот так
в
/etc/udev/rules.d/90-arduino-usb.rules
и рестарт Udev.Отключите и снова подключите устройство и попробуйте
Где
arduino1
строка, определеннаяserial
в выше.conf
.Смотрите также: Риски ftdi_eeprom? - TX всегда высокий после перепрошивки
источник
Я бы использовал скрипт для создания псевдонима,
/dev/
а также установил группу и права на него,udev
как и другие ответы.Но если у меня не было ,
udev
я бы трубкуlsusb
вgrep
илиawk
, какlsusb|grep -e "idProduct"
.Во всяком случае, с
udev
правилами или сlsusb
иgrep
для идентификации USB устройств, использованиеidVendor
,idProduct
иiSerial
вDevice descriptor
части ,lsusb
чтобы сделать правильный idenification. ОнidVendor
говорит вам, что производительidProduct
должен идентифицировать продукт от производителя, но иногда они используют один и тот же идентификатор продукта для более чем одного продукта. Наконец, при необходимости,iSerial
должен быть уникальный идентификатор для каждого примера этого продукта.источник
В Ubuntu 16.04 (и, может быть, в предыдущих версиях или других дистрибутивах) вы можете сделать:
который отображает (на моей коробке, где подключен Arduino UNO):
Вы можете легко определить идентификатор устройства 0043 (UNO) здесь.
Этот файл на самом деле является ссылкой
/dev/ttyACM0
в моем окне.источник
Вы всегда можете сделать какой-то идентификатор для печати через последовательный порт в void setup (). После того, как определенная плата будет подключена, она отправит этот идентификатор на ваш интерфейс USB (который вы слушаете с помощью какого-либо приложения-демона на вашем Linux-боксе). Получив идентификатор, вы можете сопоставить его с его путем 'Arduino1': '/ dev / ttyACM0', 'Arduino2': '/ dev / ttyACM1', 'Arduino3': '/dev/ttyACM2'...etc
Помните, что когда устройство по какой-то причине отключено, оно может изменить свой физический путь, поэтому вам, возможно, придется переназначить их все. Для этого случая может быть полезно написать отдельную функцию ex: get_id (), которую вы можете вызывать в любое время (не только при запуске).
источник
Я мог бы испытать искушение определить какой-то другой способ, например, заставить сам эскиз реагировать на специальную команду идентификации, просто чтобы избежать странных способов идентификации устройств USB.
источник
обзор
Один из способов, как ansi_lumen упомянул в своем ответе состоит в том, чтобы перепрограммировать микросхему EEPROM ftdi, чтобы иметь уникальный серийный номер, который затем можно было бы определить по правилам UDEV.
Но оказывается, что он не будет работать на дешевых китайских Arduinos, у которых вместо FTDI есть чип CH340G, у которого нет EEPROM для хранения уникального идентификатора ( CH340B должен работать ).
Идентификация по порту
Поэтому я нашел самый простой способ - использовать правила UDEV и идентифицировать Arduinos по порту usb (devpath), поэтому подключение Arduino к одному и тому же порту (даже во вложенных концентраторах usb) создаст постоянное имя .
Настройка TLDR:
Модифицированная версия этого
lsusb
Вы получите что-то вроде этого:
Подключив / отключив Arduino, найдите, какой он (у меня 3 подключенных). Мы ищем его ID. В моем случае "... ID 1a86: 7523 QinHeng ...". Итак, idVendor = 1a86, idProduct = 7523
sudo nano /etc/udev/rules.d/99-usb-serial.rules
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="ttyUSB-arduino%s{/devpath}"
sudo udevadm control --reload
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-концентраторе.
Чтобы лучше увидеть это, наберите:
Выход:
При подключении / отключении вы можете видеть, какие устройства и на каких портах
источник