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