ArduinoUniqueID: ID único nativo no Arduino!

Você sabia que a placa do Arduino possui um ID único, uma espécie de MAC address? É basicamente isso que a biblioteca ArduinoUniqueID faz, ela retorna esse valor de identificação do chip. O mais interessante é que essa característica não está descrita no datasheet do microcontrolador atmega328p (Arduino Uno), e como que eu acabei descobrindo esse hidden ID?

 

Hidden Serial Number

 

Tudo começou quando decidi compra alguns chips atmega328p em SMD para um projeto utilizando LoRa. O problema é que acabei comprando a versão ‘b’ do chip, no caso atmega328pb, que é uma versão bofada do atmega328p.

 

Chip Atmega328pb - Use a ArduinoUniqueID para ler Unique ID
Figura 01 - Chip Atmega328pb

 

Mas o que tem de diferente um chip do outro? Este datasheet demonstra exatamente isso.

 

A parte interessante dessa versão bufada é que ela possui um ‘Serial Number’, um número de série de 10 bytes único em cada chip. Já que o projeto que estava desenvolvendo era com LoRa, esse detalhe me chamou a atenção. No caso seria uma maneira de identificar cada placa sem precisar criar vários códigos.

 

Pensando...Talvez o chip atmega328p possuísse esse número de série, mas o datasheet não fala nada sobre...

 

Sim, o Arduino possui um número de série não oficial. Pelos testes que fiz, o atmega328p possui um número de série com 9 bytes. E acabei encontrando algo que confirma essa teoria, um datasheet antigo da versão ‘b’ que mostra que o chip possui um número serial de 9 bytes.

 

Pensando assim outros chips da Atmel devem ter essa característica. No caso, testei os chips Atmega2560 e Attiny85, mostrando que esses chips possuem um número serial de 9 bytes.

 

Para simplificar as coisas, desenvolvi uma biblioteca para poder obter esse número de série.

 

ArduinoUniqueID

 

Esta biblioteca permite obter o número de série de alguns chips, como Atmel AVR, SAM, SAMD e ESP. Você pode baixar a biblioteca utilizando o gerenciador de bibliotecas dentro do Arduino IDE, basta procurar ArduinoUniqueID. Ou pode baixar pelo github, que possui toda a documentação da mesma.

 

Para começar a utilizar a biblioteca é muito simples, basta inserir este include:

 

Para visualizar o número de série do chip basta inserir a função UniqueIDdump() depois do Serial.begin.

 

Neste caso vamos ter algo parecido com isto no monitor serial:

 

Já que a biblioteca funciona em diversos tipos de chips e cada chip possui uma quantidade de bytes de UniqueID, adicionei uma variável UniqueID8 que retorna os 8 últimos bytes do número serial.

 

Utilizando a função UniqueID8dump é possível visualizar:

 

Claro, você pode utilizar o exemplo da biblioteca para poder verificar o número de série do chip. Reference no github sempre é um bom local pra verificar os features da biblioteca. Se você achou esse feature útil, be free to use!

NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Luiz Henrique Cassettari
Me formei em engenheira elétrica em 2012 e desde então sou fascinado por eletrônica, programação e inovação. Hoje trabalho com projetos elétricos no Revit e sempre tento melhorar o fluxo de trabalho usando algoritimos e soluções inteligentes. Além disso, trabalho com design de PCB no Eagle, modelagem 3D no Fusion e no Revit, e conheço algumas linguagens de programação, como C#, Java e PHP. Sou responsável pelo projeto LoRaNow que tem como objetivo desenvolver hardware e software open source utilizando a tecnologia LoRa.

6
Deixe um comentário

avatar
 
5 Comment threads
1 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
4 Comment authors
Weider Oliveira duarteEuclides Franco de RezendeEwerton LeandroWeider Oliveira duarteGIOVANNY MELO Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Euclides Franco de Rezende
Visitante
E

E como faz para por em uma variável em vez de enviar para a serial???
Se toda vez que precisar disso, eu tiver que ler pela serial, usar um desktop pendurado no Arduino e criar um programa pra devolver o código pro Arduino...
Seja prático, ponha em variáveis a saída de qualquer coisa. O usuário decide se quer ou não mandar pra serial.
Grato pela compreensão.

Weider Oliveira duarte
Visitante
weider

amigo, veja abaixo o exemplo que postei, o exemplo ensina a fazer o que você deseja.

Ewerton Leandro
Visitante
Ewerton

Parabéns!

Weider Oliveira duarte
Membro
weideraju

Incrível Luiz, funcionou !

Eu criei um código que aproveita o resultado da sua biblioteca pra criar sketchs unicos, que so rodam em um unico arduino.
Isso abre a porta para criacao de Hard Keys com arduino, e projetos ultra seguros.
Cara, muito obrigado por ter compartilhado o conhecimento.

GIOVANNY MELO
Visitante
GIOVANNY MELO

Muito bom!

Weider Oliveira duarte
Visitante
Weider Oliveira Duarte

Incrivel, nao tenho um arduino a mao agira, mas amanha eu test, ja imaginou o potencial dessa descoberta pra evitar a clonagem de projetos ou codigos? AfinL ja li que era possivel extrair o .HEX e instalar em outro chip, mas com uma id nativa a cada chip, isso se tornara quase impossivel. Obrigado.