UnoのUSBインターフェースが一意のシリアル番号を提供しているとは思えません。任意の数がチップにアップロードされるコードの一部となり、したがって複数のUnosで同じになります。
1つのアプローチは、1線式インターフェースを使用するDS2401「シリコンシリアル番号」チップです。これには、1つの空きピンといくつかのコード(コードが問題になる可能性があります)のみが必要です。
最も邪魔にならず、おそらく最も信頼性の高い方法は、コードを読み返し、サムチェックすることです。それがまさにチップシグネチャディテクタで行うことです。ただし、それは(現在記述されているように)ブートローダーの署名のみを検出します。かなり小さな変更であり、スケッチコード全体を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
したがって、スケッチをアップロードするときに、16進コードのMD5合計を生成できます。それを行うにはかなり簡単な方法があります。次に、ソースコードで「gitタグ」操作を実行し、(自動または手動のプロセスを使用して)特定のMD5の16進コードが特定の瞬間のスケッチコードを表すことを思い出します。
次のようなデータベースのようなもの:
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合計を確立し(ボードから読み取って)、データベースで調べます。