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

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

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

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

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

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

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

Edit:

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

  • UNO R3
  • Mega 2560
  • Yun
  • Arduino Robot (это должно быть 2 эквивалентных доски Leonardo)

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

24 голоса | спросил jfpoilpret 18 FebruaryEurope/MoscowbTue, 18 Feb 2014 02:27:42 +0400000000amTue, 18 Feb 2014 02:27:42 +040014 2014, 02:27:42

7 ответов


14

Существует несколько методов, которые вы можете использовать здесь для получения уникального идентификатора.

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

Проблема заключается в том, что нет опции, кроме 5, которая будет работать во всех платах.

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

ответил Cybergibbons 18 FebruaryEurope/MoscowbTue, 18 Feb 2014 12:27:19 +0400000000pmTue, 18 Feb 2014 12:27:19 +040014 2014, 12:27:19
13

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

documetnation EEPROM

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


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

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

ответил sachleen 18 FebruaryEurope/MoscowbTue, 18 Feb 2014 03:37:06 +0400000000amTue, 18 Feb 2014 03:37:06 +040014 2014, 03:37:06
8

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

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

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

ответил Federico Fissore 18 FebruaryEurope/MoscowbTue, 18 Feb 2014 03:45:14 +0400000000amTue, 18 Feb 2014 03:45:14 +040014 2014, 03:45:14
4

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

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

ответил jippie 18 FebruaryEurope/MoscowbTue, 18 Feb 2014 09:19:19 +0400000000amTue, 18 Feb 2014 09:19:19 +040014 2014, 09:19:19
2

Я сомневаюсь, что интерфейс 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 кода (читая ее обратно с доски), а затем просматриваете ее в своей базе данных.

ответил Nick Gammon 3 rdEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 03 Sep 2015 09:25:10 +0300 2015, 09:25:10
1

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

ответил vlad b. 3 rdEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 03 Sep 2015 10:20:07 +0300 2015, 10:20:07
0

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

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

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

ответил gingo 5 MarpmMon, 05 Mar 2018 23:59:42 +03002018-03-05T23:59:42+03:0011 2018, 23:59:42

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132