Как я могу получить уникальный идентификатор для всех плат Arduino?
После того, как вы загрузили эскиз на одну из своих плат Arduino, трудно точно знать, какой исходный код привел к этому эскизу.
В самом деле, вы можете изменить исходный код своего эскиза на своем ПК, не обновляя его (в двоичном формате) на свою доску.
У меня возникла идея создать своего рода « эскизный репозиторий », который будет заполнен, как только я загружу эскиз на одну из моих плат. Затем я мог бы получить исходный код для эскиза, запущенного на любой из моих плат.
Для такого репозитория мне сначала понадобится « index », который позволит мне узнать , на какой доске связан исходный код эскиза.
Как правило, такой индекс должен быть уникальным для каждой платы arduino.
Отсюда мой вопрос: как я могу получить уникальный идентификатор для платы Arduino?
Edit:
Это мой текущий список досок (список miniumum поддерживается одним уникальным ID-подходом):
- UNO R3
- Mega 2560
- Yun
- Arduino Robot (это должно быть 2 эквивалентных доски Leonardo)
В будущем я также смогу создать свои собственные платы (эквивалент Uno, но barebones, без FTDI), следовательно, если подход также поддерживает те, которые были бы лучше.
7 ответов
Существует несколько методов, которые вы можете использовать здесь для получения уникального идентификатора.
- У чипов FTDI есть уникальный серийный номер, запрограммированный на них. Насколько мне известно, к нему можно получить доступ только со стороны ПК.
- Некоторые из микросхем со встроенным USB (например, ATmega8U2 /16U2 /32U2) имеют уникальный идентификатор в данных подписи, обычно используемый для USB. С легкостью можно получить доступ с обеих сторон соединения. Это включает в себя ATmega16U2, который используется в качестве USB-> Последовательный мост Arduino Uno R3.
- Некоторые из микросхем со встроенным USB, но без уникального идентификатора в сигнатуре, по-прежнему будут иметь уникальный идентификатор, запрограммированный в стек USB (например, LUFA), используемый для загрузчика или DFU (обновление прошивки устройства).
- В них много фишек с уникальными в мире уникальными идентификаторами. Microchip 11AA02E48 , все датчики 1-Wire Dallas (включая общий датчик температуры DS18B20) , и другие серийные EEPROMS. Я использовал их в производственном оборудовании, которое должно иметь уникальный MAC-адрес.
- Вы можете изменить стандартный загрузочный загрузчик Optiboot (или какой бы лодка вы не использовали), чтобы он мог удерживать и отвечать уникальным идентификатором.
Проблема заключается в том, что нет опции, кроме 5, которая будет работать во всех платах.
Если ваше решение будет общим, я бы предположил, что использование USB-идентификатора - это не путь вперед. У меня есть ~ 30 плат на базе Arduino, и только 5 из них имеют встроенное USB-оборудование. Все остальные нуждаются в программировании внешнего кабеля FTDI. Это означает, что у всех будет одинаковый идентификатор.
У чипа нет какого-либо уникального идентификатора, насколько я знаю ... но вы можете запрограммировать его в EEPROM своих плат.
Вы будете писать на конкретный адрес, а затем будущие эскизы могут читать идентификатор и делать с ним все.
Вы также можете увидеть идентификатор или адрес unqiue на стороне хоста. Я не знаю достаточно о USB-устройствах, чтобы рассказать вам больше, но связь USB с интерфейсом чипа может иметь уникальный идентификатор, который вы могли бы использовать. Однако ваш код Arduino не сможет использовать это.
В качестве альтернативы просто используйте создатель ярлыков и поместите надпись на каждой плате.
Некоторые платы, подключенные к компьютеру, публикуют свой серийный номер. Мой Arduino Uno R3 говорит
[16818.451423] usb 3-2: SerialNumber: 85235353137351E02242
Хотя я не уверен, насколько это уникально.
Насколько мне известно, USB-чипы имеют уникальный серийный номер, по крайней мере, для чипов FTDI. В Linux вы можете легко назначить уникальные имена устройств, проверив мой сайт .
Кроме того, то, что вы описываете, в значительной степени является простой формой контроля версий . Убедитесь, что исходные файлы имеют номера версий. Чтобы идентифицировать ваш Arduino, вы можете сделать его Serial.Print ();
имя и версию кода во время setup ();
.
Я сомневаюсь, что интерфейс USB на Uno дает вам уникальный серийный номер. Любое число будет частью кода, загруженного в чип, который поэтому будет таким же среди множества Unos.
Один из подходов - это чип DS2401 «Silicon Serial Number», который использует однопроводный интерфейс. Для этого потребуется только один свободный вывод, а также некоторый код (возможно, код).
Наименее интрузивный метод и, вероятно, самый надежный, состоял бы в том, чтобы просто прочитать код и проверить его сумму. Это именно то, что я делаю с детектором сигнатур чипа . Однако это только обнаруживает (как в настоящее время) подпись загрузчика. Довольно незначительное изменение, и он мог бы MD5-суммировать весь код эскиза.
Пример вывода:
Сигнальный детектор.
Автор Ник Гэммон.
Подпись = 1E 95 0F
Плавкие предохранители
Low = FF High = D6 Ext = FF Lock = CF
Процессор = ATmega328P
Размер флеш-памяти = 32768
Загрузочный загрузчик: Да
EEPROM сохраняется через стирание: Да
Таймер сторожевого таймера всегда включен: Нет
Загрузочный загрузчик - 512 байт, начиная с 7E00
Загрузчик:
7E00: 02 01 02 03 0405 06 07 08 09 0A 0B 0C 0D 0E 0F
7E10: 02 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
7E20: 02 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
7E30: 02 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
...
7FB0: 02 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
7FC0: 02 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
7FD0: 02 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
7FE0: 02 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
7FF0: 02 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
MD5 сумма загрузчика = 56 72 75 2D 5D B5 0D BA 25 10 DF BE 87 D2 A1 27
Эта сумма MD5 (последняя строка) является фактически сигнатурой этого конкретного загрузчика. Фактически последняя версия просматривает их в таблице:
MD5 сумма загрузчика = FB F4 9B 7B 59 73 7F 65 E8 D0 F8 A5 08 12 E7 9F
Имя загрузчика: optiboot_atmega328
Итак, что вы можете сделать, при загрузке эскиза сгенерируйте сумму MD5 шестнадцатеричного кода. Есть довольно простые способы сделать это. Затем вы можете выполнить операцию «git tag» в своем исходном коде, а затем (используя какой-либо автоматический или ручной процесс) помните, что конкретная сумма MD5 шестнадцатеричного кода представляет код эскиза в определенный момент.
Некоторая база данных, например:
Чип: Uno
Сумма MD5: D8 8C 70 6D FE 1F DC 38 82 1E CE AE 23 B2 E6 E7
Эскиз: My_robot_sketch_42.ino
Git tag: версия666
Теперь, чтобы найти источник с доски, вы устанавливаете сумму MD5 кода (читая ее обратно с доски), а затем просматриваете ее в своей базе данных.
Я подключил однопроводной датчик температуры, каждый из которых имеет уникальную функцию. Все эскизы читали, что я загружал и писал адрес на каждом последовательном соединении. Я сделал щит со всем необходимым мне оборудованием, поэтому, если мне нужно было перейти с Uno на Mega, устройство сохранило его уникальность.
Существует небольшая библиотека для чтения и записи вашего пользовательского идентификатора оборудования в EEPROM. Вы можете использовать его, чтобы избежать нажатия неправильного эскиза на Arduino или для идентификации устройства для других целей.
https://github.com/skoumalcz/arduino-id-guard
Отказ от ответственности: я являюсь автором библиотеки: -)