Как я могу получить уникальный идентификатор для всех моих плат Arduino?

27

После того, как вы загрузили эскиз на одну из ваших плат Arduino, трудно точно знать, какой исходный код привел к этому эскизу.

Действительно, вы можете изменить исходный код своего эскиза на своем ПК, не обновляя его (в двоичном формате) на своей плате.

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

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

Как правило, такой индекс должен быть уникальным для каждой платы Arduino.

Отсюда мой вопрос: как я могу получить уникальный идентификатор для платы Arduino?

Редактировать:

Это мой текущий список плат (минимальный список, который должен поддерживаться одним уникальным идентификатором):

  • UNO R3
  • Мега 2560
  • Yun
  • Робот Arduino (должно быть 2 доски, эквивалентные Леонардо)

В будущем я также могу создавать свои собственные платы (эквивалентные Uno, но без основы, без FTDI), поэтому, если подход также поддерживает их, это было бы лучше.

jfpoilpret
источник
1
@jfpoilpret ... только что видел этот пост, просматривая сайт .. Вы нашли решение или лучший сценарий того, как это реализовать?
Динотом

Ответы:

14

Есть несколько методов, которые вы можете использовать здесь, чтобы получить уникальный идентификатор.

  1. Чипы FTDI имеют уникальный серийный номер, запрограммированный на них. Доступ к нему возможен только со стороны ПК, насколько я знаю.
  2. Некоторые из чипов со встроенным USB (например, ATmega8U2 / 16U2 / 32U2) имеют уникальный идентификатор в данных подписи, обычно используемых для USB. Можно легко получить доступ с обеих сторон соединения. Это включает ATmega16U2, который используется в качестве USB-> последовательного моста Arduino Uno R3.
  3. Некоторые из микросхем со встроенным USB, но без уникального идентификатора в подписи, все равно будут иметь уникальный идентификатор, запрограммированный в стек USB (например, LUFA), используемый для загрузчика или DFU (обновление прошивки устройства).
  4. В них много микросхем с уникальными глобальными серийными идентификаторами, например, Microchip 11AA02E48 , все датчики Dallas 1-Wire (включая обычный датчик температуры DS18B20) и другие последовательные EEPROMS. Я использовал их в производственном оборудовании, которое должно иметь уникальный MAC-адрес.
  5. Вы можете изменить стандартный загрузчик Optiboot (или любой используемый вами лодочный погрузчик), чтобы он мог удерживать и отвечать уникальным идентификатором.

Проблема в том, что нет варианта, кроме 5, который будет работать на всех платах.

Если ваше решение будет общим, я бы предположил, что использование USB ID - это не путь вперед. У меня ~ 30 плат на Arduino, и только 5 из них имеют встроенное USB-оборудование. Всем остальным необходимо запрограммировать внешний кабель FTDI. Это означает, что все они будут иметь одинаковый идентификатор.

Cybergibbons
источник
2
Что вы делаете с 30 досками?
asheeshr
В основном для беспроводных сенсорных сетей. У меня есть только несколько настоящих Arduinos - Duemilanova, Seeeduino Mega и Uno. Все остальные - это Teensy, Jeenodes, WiNodes, Nanodes и RFus.
Cybergibbons
1
+1 за полный список возможных вариантов, спасибо! Я бы предпочел избегать 4., поскольку я не хочу добавлять конкретное оборудование для всех моих плат. 5. выглядит опасно (легко загружать один и тот же модифицированный загрузчик на 2 разные платы) и громоздко (нужно иметь разные исходные коды загрузчиков для загрузки для каждой платы). Пока что USB ID и FTDI кажутся неплохими решениями, но работают ли они со всеми моими нынешними платами?
jfpoilpret
Есть ли у Arduino глобально уникальные серийные идентификаторы? Как это читать?
lanse7pty
13

Насколько я знаю, чип не имеет какого-либо уникального идентификатора, но вы можете запрограммировать его в EEPROM своих плат.

EEPROM документирование

Вы будете писать по конкретному адресу, и тогда будущие наброски смогут прочитать ID и делать с ним что угодно.


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

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

sachleen
источник
2
Что касается уникального аспекта вопроса, GUID может решить эту проблему (в пределах крошечной погрешности).
Мэтью Г.
Первоначально я думал об использовании EEPROM для этого; но это требует дополнительной работы для каждой платы: создайте новый уникальный идентификатор, а затем запишите его в EEPROM. Кроме того, могут быть несовместимости с библиотеками, используемыми моими набросками (которые могут записывать на тот же адрес EEPROM). Наконец, в моем контексте, мне нужно будет прочитать идентификатор с моего компьютера, что более сложно. Уникальный идентификатор USB кажется мне более интересным.
jfpoilpret
Согласно моему ответу, если вы хотите, чтобы это было общее решение (для большинства людей и широкого спектра плат), полагаться на USB ID означает, что люди, использующие кабели FTDI на платах без USB-> последовательного моста, не будут возможность использовать вашу систему.
Cybergibbons
8

