Как отличить 2 Micros в Linux

У меня есть 2 устройства на базе Arduino Micro, которые я хочу использовать на своем компьютере с Ubuntu Linux. Мне нужно, чтобы у них были уникальные последовательные порты. К сожалению, оба имеют одинаковый серийный номер, что затрудняет идентификацию с помощью правил udev (если вообще возможно).

Это серийный номер, который я получаю для обоих:

$ udevadm info -a -p  $(udevadm info -q path -n /dev/ttyACM0) | grep -i serial
  ATTRS{serial}=="0000:00:14.0"

Есть ли способ вручную установить серийный номер на Arduino Micro? Или есть ли какие-либо другие уникальные идентифицирующие свойства, которые я могу использовать для правил udev?

Обычно я делаю что-то подобное в своем файле /etc/udev/rules.d/99-usb-serial.rules:

SUBSYSTEM=="tty", ATTRS{product}=="Arduino Uno", ATTRS{serial}=="64936333936351911191", SYMLINK+="MyDevice"

Примечание: у меня также есть Due с тем же серийным номером, что и у Micros, но поскольку ATTRS{продукт} другой, я могу его отличить.

, 👍5


2 ответа


Лучший ответ:

3

USB VID, PID и серийный номер программируются в чип при загрузке программы. VID и PID привязаны к плате, а серийный номер всегда один и тот же, независимо от того, какая плата.

Поэтому независимо от того, какую плату вы запрограммируете, она получит те же сведения, что и любая другая плата того же типа.

Нет возможности изменить серийный номер (IIRC, фактически серийный номер не определен), но VID и PID предоставляются в виде пары макросов в командной строке компиляции: USB_VID и USB_PID.

Таким образом, вы можете (просто) создать новое определение платы (на основе существующего Micro), которое будет называться «Другой Micro», и предоставить этой плате другой (неофициальный) PID. Затем вы можете различать две платы в udev, используя комбинацию VID/PID.

Конечно, затем вы должны убедиться, что при программировании выбрана правильная плата, и при входе в загрузчик на «другой» плате произойдет возврат к старому PID, который запрограммирован в загрузчике. но я уверен, что ты с этим справишься.

,

1

Этот «0000:00:14.0» не является серийным номером Arduino: udevadm печатает информацию для более чем одного устройства, и это для чипа контроллера USB.

Ардуино, построенные на ATMEGA32U4, не имеют серийного номера: у меня есть несколько Leonardos, которые вызывают ту же проблему, что и вы. Когда загрузчик изначально разрабатывался, программист не сообщал об этом. Я нашел модифицированный загрузчик, который это делает, но еще не пробовал: http://forum.arduino.cc /index.php?topic=503703.0

Подлинные Arduino с чипом FTDI сообщают уникальные серийные номера. Некоторые подделки либо не устанавливают его в чипе, либо могут присваивать ему какое-то неуникальное число (пропуская этот шаг, чтобы сэкономить несколько центов на производственных затратах). Те, которые используют чип 16U2 для интерфейса USB (например, Uno R3), должны получить уникальный серийный номер. Китайские чипы, которые я только что купил, были, но возможно, что другие их производители идут на компромисс, как это делают некоторые пользователи чипов FTDI.

Arduino, использующие китайский USB-чип CH340, также не сообщают серийный номер: чип его не поддерживает. Я думаю, что это справедливо и для CP2102, но я не уверен.

Вы возможно сможете решить проблему с помощью этого модифицированного загрузчика (я надеюсь на это: у меня полдюжины Leonardos, и это проблема каждый раз, когда у меня одновременно подключено более одного. К счастью, это проблема. , я обычно не использую их как «периферийные устройства для ПК»). Или вы можете купить еще одну «крошечную» Arduino с 328P, которая использует чип USB-последовательный порт, и основывать правила udev на VID и PID, чтобы различать их.

,