Wie kann ich eine eindeutige ID für alle meine Arduino-Boards erhalten?

27

Sobald Sie eine Skizze auf eines Ihrer Arduino-Boards hochgeladen haben, ist es schwierig, genau zu wissen, welcher Quellcode zu dieser Skizze geführt hat.

In der Tat können Sie den Quellcode Ihrer Skizze auf Ihrem PC ändern, ohne ihn (im Binärformat) auf Ihrem Board zu aktualisieren.

Ich hatte die Idee, eine Art " Skizzen-Repository " einzurichten , das gefüllt wird, sobald ich eine Skizze auf eines meiner Boards hochlade. Dann konnte ich später den Quellcode für eine Skizze abrufen, die auf einem meiner Boards lief.

Für ein solches Repository benötige ich zunächst einen " Index ", anhand dessen ich feststellen kann, mit welchem ​​Board der Quellcode der Skizze verknüpft ist.

Typischerweise sollte ein solcher Index für jedes einzelne Arduino-Board eindeutig sein.

Daher meine Frage: Wie kann ich eine eindeutige ID für ein Arduino-Board erhalten?

Bearbeiten:

Dies ist meine aktuelle Liste der Boards (die Mindestliste, die von einem einzigen eindeutigen ID-Ansatz unterstützt werden soll):

  • UNO R3
  • Mega 2560
  • Yun
  • Arduino Robot (das müssen 2 Leonardo-Äquivalente sein)

In Zukunft kann ich auch meine eigenen Boards bauen (Uno-Äquivalent, aber Barebones, ohne FTDI). Wenn also ein Ansatz diese unterstützt, wäre das besser.

jfpoilpret
quelle
1
@jfpoilpret ... habe gerade diesen Beitrag gesehen, als ich die Site durchgesehen habe. Hast du eine Lösung oder ein Best-Case-Szenario gefunden, wie dies implementiert werden kann?
Dinotom

Antworten:

14

Es gibt eine Reihe von Techniken, mit denen Sie eine eindeutige ID erhalten können.

  1. Auf FTDI-Chips ist eine eindeutige Seriennummer programmiert. Soweit mir bekannt ist, kann nur von der PC-Seite der Verbindung darauf zugegriffen werden.
  2. Einige der Chips mit eingebautem USB (z. B. ATmega8U2 / 16U2 / 32U2) haben eine eindeutige ID in den Signaturdaten, die normalerweise für USB verwendet werden. Kann leicht von beiden Seiten der Verbindung zugegriffen werden. Dies beinhaltet den ATmega16U2, der als USB-> Serial Bridge Arduino Uno R3 verwendet wird.
  3. Bei einigen Chips mit integriertem USB, aber ohne eindeutige ID in der Signatur ist weiterhin eine eindeutige ID in den USB-Stack (z. B. LUFA) programmiert, der für den Bootloader oder DFU (Device Firmware Upgrade) verwendet wird.
  4. Es gibt viele Chips mit weltweit eindeutigen Seriennummern, z. B. den Microchip 11AA02E48 , alle Dallas 1-Wire-Sensoren (einschließlich des üblichen DS18B20-Temperatursensors) und andere serielle EEPROMs. Ich habe diese in Produktionshardware verwendet, die eine eindeutige MAC-Adresse haben muss.
  5. Sie können den standardmäßigen Optiboot-Bootloader (oder den von Ihnen verwendeten Bootloader) so ändern, dass er eine eindeutige ID enthält und mit dieser reagiert.

Das Problem dabei ist, dass es außer 5 keine Option gibt, die auf allen Platinen funktioniert.

Wenn es sich bei Ihrer Lösung um eine generische Lösung handelt, würde ich vorschlagen, dass die Verwendung einer USB-ID nicht der richtige Weg ist. Ich habe ~ 30 Arduino-basierte Boards und nur 5 von ihnen haben USB-Hardware eingebaut. Alle anderen benötigen ein externes FTDI-Kabel, um programmiert zu werden. Dies bedeutet, dass sie alle die gleiche ID haben würden.

