Come posso ottenere un ID univoco per tutte le mie schede Arduino?


27

Dopo aver caricato uno schizzo su una delle tue schede Arduino, è difficile sapere esattamente quale codice sorgente ha portato a quello schizzo.

In effetti, puoi modificare il codice sorgente del tuo schizzo sul tuo PC senza aggiornarlo (in formato binario) sulla tua scheda.

Ho avuto l'idea di creare una sorta di " repository di schizzi " che sarebbe stato popolato non appena avessi caricato uno schizzo su una delle mie schede. Quindi ho potuto recuperare, in seguito, il codice sorgente per uno schizzo in esecuzione su una qualsiasi delle mie schede.

Per tale repository, dovrei prima avere un " indice " che mi consenta di sapere a quale scheda è collegato il codice sorgente dello schizzo.

Tipicamente, un tale indice dovrebbe essere unico per ogni singola scheda arduino.

Da qui la mia domanda: come posso ottenere un ID univoco per una scheda Arduino?

Modificare:

Questo è il mio attuale elenco di schede (l'elenco miniumum che deve essere supportato da un unico approccio ID univoco):

  • UNO R3
  • Mega 2560
  • Yun
  • Arduino Robot (che deve essere 2 schede equivalenti Leonardo)

In futuro, potrei anche costruire le mie schede (equivalente Uno ma barebone, senza FTDI), quindi se un approccio supporta anche queste sarebbe meglio.


1
@jfpoilpret ... ho appena visto questo post mentre esaminavo il sito ... hai trovato una soluzione, o il caso migliore su come implementarlo?
dinotom,

Risposte:


14

Esistono diverse tecniche che è possibile utilizzare qui per ottenere un ID univoco.

  1. I chip FTDI hanno un numero seriale univoco programmato su di essi. Questo è accessibile solo dal lato PC della connessione, per quanto ne so.
  2. Alcuni chip con USB incorporato (ad es. ATmega8U2 / 16U2 / 32U2) hanno un ID univoco nei dati della firma, normalmente utilizzati per USB. È possibile accedere facilmente da entrambi i lati della connessione. Ciò include l'ATmega16U2 che viene utilizzato come USB-> Serial bridge Arduino Uno R3.
  3. Alcuni chip con USB incorporato ma nessun ID univoco nella firma avranno comunque un ID univoco programmato nello stack USB (ad es. LUFA) utilizzato per il bootloader o DFU (Device Firmware Upgrade).
  4. Esistono molti chip con ID seriali univoci a livello globale, ad es. Microchip 11AA02E48 , tutti i sensori Dallas 1-Wire (incluso il comune sensore di temperatura DS18B20) e altri EEPROM seriali. Li ho usati nell'hardware di produzione che deve avere un indirizzo MAC univoco.
  5. È possibile modificare il bootloader Optiboot standard (o qualsiasi caricatore di barche che si utilizza) in modo che possa contenere e rispondere con un ID univoco.

Il problema con questi è che non esiste alcuna opzione tranne 5 che funzioni su tutte le schede.

Se la tua soluzione sarà generica, suggerirei che l'utilizzo di un ID USB non è la soluzione migliore. Ho ~ 30 schede basate su Arduino e solo 5 di esse hanno hardware USB incorporato. Tutti gli altri hanno bisogno di un cavo FTDI esterno per essere programmati. Ciò significa che avrebbero tutti lo stesso ID.


2
Cosa fai con 30 tavole?
asheeshr,

Principalmente per reti di sensori wireless. Ho solo alcuni veri Arduinos: un Duemilanova, un Seeeduino Mega e uno. Tutti gli altri sono Teensy, Jeenodes, WiNodes, Nanodes e RFus.
Cybergibbons,

1
+1 per un elenco completo di possibili opzioni, grazie! Preferirei evitare 4. poiché non voglio aggiungere hardware specifico a tutte le mie schede. 5. sembra pericoloso (caricare facilmente lo stesso bootloader modificato su 2 schede diverse) e ingombrante (è necessario disporre di un codice sorgente di bootloader diverso da caricare per ogni scheda). Finora, USB ID e FTDI sembrano soluzioni abbastanza buone, ma funzionano con tutta la mia scheda attuale?
jfpoilpret,

Arduino ha ID seriali univoci a livello globale? Come leggerlo?
lanse7pty,

13

Il chip non ha alcun tipo di ID univoco per quanto ne so .... ma potresti programmarne uno nell'EEPROM delle tue schede.

Documentazione EEPROM

Scriveresti a un indirizzo specifico e quindi i futuri schizzi possono leggere l'ID e fare qualunque cosa con esso.


Potresti anche essere in grado di vedere un ID o indirizzo non richiesto sul lato host. Non so abbastanza sui dispositivi USB per dirti di più, ma il chip che gestisce la comunicazione USB potrebbe avere un ID univoco che potresti usare. Il tuo codice Arduino non sarebbe in grado di utilizzare questo, però.

In alternativa, basta usare un'etichettatrice e mettere un'etichetta su ciascuna scheda.


2
Per quanto riguarda l'aspetto unico della domanda, un GUID potrebbe risolverlo (entro un piccolo margine di errore).
Matthew G.

Inizialmente avevo pensato di usare la EEPROM per quello; ma ciò richiede un lavoro aggiuntivo per ogni scheda ottenuta: crea un nuovo ID univoco, quindi scrivilo nella EEPROM. Inoltre, potrebbero esserci incompatibilità con le librerie utilizzate dai miei schizzi (che possono scrivere allo stesso indirizzo EEPROM). Infine, nel mio contesto, avrei bisogno di leggere l'ID dal mio PC, il che è più difficile. L'ID univoco USB mi sembra più interessante.
jfpoilpret,

Secondo la mia risposta, se si desidera che questa sia una soluzione generica (per la maggior parte delle persone e una vasta gamma di schede), fare affidamento sull'ID USB significa che le persone che utilizzano cavi FTDI su schede senza USB-> Serial bridge non sarebbero in grado di usare il tuo sistema.
Cybergibbons,

8

Alcune schede, quando collegate a un computer, pubblicano il loro numero seriale. Il mio Arduino Uno R3 dice

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

Anche se non sono sicuro di quanto sia unico.


Tutte le schede Arduino hanno un numero simile? Sarebbe bello avere la lista delle schede che ne hanno una (o no).
jfpoilpret,

1
Guardando le miniere, quelle basate su 32u4 no, quelle 328 e SAM3X8E ce l'hanno
Federico Fissore,

4

Per quanto ne so, i chip USB hanno tutti un numero di serie univoco, almeno per i chip FTDI. Su Linux puoi facilmente assegnare nomi di dispositivi univoci da quello, controlla il mio sito web .

A parte questo, quello che stai descrivendo è praticamente una semplice forma di controllo della versione . Assicurati che i tuoi file sorgente abbiano numeri di versione. Per identificare il tuo Arduino, puoi renderlo il Serial.Print();nome e la versione del codice durante setup();.


Sì, il controllo della versione è più o meno quello che voglio ottenere; ma impostare una versione nel codice e cambiarla ogni volta che il codice cambia non è un'opzione (troppo facile da dimenticare). Attualmente uso github per i miei schizzi, ma vorrei scoprire facilmente quale versione di quale schizzo è attualmente in esecuzione su una scheda.
jfpoilpret,

4
C'è una macro per la data e l'ora della compilazione __DATE__e __TIME__. Quindi almeno puoi archiviare automaticamente queste informazioni nel tuo file .hex @jfpoilpret
jippie

Bene, non avevo pensato a queste macro per il controllo delle versioni.
jfpoilpret,

2

Dubito che l'interfaccia USB su Uno ti dia un numero seriale univoco. Qualsiasi numero farebbe parte del codice caricato nel chip che sarebbe quindi lo stesso tra più Unos.

Un approccio è il chip DS2401 "Silicon Serial Number" che utilizza l'interfaccia One-wire. Ciò richiederebbe solo un pin libero e un po 'di codice (il codice sarebbe il problema, possibilmente).

Il metodo meno invadente, e probabilmente il più affidabile, sarebbe semplicemente rileggere il codice e verificarlo. Questo è esattamente ciò che faccio con il mio rilevatore di firma chip . Tuttavia, rileva solo (come attualmente scritto) la firma del bootloader. Una modifica abbastanza piccola e potrebbe sommare MD5 all'intero codice di schizzo.

Esempio di output:

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 

Quella somma MD5 (ultima riga) è effettivamente la firma di quel particolare bootloader. In effetti la versione più recente li cerca in una tabella:

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

Quindi quello che potresti fare è, quando carichi uno schizzo, generare una somma MD5 del codice esadecimale. Ci sono modi abbastanza semplici per farlo. Quindi è possibile eseguire un'operazione di "tag git" sul codice sorgente e quindi (utilizzando un processo automatizzato o manuale) ricordare che una particolare somma MD5 di codice esadecimale rappresenta il codice di schizzo in un determinato momento.

Una sorta di database come:

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

Ora per individuare l'origine dalla scheda, si stabilisce la somma MD5 del codice (rileggendolo dalla scheda) e quindi si cerca nel database.


1

Ho collegato un sensore di temperatura a un filo che ciascuno viene fornito con un unico io. Tutti gli schizzi leggono l'avvio di avvio e scrivono l'indirizzo su ogni connessione seriale. Ho creato uno scudo con tutto l'hardware di cui avevo bisogno, quindi se avessi bisogno di passare da Uno a Mega il dispositivo sarebbe rimasto unico.


0

C'è una piccola libreria per leggere e scrivere il tuo ID hardware personalizzato su EEPROM. Puoi usarlo per evitare di spingere lo sketch errato sul tuo Arduino o per identificare il dispositivo per altri scopi.

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

Disclaimer: sono l'autore della biblioteca :-)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.