すべてのArduinoボードの一意のIDを取得するにはどうすればよいですか?


27

Arduinoボードの1つにスケッチをアップロードすると、そのスケッチにつながったソースコードを正確に知ることは困難です。

実際、PC上のスケッチのソースコードは、ボードに(バイナリ形式で)更新せずに変更できます。

ボードの1つにスケッチをアップロードするとすぐに読み込まれるような「スケッチリポジトリ」を設定するというアイデアがありました。その後、ボードのいずれかで実行されているスケッチのソースコードを後で取得できました。

このようなリポジトリの場合、最初にスケッチのソースコードがリンクされているボードを知ることができる「インデックス」が必要になります。

通常、このようなインデックスは、すべてのArduinoボードに対して一意である必要があります。

したがって、私の質問:Arduinoボードの一意のIDを取得するにはどうすればよいですか?

編集:

これが現在のボードのリストです(単一の一意のIDアプローチでサポートされる最小リスト)。

  • UNO R3
  • メガ2560
  • ゆん
  • Arduino Robot(2つのLeonardo同等のボードでなければなりません)

将来的には、独自のボード(FTDIを使用しないUnoで同等のベアボーン)も作成する可能性があります。


1
@jfpoilpret ...サイトの閲覧中にこの投稿を見ただけです。解決策を見つけましたか、これを実装する方法に関するベストケースシナリオを見つけましたか。
-dinotom

回答:


14

一意のIDを取得するためにここで使用できる多くの手法があります。

  1. FTDIチップには、固有のシリアル番号がプログラムされています。これは、私の知る限り、接続のPC側からのみアクセスできます。
  2. USBが組み込まれたチップ(ATmega8U2 / 16U2 / 32U2など)には、通常USBに使用される一意のIDが署名データに含まれています。接続の両側から簡単にアクセスできます。これには、USB->シリアルブリッジArduino Uno R3として使用されるATmega16U2が含まれます。
  3. USBが組み込まれているが署名に一意のIDがないチップの一部には、ブートローダーまたはDFU(デバイスファームウェアアップグレード)に使用されるUSBスタック(LUFAなど)に一意のIDがプログラムされています。
  4. Microchip 11AA02E48、すべてのダラス1-Wireセンサー(一般的なDS18B20温度センサーを含む)、およびその他のシリアルEEPROMなど、グローバルに一意のシリアルIDを持つチップが多数あります。固有のMACアドレスが必要な運用ハードウェアでこれらを使用しました。
  5. 標準のOptibootブートローダー(または使用するボートローダー)を変更して、一意のIDを保持して応答できるようにすることができます。

これらの問題は、すべてのボードで機能する5以外のオプションがないことです。

あなたのソリューションが一般的なものになる場合、USB IDを使用することは今後の道ではないことをお勧めします。Arduinoベースのボードは30個ほどありますが、USBハードウェアが組み込まれているのはそのうち5つだけです。残りのすべてのプログラムには、外部FTDIケーブルをプログラムする必要があります。これは、それらがすべて同じIDを持つことを意味します。


2
あなたは何を行う30枚のボード?
asheeshr

主にワイヤレスセンサーネットワーク用。ドゥエミラノバ、シードゥイノメガ、ウノなど、実際のArduinoはほんの数個しかありません。他のすべては、Teensy、Jeenodes、WiNodes、Nanodes、およびRFusです。
サイバーギボン14

1
可能なオプションの完全なリストについては+1、ありがとう!4.すべてのボードに特定のハードウェアを追加したくないので、4は避けたいです。5.危険に見えます(同じ修正されたブートローダーを2つの異なるボードにアップロードするのは簡単です)。これまでのところ、USB IDとFTDIは非常に優れたソリューションのようですが、現在のすべてのボードで動作しますか?
jfpoilpret 14

Arduinoにはグローバルに一意のシリアルIDがありますか?読み方
lanse7pty

13

私の知る限り、チップには固有のIDはありません。しかし、ボードのEEPROMにプログラムすることができます。

EEPROMの文書化

特定のアドレスに書き込むと、その後のスケッチでIDを読み取って、それで何でもできます。


ホスト側で一意のIDまたはアドレスを表示できる場合もあります。USBデバイスについて詳しくはわかりませんが、USB通信を処理するチップには、使用できる一意のIDがある場合があります。ただし、Arduinoコードではこれを使用できません。

または、ラベルメーカーを使用して、各ボードにラベルを貼るだけです。


2
質問のユニークな側面に関する限り、GUIDはそれを解決できます(わずかな誤差範囲内)。
マシューG. 14

私はもともとそのためにEEPROMを使用することを考えていました。ただし、ボードを取得するたびに追加の作業が必要になります。新しい一意のIDを作成し、EEPROMに書き込みます。また、スケッチで使用されるライブラリと互換性がない場合があります(同じEEPROMアドレスに書き込む場合があります)。最後に、私の文脈では、PCからIDを読み取る必要がありますが、これはより困難です。USBの一意のIDは私にとってより興味深いようです。
jfpoilpret 14

私の答えによれば、これを一般的なソリューションにしたい場合(ほとんどの人と幅広いボード)、USB IDに依存するということは、USB->シリアルブリッジのないボードでFTDIケーブルを使用する人はいないことを意味しますあなたのシステムを使用することができます。
サイバーギボン14

8

一部のボードは、コンピューターに接続すると、シリアル番号を公開します。私のArduino Uno R3は言う

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

どれほどユニークなのかはわかりませんが。


すべてのArduinoボードにはそのような番号がありますか?ボードが1つある(またはない)リストがあると便利です。
jfpoilpret 14

1
鉱山を見てみると、32u4ベースのものにはない、328とSAM3X8Eものはそれを持っているか
フェデリコFissore

4

私の知る限り、少なくともFTDIチップの場合、USBチップにはすべて一意のシリアル番号が付いています。Linuxでは、そこから一意のデバイス名を簡単に割り当てることができます。私のWebサイトを確認してください

それ以外は、あなたが説明しているのはバージョン管理の非常に単純な形式です。ソースファイルにバージョン番号があることを確認してください。Arduinoを識別するために、のSerial.Print();間にコードの名前とバージョンを指定できますsetup();


はい、バージョン管理は多かれ少なかれ私が達成したいものです。ただし、コードにバージョンを設定し、コードが変更されるたびにバージョンを変更することはオプションではありません(忘れがちです)。現在、スケッチにはgithubを使用していますが、現在1つのボードで実行されているスケッチのバージョンを簡単に見つけたいと思います。
jfpoilpret 14

4
コンパイル日付と時刻のマクロがある__DATE__とは__TIME__。したがって、少なくともその情報を.hexファイルに自動的に保存できます@jfpoilpret
jippie

良い点は、バージョン管理用のこれらのマクロについては考えていませんでした。
jfpoilpret 14

2

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合計を確立し(ボードから読み取って)、データベースで調べます。


1

私は、それぞれにユニークなものが付属している1線の温度センサーを接続しました。すべてのスケッチは、ブート時にI'dを読み取り、すべてのシリアル接続でアドレスを書き込みました。必要なすべてのハードウェアでシールドを作成したので、UnoからMegaにアップグレードする必要がある場合、デバイスはそのユニークなままでした。


0

カスタムハードウェアIDをEEPROMに読み書きするための小さなライブラリがあります。これを使用して、間違ったスケッチをArduinoにプッシュしたり、他の目的のためにデバイスを識別したりできます。

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

免責事項:私は図書館の著者です:-)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.