Cybergibbons
quelle
2
Was möchten Sie tun mit 30 Boards?
Asheeshr
Hauptsächlich für drahtlose Sensornetzwerke. Ich habe nur ein paar echte Arduinos - eine Duemilanova, eine Seeeduino Mega und eine Uno. Alle anderen sind Teensy, Jeenodes, WiNodes, Nanodes und RFus.
Cybergibbons
1
+1 für eine gründliche Liste der möglichen Optionen, danke! Ich möchte lieber 4. vermeiden, da ich nicht alle meine Boards mit spezifischer Hardware ausstatten möchte. 5. Sieht gefährlich aus (es ist einfach, den gleichen modifizierten Bootloader auf zwei verschiedene Boards hochzuladen) und umständlich (es muss für jedes Board ein anderer Bootloader-Quellcode zum Hochladen vorhanden sein). Bisher scheinen USB ID und FTDI recht gute Lösungen zu sein, aber funktionieren sie mit allen meinen aktuellen Boards?
jfpoilpret
Hat Arduino global eindeutige Seriennummern? Wie lese ich es?
lanse7pty
13

Soweit ich weiß, hat der Chip keine eindeutige ID, aber Sie können eine in das EEPROM Ihrer Platinen programmieren.

EEPROM-Dokumentation

Sie würden an eine bestimmte Adresse schreiben und dann können zukünftige Skizzen die ID lesen und alles damit machen.


Möglicherweise sehen Sie auch eine eindeutige ID oder Adresse auf der Hostseite. Ich weiß nicht genug über USB-Geräte, um Ihnen mehr zu sagen, aber der Chip, der die USB-Kommunikation verwaltet, verfügt möglicherweise über eine eindeutige ID, die Sie verwenden können. Ihr Arduino-Code könnte dies jedoch nicht verwenden.

Alternativ können Sie auch einen Etikettendrucker verwenden und jedes Board mit einem Etikett versehen.

Sachleen
quelle
2
Was den einzigartigen Aspekt der Frage angeht, könnte eine GUID dies (innerhalb einer winzigen Fehlerspanne) lösen.
Matthew G.
Ich hatte ursprünglich daran gedacht, das EEPROM dafür zu verwenden. das erfordert aber zusätzlichen aufwand für jede platine: erstelle eine neue eindeutige id und schreibe sie dann in das eeprom. Außerdem kann es zu Inkompatibilitäten mit Bibliotheken kommen, die von meinen Skizzen verwendet werden (die möglicherweise auf dieselbe EEPROM-Adresse schreiben). Schließlich müsste ich in meinem Kontext die ID von meinem PC lesen, was schwieriger ist. Die eindeutige USB-ID scheint mir interessanter zu sein.
jfpoilpret
Wenn dies eine generische Lösung sein soll (für die meisten Benutzer und eine Vielzahl von Karten), bedeutet die Verwendung der USB-ID, dass Benutzer von FTDI-Kabeln auf Karten ohne USB-> serielle Brücke dies nicht möchten in der Lage, Ihr System zu verwenden.
Cybergibbons
8

Bei einigen an einen Computer angeschlossenen Karten wird die Seriennummer veröffentlicht. Mein Arduino Uno R3 sagt

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

Obwohl ich nicht sicher bin, wie einzigartig es ist.

Federico Fissore
quelle
Haben alle Arduino-Boards eine solche Nummer? Es wäre schön, die Liste der Boards zu haben, die eine haben (oder nicht).
jfpoilpret
1
32u4-basierte Minen haben es nicht, 328- und SAM3X8E-Minen haben es
Federico Fissore
4

Nach meinem besten Wissen sind die USB-Chips alle mit einer eindeutigen Seriennummer versehen, zumindest für die FTDI-Chips. Unter Linux können Sie einfach eindeutige Gerätenamen zuweisen. Überprüfen Sie meine Website .

