Bonjour,
j'ai lu les différents topics dans lesquels la question de la récupération du numéro de série d'un ATMEGA328 est posé. Il est répondu que c'est chose impossible pour la bonne raison qu'il n'existerait pas de numéro de série de ces puces. Alors quelqu'un pourrait-il me dire comment est récupéré le "SN" qui s'affiche lorsque l'on clique sur "récupérer les informations de la carte" dans l'IDE Arduino???
Merci
Bonjour,
Qu'est ce qui est affiché quand tu fais "récupérer les informations de la carte"?
Quand j'essaie avec une carte UNO j'ai "SN: (null)" semblant indiquer qu'effectivement il n'y a pas de numéro de série.
Effectivement je viens d'essayer avec une carte uno avec un ATmega16U et j'ai aussi un numéro de série.
Les ATmega8U, 16U et 32U ont un groupe de registres qui est décrit dans la datasheet. Les ATmega 128, 328, etc n'ont pas cette fonction.
ATmega8U2/16U2/32U2 includes a unique 10 bytes serial number located in the signature row.
This unique serial number can be used as a USB serial number in the device enumeration process. The pointer addresses to access this unique serial number are given in Table 23-6 on
page 236..
Les information que tu reçois sont celle relatives à l'USB.
Code du fabricant du CI
Code du CI
Les atmega n'ont qu'une signature : un "nom de famille".
Un atmega328p n'a pas la même signature qu'un atmega 328 ou qu'un atmega328pb.
Tout est dans la datasheet du produit à télécharger sur le site de microchip.
Ce qui est normal puisque ces produits gèrent directement l'USB contrairement aux atmega 128,328,etc
Merci à tous pour vos réponses.
Donc, si j'ai bien compris, le numéro de série qui s'affiche dans l'EDI Arduino c'est celui de la carte Uno et pas celui de l'Atmega.
Quel est l'instruction(s) qui permet de récupérer ce numéro?
Par exemple pour récupérer le n° de série d'un ESP il faut appeler "ESP.getChipId()"
Qu'elle est celle qui est utilisée dans le cas qui nous occupe?
Merci.
C’est le Nº d’un des composant de la carte, celui qui est visible depuis le PC (il gère la liaison série)
Malheureusement il n’y a pas d’API à ma connaissance pour aller le lire depuis le UNO lui même.
OK merci.
Ben je vais essayer de faire sans, mais c'est vraiment regrettable ce choix des concepteurs de l'Atmega328 ![]()
Il y a des tentatives pour avoir un numéro unique y compris sur 328p
Essayez
Jamais utilisé mais pour un Uno je suppose qu’ils utilisent le segment de boot qui a des infos sur le cristal et peut être c’est assez unique pour vous (cf la macro boot_signature_byte_get (addr))
Avant de regretter, sais-tu ce que cela représente d'inscrire un numéro de série sur un circuit intégré ?
Les circuits intégrés sont fabriqués sur des galettes de silicium de 30 cm de diamètre.
Une puce d'atmega doit faire au maximum 1 mm x 2 mm vu qu'elle tient dans un boitier de longueur hors tout égale à 5 mm.
1 puce = 2 mm2
1 galette = 70 000 mm2 soit environ 2000 puces (il faut retirer la surface occupée par les motifs de test).
Les masques de fabrication coutent approximativement 10 000 € -> impossible de les recommencer pour changer les numéros de série.
Toutes les puces ne sont pas fonctionnelles, les numéros de série seraient gâchés.
Si numéro de série, il y a, c'est qu'il y a des raisons impérieuses et l'inscription d'un numéro sur une puce se fait par une opération supplémentaire au laser, puce par puce.
Si vraiment, tu veux identifier tes cartes, pourquoi n'utilises-tu pas un code gravé dans l'eeprom de l'atmega ?
Les circuits qui font l'interface USB/série comme le FTDI ne font pas autrement : le fabricant livre des CI sans référence VID ni PID puisque quand il les fabrique il ne sait pas à qui il va les vendre.
Parce que l'entreprise machin qui utilise un FTDI peut très bien avoir ses propres Vid et Pid.
C'est le façonnier qui complète ces informations.
Tu peux aussi te renseigner comment on peut changer ces informations, reste à savoir si les EDI risquent de se trouver bloquée ou pas. Avec l'EDI arduino c'est possible, avec d'autre comme PlatformIO, je ne sais pas.
Si je ne sais pas exactement ce que cela représente d'inscrire un numéro de série sur une puce, je sais que d'autres le font sur des puces pas plus chères , voire moins, que des Atmega328; Par exemple les ESP de espressif.
Bien sûr je peux aller inscrire les infos que je souhaite dans l'EEPROM, mais il faut soit le faire avec un code spécifique, indépendamment du programme à exécuter ensuite sur la puce, soit implémenter tout un processus de reconnaissance entre deux puces si l'on veut pouvoir le faire de façon dynamique. Je ne suis ni façonnier ni fabriquant, juste un simple utilisateur qui continue de regretter que le fabriquant n'est pas jugé utile d'identifier ses puces.
Je te remercie de cette info. J'ai extrait le code qui m'intéressait, celui concernant les AVR, et j'ai testé sur les 3 Atmega368 à ma disposition. J'obtient effectivement des résultats différents pour chacun d'eux.
Je vais utiliser cela. Un seul regret c'est de ne pas comprendre exactement ce que sont les infos récupérées et donc le caractère unique de celles-ci. Peut-être qu'en continuant à chercher je finirais par trouver mais, au moins pour l'instant, je suis plus occupé par mon projet que par la réponse à cette question.
Encore merci.
J'apporte un complément. J'ai testé ce code ( boot_signature_byte_get (addr)) en sortant l'Atmega de la carte Uno et en le plaçant sur une planche à pain. La puce est donc le seul élément commun aux deux montages. J'obtiens le même résultat. Je ne sais donc toujours pas à quoi correspondent ces octets mais ils sont bien spécifiques à la puce. Qu'en à savoir sur combien de puces on peut retrouver les même codes...
En général, quand on se préoccupe de ce genre de problème, c'est pour des raisons de suivi, en production, en maintenance, etc.
Si le N° de série est absent du processeur, il existe des solutions :
- inscrire soi-même un N° de série dans la FLASH ou EEPROM du µcontrôleur, avec une gestion adéquate, base de données par exemple (déjà pratiqué).
- utiliser un composant dédié : DS2401
Alors pourquoi la poser ?
inscrire soi-même un N° de série dans la FLASH ou EEPROM du µcontrôleur, avec une gestion adéquate, base de données par exemple (déjà pratiqué).
Bien sûr que l'on peut faire cela, mais c'est ce que je disais, il faut développer du code spécifique là où il n'y en aurait pas eu besoin.
Alors pourquoi la poser ?
C'est de la question "d'où viennent les octets retournés par boot_signature_byte_get (addr) " dont je parlais, pas de la question à l'origine de mon post!!!
De plus "être plus intéressé par autre chose" ne signifie pas que cela ne m'intéresse pas mais seulement que ce n'est pas ma priorité.
On peut regretter que Arduino ne numérote pas ses cartes effectivement.
Je ne suis pas sûre que expressif numérote ses puces par contre?
Mais la question est plutôt que veux tu faire avec ce numéro de série ?
Je pense que ce sont en partie des infos de calibration mis en usine, (la doc dit For some MCU types, this function can also retrieve the factory-stored oscillator calibration bytes). On peut lire les octets entre 0x00 et 0x1f
Si si, je confirme que les ESP possède un SN qui est accessible par l'appel à ESP.getChipId(). Je l'utilise sans problème.
