Як я можу отримати унікальний ідентифікатор для всіх моїх плат Arduino?


27

Після того, як ви завантажили ескіз на одну з ваших дощок Arduino, важко точно знати, який вихідний код призвів до цього ескізу.

Дійсно, ви можете змінити вихідний код ескізу на своєму ПК, не оновлюючи його (у двійковому форматі) на своїй дошці.

У мене виникла ідея створити своєрідне " сховище ескізів ", яке буде заповнено, як тільки я завантажую ескіз на одну з моїх дощок. Тоді я міг би отримати пізніше вихідний код для ескізу, який працює на будь-якій моїй дошці.

Для такого сховища я спершу повинен мати " індекс ", який би дозволив мені знати, до якої дошки пов'язаний вихідний код ескізу.

Зазвичай такий індекс повинен бути унікальним для кожної окремої дошки arduino.

Звідси моє запитання: як я можу отримати унікальний ідентифікатор для дошки Arduino?

Редагувати:

Це мій поточний список дощок (мініатюрний список, який повинен підтримуватися єдиним унікальним підходом до ідентифікації):

  • UNO R3
  • Мега 2560
  • Юнь
  • Робот Arduino (це повинні бути 2 еквівалентні дошки Леонардо)

В майбутньому я також можу створити власні дошки (еквівалент Uno, але безбокі, без FTDI), отже, якщо такий підхід також підтримує це, було б краще.


1
@jfpoilpret ... щойно бачив цю публікацію, переглядаючи сайт. Ви знайшли рішення чи найкращий сценарій, як це здійснити?
динотом

Відповіді:


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 для програмування. Це означає, що всі вони мали б однаковий ідентифікатор.


2
Що ви робите з 30 дощок?
asheeshr

В основному для бездротових сенсорних мереж. У мене є лише кілька справжніх Ардуїно - Дуеміланова, Медедуено Мега та Уно. Всі інші - Teensy, Jeenodes, WiNodes, Nanodes та RFus.
Кібергіббони

1
+1 за ретельний список можливих варіантів, дякую! Я вважаю за краще уникати 4. Оскільки я не хочу додавати певне обладнання до всіх моїх дощок. 5. виглядає небезпечно (легко завантажувати один і той же модифікований завантажувач на 2 різні дошки) і громіздкий (потрібно мати різні вихідні завантажувачі завантажувачів для завантаження кожної дошки). Поки що USB ID та FTDI здаються непоганими рішеннями, але чи працюють вони з усією моєю поточною платою?
jfpoilpret

Чи має Arduino глобально унікальні серійні ідентифікатори? Як її читати?
lanse7pty

13

Наскільки у мене чіп не має унікального ідентифікатора .... але ви можете запрограмувати його в EEPROM ваших дощок.

Документація EEPROM

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


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

Крім того, просто скористайтеся виробником етикеток і поставте етикетку на кожну дошку.


2
Що стосується унікального аспекту питання, то GUID міг би вирішити це (в межах невеликого похибки).
Матвій Г.

Я спочатку думав використовувати EEPROM для цього; але для цього потрібна додаткова робота для кожної дошки: створіть новий унікальний ідентифікатор, а потім запишіть його в EEPROM. Також можуть бути несумісності з бібліотеками, які використовуються моїми ескізами (які можуть писати на ту саму адресу EEPROM). Нарешті, в моєму контексті мені потрібно буде прочитати ідентифікатор з мого ПК, що складніше. Унікальний ідентифікатор USB мені здається цікавішим.
jfpoilpret

Відповідно до моєї відповіді, якщо ви хочете, щоб це було загальним рішенням (для більшості людей та широкого спектру дощок), покладатися на USB-ідентифікатор означає, що люди, які використовують кабелі FTDI на платах без USB-> Послідовного мосту, не будуть вміє використовувати вашу систему.
Кібергіббони

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();.


Так, управління версіями - це більш-менш те, що я хочу досягти; але встановити версію в коді та змінювати її щоразу, коли код змінюється - це не варіант (занадто легко забути). Наразі я використовую 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

Відмова: Я автор бібліотеки :-)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.