Abgesehen davon ist das, was Sie beschreiben, so ziemlich eine einfache Form der Versionskontrolle . Stellen Sie sicher, dass Ihre Quelldateien Versionsnummern haben. Um Ihren Arduino zu identifizieren, können Sie Serial.Print();während dessen den Namen und die Version des Codes eingeben setup();.

jippie
quelle
Ja, die Versionskontrolle ist mehr oder weniger das, was ich erreichen möchte. Es ist jedoch keine Option, eine Version im Code festzulegen und bei jeder Änderung des Codes zu ändern (zu leicht zu vergessen). Ich verwende derzeit Github für meine Skizzen, möchte aber leicht herausfinden, welche Version welcher Skizze derzeit auf einem Board ausgeführt wird.
jfpoilpret
4
Es gibt ein Makro für Datum und Uhrzeit der Kompilierung __DATE__und __TIME__. Zumindest können Sie diese Informationen also automatisch in Ihrer .hex-Datei @jfpoilpret
jippie
Gut, ich hatte nicht über diese Makros für die Versionierung nachgedacht.
jfpoilpret
2

Ich bezweifle, dass Ihnen die USB-Schnittstelle des Uno eine eindeutige Seriennummer gibt. Jede Zahl wäre Teil des Codes, der auf den Chip hochgeladen wird, und wäre daher für mehrere Unos gleich.

Ein Ansatz ist der DS2401-Chip "Silicon Serial Number", der die Ein-Draht-Schnittstelle verwendet. Das würde nur einen freien Pin und einen Code erfordern (der Code wäre möglicherweise das Problem).

Die am wenigsten aufdringliche und wahrscheinlich zuverlässigste Methode wäre, den Code einfach zurückzulesen und die Summe zu überprüfen. Genau das mache ich mit meinem Chipsignaturdetektor . Dies erkennt jedoch nur (wie aktuell geschrieben) die Bootloader-Signatur. Eine ziemlich kleine Änderung und es könnte MD5-Summe des gesamten Skizzencodes sein.

Beispielausgabe:

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 

Diese MD5-Summe (letzte Zeile) ist effektiv die Signatur dieses bestimmten Bootloaders. Tatsächlich schlägt die neueste Version sie in einer Tabelle nach:

MD5 sum of bootloader = FB F4 9B 7B 59 73 7F 65 E8 D0 F8 A5 08 12 E7 9F 
Bootloader name: optiboot_atmega328

Sie können also beim Hochladen einer Skizze eine MD5-Summe des Hex-Codes generieren. Es gibt ziemlich einfache Möglichkeiten, dies zu tun. Dann könnten Sie eine "Git-Tag" -Operation für Ihren Quellcode ausführen und sich dann (mithilfe eines automatisierten oder manuellen Prozesses) daran erinnern, dass eine bestimmte MD5-Summe von Hex-Code den Skizzencode zu einem bestimmten Zeitpunkt darstellt.

Eine Art Datenbank wie:

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

Um die Quelle von der Karte aus zu lokalisieren, müssen Sie die MD5-Summe des Codes ermitteln (indem Sie ihn von der Karte zurücklesen) und ihn dann in Ihrer Datenbank nachschlagen.

Nick Gammon
quelle
1

Ich habe einen Ein-Draht-Temperatursensor angeschlossen, der jeweils mit einem einzigartigen Ich geliefert wird. Alle Skizzen lasen das, was ich beim Booten hatte, und schrieben die Adresse auf jede serielle Verbindung. Ich habe ein Schild mit der ganzen Hardware erstellt, die ich brauchte. Wenn ich also von Uno auf Mega upgraden musste, behielt das Gerät seine einzigartige Qualität.

vlad b.
quelle
0

Es gibt eine winzige Bibliothek zum Lesen und Schreiben Ihrer benutzerdefinierten Hardware-ID in das EEPROM. Sie können es verwenden, um zu vermeiden, dass eine falsche Skizze auf Ihr Arduino übertragen wird, oder um das Gerät für andere Zwecke zu identifizieren.

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

Haftungsausschluss: Ich bin Autor der Bibliothek :-)

Gingo
quelle