Некоторые платы при подключении к компьютеру публикуют их серийный номер. Мой Arduino Uno R3 говорит

[16818.451423] usb 3-2: SerialNumber: 85235353137351E02242

Хотя я не уверен, насколько он уникален.

Федерико Фиссоре
источник
У всех ли плат Arduino такой номер? Было бы неплохо иметь список досок, у которых есть одна (или нет).
jfpoilpret
1
Глядя на мины, у 32u4 нет, у 328 и SAM3X8E есть
Federico Fissore
4

Насколько мне известно, все чипы USB поставляются с уникальным серийным номером, по крайней мере, для чипов FTDI. В Linux вы можете легко назначать уникальные имена устройств из этого, проверьте мой сайт .

Помимо этого, то, что вы описываете, является в значительной степени простой формой контроля версий . Убедитесь, что ваши исходные файлы имеют номера версий. Чтобы идентифицировать свой Arduino, вы можете указать его Serial.Print();имя и версию кода во время setup();.

jippie
источник
Да, контроль версий - это более или менее то, чего я хочу достичь; но устанавливать версию в коде и менять ее каждый раз, когда код изменяется, не вариант (слишком легко забыть). В настоящее время я использую github для своих эскизов, но я бы хотел легко узнать, какая версия того эскиза в данный момент выполняется на одной доске.
jfpoilpret
4
Существует макрос на дату компиляции и времени __DATE__и __TIME__. Так что, по крайней мере, вы можете автоматически сохранить эту информацию в своем .hex файле @jfpoilpret
jippie
Хороший вопрос, я не думал об этих макросах для управления версиями.
jfpoilpret
2

Я сомневаюсь, что интерфейс USB на Uno дает вам уникальный серийный номер. Любой номер будет частью кода, загруженного в чип, который, следовательно, будет одинаковым для нескольких Unos.

Одним из подходов является микросхема DS2401 «Силиконовый серийный номер», в которой используется однопроводный интерфейс. Для этого потребуется только один свободный пин-код и некоторый код (возможно, проблема в коде).

Наименее навязчивый и, возможно, самый надежный способ - просто прочитать код и проверить его. Это именно то, что я делаю с моим детектором подписи чипа . Однако, это только обнаруживает (как в настоящее время написано) подпись загрузчика. Довольно незначительное изменение, и оно может суммировать MD5 всего кода эскиза.

Пример вывода:

Signature detector.
Written by Nick Gammon.
Signature = 1E  95  0F 
Fuses
Low = FF High = D6 Ext = FF Lock = CF

Processor = ATmega328P
Flash memory size = 32768
Bootloader in use: Yes
EEPROM preserved through erase: Yes
Watchdog timer always on: No
Bootloader is 512 bytes starting at 7E00

Bootloader:

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 sum of bootloader = 56 72 75 2D 5D B5 0D BA 25 10 DF BE 87 D2 A1 27 

Эта сумма MD5 (последняя строка) фактически является сигнатурой этого конкретного загрузчика. Фактически самая последняя версия ищет их в таблице:

MD5 sum of bootloader = FB F4 9B 7B 59 73 7F 65 E8 D0 F8 A5 08 12 E7 9F 
Bootloader name: optiboot_atmega328

Так что вы могли бы при загрузке эскиза сгенерировать сумму MD5 шестнадцатеричного кода. Есть довольно простые способы сделать это. Затем вы можете выполнить операцию «git tag» в своем исходном коде, а затем (используя некоторый автоматический или ручной процесс) запомнить, что конкретная сумма шестнадцатеричного кода MD5 представляет код эскиза в определенный момент.

Какая-то база данных вроде:

Chip: Uno
MD5 sum: D8 8C 70 6D FE 1F DC 38 82 1E CE AE 23 B2 E6 E7 
Sketch: My_robot_sketch_42.ino
Git tag: version666

Теперь, чтобы найти источник на плате, вы устанавливаете сумму кода MD5 (считывая ее с доски), а затем ищите ее в своей базе данных.

Ник Гаммон
источник
1

Я подключил однопроводный датчик температуры, каждый из которых поставляется с уникальным я. Все наброски читали я при загрузке и записывали адрес на каждом последовательном соединении. Я сделал щит со всем необходимым оборудованием, поэтому, если мне понадобится перейти с Uno на Mega, устройство сохранит свою уникальность.

влад б.
источник
0

Существует небольшая библиотека для чтения и записи вашего пользовательского идентификатора оборудования в EEPROM. Вы можете использовать его, чтобы не выдвигать неправильный эскиз к вашему Arduino или идентифицировать устройство для других целей.

https://github.com/skoumalcz/arduino-id-guard

Отказ от ответственности: я автор библиотеки :-)

Гинго
источник