Como posso obter um ID exclusivo para todas as minhas placas do Arduino?

27

Depois de fazer o upload de um esboço em uma de suas placas do Arduino, é difícil saber exatamente qual código fonte levou a esse esboço.

Na verdade, você pode alterar o código fonte do seu esboço no seu PC sem atualizá-lo (em formato binário) para o seu quadro.

Eu tive a ideia de configurar um tipo de " repositório de esboço " que seria preenchido assim que eu enviar um esboço para um dos meus quadros. Depois, pude recuperar, mais tarde, o código fonte de um esboço em execução em qualquer uma das minhas placas.

Para esse repositório, primeiro eu precisaria ter um " índice " que me permitisse saber a qual placa o código-fonte do esboço está vinculado.

Normalmente, esse índice deve ser exclusivo para todas as placas do arduino.

Daí a minha pergunta: como posso obter um ID exclusivo para uma placa Arduino?

Editar:

Esta é a minha lista atual de placas (a lista mínima a ser suportada por uma única abordagem de ID exclusiva):

  • UNO R3
  • Mega 2560
  • Yun
  • Robô Arduino (que deve ser 2 placas equivalentes a Leonardo)

No futuro, também posso construir minhas próprias placas (equivalente Uno, mas barebones, sem FTDI); portanto, se uma abordagem também oferecer suporte a elas, isso seria melhor.

jfpoilpret
fonte
11
@jfpoilpret ... acabei de ver esta postagem enquanto examinava o site ... você encontrou uma solução ou o melhor cenário para implementar isso?
Dinotom 2/05

Respostas:

14

Há várias técnicas que você pode usar aqui para obter um ID exclusivo.

  1. Os chips FTDI têm um número de série exclusivo programado para eles. Isso só pode ser acessado do lado da conexão com o PC, até onde eu saiba.
  2. Alguns dos chips com USB embutido (por exemplo, ATmega8U2 / 16U2 / 32U2) têm um ID exclusivo nos dados da assinatura, normalmente usado para USB. Pode ser acessado facilmente de ambos os lados da conexão. Isso inclui o ATmega16U2 usado como ponte USB-> Serial Arduino Uno R3.
  3. Alguns dos chips com USB embutido, mas nenhum ID exclusivo na assinatura ainda terão um ID exclusivo programado na pilha USB (por exemplo, LUFA) usada para o carregador de inicialização ou DFU (Atualização de firmware do dispositivo).
  4. Existem muitos chips com IDs de série exclusivos globalmente, por exemplo, o Microchip 11AA02E48 , todos os sensores de 1 fio de Dallas (incluindo o sensor de temperatura DS18B20 comum) e outras EEPROMS seriais. Eu os usei no hardware de produção que deve ter um endereço MAC exclusivo.
  5. Você pode modificar o carregador de inicialização Optiboot padrão (ou o carregador de barco que você usa) para que ele possa reter e responder com um ID exclusivo.

O problema é que não há opção, exceto a 5, que funcionará em todas as placas.

Se sua solução for genérica, sugiro que o uso de um ID USB não seja o caminho a seguir. Tenho ~ 30 placas baseadas em Arduino, e apenas 5 delas possuem hardware USB. Todos os demais precisam de um cabo FTDI externo para ser programado. Isso significa que todos teriam o mesmo ID.

Cybergibbons
fonte
2
O que você faz com 30 pranchas?
asheeshr
Principalmente para redes de sensores sem fio. Eu só tenho alguns Arduinos de verdade - um Duemilanova, um Seeeduino Mega e um Uno. Todos os outros são Teensy, Jeenodes, WiNodes, Nanodes e RFus.
Cybergibbons
11
+1 para obter uma lista completa de opções possíveis, obrigado! Prefiro evitar o 4. porque não quero adicionar hardware específico a todas as minhas placas. 5. parece perigoso (fácil de carregar o mesmo carregador de inicialização modificado para 2 placas diferentes) e complicado (precisa ter código-fonte de carregador de inicialização diferente para carregar para cada placa). Até agora, o USB ID e o FTDI parecem boas soluções, mas eles funcionam com toda a minha placa atual?
Jfpoilpret
O Arduino possui IDs de série exclusivos globalmente? Como lê-lo?
lanse7pty
13

Até onde eu sei, o chip não possui nenhum tipo de ID exclusivo ... mas você pode programar um na EEPROM de suas placas.

Documentação da EEPROM

Você escreveria para um endereço específico e, em seguida, esboços futuros poderão ler o ID e fazer o que quiser com ele.


Você também pode ver um ID ou endereço não solicitado no lado do host. Não sei o suficiente sobre dispositivos USB para lhe contar mais, mas o chip que lida com a comunicação USB pode ter um ID exclusivo que você possa usar. Seu código do Arduino não seria capaz de usar isso, no entanto.

