Comment puis-je obtenir un identifiant unique pour toutes mes cartes Arduino?

27

Une fois que vous avez téléchargé un croquis sur l'une de vos cartes Arduino, il est difficile de savoir exactement quel code source a conduit à ce croquis.

En effet, vous pouvez modifier le code source de votre sketch sur votre PC sans le mettre à jour (au format binaire) sur votre carte.

J'ai eu l'idée de mettre en place une sorte de " dépôt de croquis " qui serait rempli dès que je téléchargerais un croquis sur une de mes planches. Ensuite, je pourrais récupérer, plus tard, le code source d'un croquis exécuté sur l'une de mes planches.

Pour un tel référentiel, je devrais d'abord avoir un " index " qui me permettrait de savoir à quelle carte le code source de l'esquisse est lié.

En règle générale, un tel index doit être unique pour chaque carte Arduino unique.

D'où ma question: comment obtenir un identifiant unique pour une carte Arduino?

Modifier:

Voici ma liste actuelle de cartes (la liste miniumum devant être prise en charge par une seule approche d'identification unique):

  • UNO R3
  • Mega 2560
  • Yun
  • Arduino Robot (qui doit être 2 cartes équivalentes Leonardo)

À l'avenir, je pourrai peut-être également créer mes propres cartes (équivalent Uno mais barebones, sans FTDI), donc si une approche les prend également en charge, ce serait mieux.

jfpoilpret
la source
1
@jfpoilpret ... viens de voir ce message en parcourant le site ... avez-vous trouvé une solution, ou le meilleur scénario sur la façon de mettre en œuvre cela?
dinotom

Réponses:

14

Il existe un certain nombre de techniques que vous pouvez utiliser ici pour obtenir un ID unique.

  1. Les puces FTDI ont un numéro de série unique programmé dessus. Pour autant que je sache, cela n'est accessible que du côté PC de la connexion.
  2. Certaines puces avec USB intégré (par exemple ATmega8U2 / 16U2 / 32U2) ont un ID unique dans les données de signature, normalement utilisé pour USB. Accessible facilement des deux côtés de la connexion. Cela inclut l'ATmega16U2 qui est utilisé comme pont USB-> Série Arduino Uno R3.
  3. Certaines puces avec USB intégré mais sans ID unique dans la signature auront toujours un ID unique programmé dans la pile USB (par exemple LUFA) utilisée pour le chargeur de démarrage ou DFU (Device Firmware Upgrade).
  4. Il y a beaucoup de puces avec des ID de série uniques au monde, par exemple la Microchip 11AA02E48 , tous les capteurs Dallas 1-Wire (y compris le capteur de température DS18B20 commun) et d'autres EEPROM de série. Je les ai utilisés dans du matériel de production qui doit avoir une adresse MAC unique.
  5. Vous pouvez modifier le chargeur de démarrage Optiboot standard (ou le chargeur de bateau que vous utilisez) afin qu'il puisse contenir et répondre avec un ID unique.

Le problème avec ces derniers est qu'il n'y a pas d'option sauf 5 qui fonctionnera sur toutes les cartes.

Si votre solution va être générique, je dirais que l'utilisation d'un ID USB n'est pas la voie à suivre. J'ai environ 30 cartes basées sur Arduino, et seulement 5 d'entre elles ont un matériel USB intégré. Tous les autres ont besoin d'un câble FTDI externe pour être programmés. Cela signifie qu'ils auraient tous le même identifiant.

Cybergibbons
la source
2
Que voulez - vous faire avec 30 planches?
asheeshr
Principalement pour les réseaux de capteurs sans fil. Je n'ai que quelques vrais Arduinos - un Duemilanova, un Seeeduino Mega et un Uno. Tous les autres sont Teensy, Jeenodes, WiNodes, Nanodes et RFus.
Cybergibbons
1
+1 pour une liste complète des options possibles, merci! Je préfère éviter 4. car je ne veux pas ajouter de matériel spécifique à toutes mes cartes. 5. semble dangereux (facile à télécharger le même chargeur de démarrage modifié sur 2 cartes différentes) et encombrant (besoin d'avoir un code source de chargeur de démarrage différent à télécharger pour chaque carte). Jusqu'à présent, l'ID USB et le FTDI semblent de très bonnes solutions, mais fonctionnent-ils avec toute ma carte actuelle?
jfpoilpret
Arduino a-t-il des ID de série uniques au monde? Comment le lire?
lanse7pty
13

La puce n'a aucune sorte d'ID unique pour autant que je sache ... mais vous pouvez en programmer un dans l'EEPROM de vos cartes.

Documentation EEPROM

Vous écririez à une adresse spécifique, puis les futurs croquis pourront lire l'ID et faire quoi que ce soit avec.


Vous pouvez également voir un identifiant ou une adresse non valide côté hôte. Je ne connais pas suffisamment les périphériques USB pour vous en dire plus, mais la puce qui gère la communication USB peut avoir un identifiant unique que vous pouvez utiliser. Cependant, votre code Arduino ne pourrait pas l'utiliser.

Alternativement, utilisez simplement une étiqueteuse et mettez une étiquette sur chaque planche.

sachleen
la source
2
En ce qui concerne l'aspect unique de la question, un GUID pourrait résoudre ce problème (dans une toute petite marge d'erreur).
Matthew G.18
J'avais initialement pensé à utiliser l'EEPROM pour cela; mais cela nécessite un travail supplémentaire pour chaque carte obtenir: créer un nouvel ID unique, puis l'écrire dans l'EEPROM. En outre, il peut y avoir des incompatibilités avec les bibliothèques utilisées par mes croquis (qui peuvent écrire dans la même adresse EEPROM). Enfin, dans mon contexte, je devrais lire l'ID de mon PC, ce qui est plus difficile. L'identifiant unique USB me semble plus intéressant.
jfpoilpret
Selon ma réponse, si vous voulez que ce soit une solution générique (pour la plupart des gens et une large gamme de cartes), s'appuyer sur l'ID USB signifie que les personnes utilisant des câbles FTDI sur des cartes sans USB-> Pont série ne seraient pas capable d'utiliser votre système.
Cybergibbons
8

Certaines cartes, lorsqu'elles sont connectées à un ordinateur, publient leur numéro de série. Mon Arduino Uno R3 dit

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

Même si je ne sais pas à quel point c'est unique.

Federico Fissore
la source
Toutes les cartes Arduino ont-elles un tel numéro? Ce serait bien d'avoir la liste des conseils qui en ont un (ou pas).
jfpoilpret
1
En regardant les mines, celles basées sur 32u4 n'en ont pas, 328 et SAM3X8E l'ont
Federico Fissore
4

À ma connaissance, les puces USB sont toutes fournies avec un numéro de série unique, au moins pour les puces FTDI. Sous Linux, vous pouvez facilement attribuer des noms d'appareils uniques à partir de cela, consultez mon site Web .

En dehors de cela, ce que vous décrivez est à peu près une forme simple de contrôle de version . Assurez-vous que vos fichiers source ont des numéros de version. Pour identifier votre Arduino, vous pouvez lui faire le Serial.Print();nom et la version du code pendant setup();.

jippie
la source
Oui, le contrôle de version est plus ou moins ce que je veux réaliser; mais mettre une version dans le code et la changer à chaque fois que le code change n'est pas une option (trop facile à oublier). J'utilise actuellement github pour mes croquis, mais j'aimerais savoir facilement quelle version de quel croquis est actuellement en cours d'exécution sur une carte.
jfpoilpret
4
Il existe une macro pour la date et l'heure de compilation __DATE__et __TIME__. Donc, au moins, vous pouvez stocker automatiquement ces informations dans votre fichier .hex @jfpoilpret
jippie
Bon point, je n'avais pas pensé à ces macros pour le versioning.
jfpoilpret
2

Je doute que l'interface USB de l'Uno vous donne un numéro de série unique. Tout numéro ferait partie du code téléchargé sur la puce qui serait donc le même parmi plusieurs Unos.

Une approche est la puce DS2401 "Silicon Serial Number" qui utilise l'interface à un fil. Cela ne nécessiterait qu'une seule broche gratuite et du code (le code pourrait être le problème, éventuellement).

La méthode la moins intrusive, et probablement la plus fiable, serait simplement de relire le code et de le vérifier. C'est exactement ce que je fais avec mon détecteur de signature de puce . Cependant, cela ne détecte (comme actuellement écrit) que la signature du chargeur de démarrage. Un changement assez mineur et il pourrait résumer MD5 la totalité du code d'esquisse.

Exemple de sortie:

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 

Cette somme MD5 (dernière ligne) est effectivement la signature de ce chargeur de démarrage particulier. En fait, la version la plus récente les recherche dans un tableau:

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

Donc, ce que vous pourriez faire, c'est lors du téléchargement d'un croquis, générer une somme MD5 du code hexadécimal. Il existe des moyens assez simples de le faire. Ensuite, vous pouvez effectuer une opération "git tag" sur votre code source, puis (en utilisant un processus automatisé ou manuel) vous rappeler qu'une somme MD5 particulière de code hexadécimal représente le code d'esquisse à un moment particulier.

Une sorte de base de données comme:

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

Maintenant, pour localiser la source de la carte, vous établissez la somme MD5 du code (en la relisant à partir de la carte), puis la recherchez dans votre base de données.

Nick Gammon
la source
1

J'ai connecté un capteur de température à un fil qui est livré avec un unique. Toutes les esquisses lisent le je suis au démarrage et écrivent l'adresse sur chaque connexion série. J'ai fait un bouclier avec tout le matériel dont j'avais besoin, donc si je devais passer d'Uno à Mega, l'appareil garderait son caractère unique.

vlad b.
la source
0

Il y a une petite bibliothèque pour lire et écrire votre ID de matériel personnalisé dans l'EEPROM. Vous pouvez l'utiliser pour éviter de pousser un mauvais croquis sur votre Arduino ou pour identifier un appareil à d'autres fins.

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

Avertissement: je suis l'auteur de la bibliothèque :-)

gingo
la source