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