Como alternativa, basta usar um fabricante de etiquetas e colocar uma etiqueta em cada placa.

sachleen
fonte
2
No que diz respeito ao aspecto exclusivo da pergunta, um GUID poderia resolver isso (dentro de uma pequena margem de erro).
Matthew G.
Eu originalmente pensara em usar a EEPROM para isso; mas isso exige trabalho adicional para cada placa: crie um novo ID exclusivo e, em seguida, grave-o na EEPROM. Além disso, pode haver incompatibilidades com as bibliotecas usadas pelos meus esboços (que podem gravar no mesmo endereço EEPROM). Finalmente, no meu contexto, eu precisaria ler o ID do meu PC, o que é mais difícil. O ID exclusivo do USB parece mais interessante para mim.
Jfpoilpret
De acordo com a minha resposta, se você quiser que essa seja uma solução genérica (para a maioria das pessoas e uma grande variedade de placas), confiar no ID USB significa que as pessoas que usam cabos FTDI em placas sem uma ponte USB-> Serial não seriam capaz de usar seu sistema.
Cybergibbons
8

Algumas placas, quando conectadas a um computador, publicam seu número de série. Meu Arduino Uno R3 diz

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

Embora eu não tenha certeza de como é único.

Federico Fissore
fonte
Todas as placas do Arduino têm esse número? Seria bom ter a lista de painéis que possuem um (ou não).
jfpoilpret
11
Olhando para minas, 32u4 aqueles baseados não, 328 e SAM3X8E aqueles que tê-lo
Federico Fissore
4

Que eu saiba, todos os chips USB vêm com um número de série único, pelo menos para os chips FTDI. No Linux, você pode atribuir facilmente nomes de dispositivos exclusivos a partir disso, consulte meu site .

Fora isso, o que você está descrevendo é basicamente uma forma simples de controle de versão . Verifique se os arquivos de origem têm números de versão. Para identificar seu Arduino, você pode torná-lo com o Serial.Print();nome e a versão do código durante setup();.

jippie
fonte
Sim, controle de versão é mais ou menos o que eu quero alcançar; mas definir uma versão no código e alterá-lo sempre que o código for alterado não é uma opção (fácil demais para esquecer). Atualmente, uso o github para meus esboços, mas gostaria de descobrir facilmente qual versão de qual esboço está sendo executada atualmente em um quadro.
Jfpoilpret
4
Há uma macro para data e hora da compilação __DATE__e __TIME__. Assim, pelo menos você pode armazenar automaticamente essa informação em sua .hex arquivo @jfpoilpret
jippie
Bom ponto, eu não tinha pensado nessas macros para controle de versão.
Jfpoilpret
2

Duvido que a interface USB no Uno ofereça um número de série único. Qualquer número faria parte do código carregado no chip, o que seria, portanto, o mesmo entre vários Unos.

Uma abordagem é o chip DS2401 "Silicon Serial Number", que usa a interface One-wire. Isso exigiria apenas um pino gratuito e algum código (o código seria o problema, possivelmente).

O método menos invasivo, e provavelmente o mais confiável, seria simplesmente ler novamente o código e fazer uma verificação sumária. É exatamente isso que faço com meu detector de assinatura de chip . No entanto, isso apenas detecta (como atualmente está escrito) a assinatura do carregador de inicialização. Uma alteração bastante pequena e poderia somar MD5 todo o código de esboço.

Exemplo de saída:

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 

Essa soma MD5 (última linha) é efetivamente a assinatura desse carregador de inicialização específico. De fato, a versão mais recente as procura em uma tabela:

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

Então, o que você pode fazer é, ao fazer upload de um esboço, gerar uma soma MD5 do código hexadecimal. Existem maneiras bastante simples de fazer isso. Depois, você pode fazer uma operação "tag git" no seu código-fonte e, em seguida (usando algum processo automatizado ou manual), lembrar que uma soma MD5 específica de código hexadecimal representa o código do esboço em um determinado momento.

Algum tipo de banco de dados como:

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

Agora, para localizar a fonte do quadro, você estabelece a soma MD5 do código (lendo-o novamente no quadro) e, em seguida, procura no seu banco de dados.

Nick Gammon
fonte
1

Conectei um sensor de temperatura de um fio, cada um com um eu único. Todos os esboços leram o eu na inicialização e escreveram o endereço em todas as conexões seriais. Eu fiz uma blindagem com todo o hardware necessário, então, se eu precisasse atualizar do Uno para o Mega, o dispositivo manteria o seu exclusivo.

vlad b.
fonte
0

Há uma pequena biblioteca para ler e gravar seu ID de hardware personalizado na EEPROM. Você pode usá-lo para evitar enviar esboços incorretos ao seu Arduino ou identificar o dispositivo para outros fins.

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

Disclaimer: Eu sou o autor da biblioteca :-)

gingo
fonte