¿Cómo puedo obtener una identificación única para todas mis placas Arduino?

27

Una vez que haya cargado un boceto en una de sus placas Arduino, es difícil saber exactamente qué código fuente llevó a ese boceto.

De hecho, puede cambiar el código fuente de su boceto en su PC sin actualizarlo (en formato binario) a su placa.

Tuve la idea de configurar una especie de " depósito de bocetos " que se llenaría tan pronto como cargara un boceto en uno de mis tableros. Entonces podría recuperar, más adelante, el código fuente de un boceto que se ejecuta en cualquiera de mis tableros.

Para tal repositorio, primero necesitaría tener un " índice " que me permitiera saber a qué tablero está vinculado el código fuente del boceto.

Por lo general, dicho índice debe ser único para cada placa arduino.

De ahí mi pregunta: ¿cómo puedo obtener una identificación única para una placa Arduino?

Editar:

Esta es mi lista actual de tableros (la lista mínima debe ser respaldada por un único enfoque de ID único):

  • UNO R3
  • Mega 2560
  • Yun
  • Robot Arduino (que deben ser 2 tableros equivalentes a Leonardo)

En el futuro, también puedo construir mis propios tableros (equivalente a Uno pero sin esquemas, sin FTDI), por lo tanto, si un enfoque también es compatible con estos, sería mejor.

jfpoilpret
fuente
1
@jfpoilpret ... acabo de ver esta publicación mientras examinaba el sitio ... ¿Encontraste una solución o el mejor de los casos sobre cómo implementar esto?
dinotom

Respuestas:

14

Hay una serie de técnicas que puede usar aquí para obtener una identificación única.

  1. Los chips FTDI tienen un número de serie único programado en ellos. Solo se puede acceder a esto desde el lado de la PC de la conexión hasta donde yo sé.
  2. Algunos de los chips con USB incorporado (por ejemplo, ATmega8U2 / 16U2 / 32U2) tienen una identificación única en los datos de la firma, que normalmente se usa para USB. Se puede acceder fácilmente desde ambos lados de la conexión. Esto incluye el ATmega16U2 que se usa como USB-> Serial bridge Arduino Uno R3.
  3. Algunos de los chips con USB incorporado pero sin ID única en la firma todavía tendrán una ID única programada en la pila USB (por ejemplo, LUFA) utilizada para el gestor de arranque o DFU (Actualización del firmware del dispositivo).
  4. Hay muchos chips con ID de serie únicos a nivel mundial, por ejemplo, el Microchip 11AA02E48 , todos los sensores Dallas 1-Wire (incluido el sensor de temperatura DS18B20 común) y otros EEPROMS en serie. Los he usado en hardware de producción que debe tener una dirección MAC única.
  5. Puede modificar el gestor de arranque Optiboot estándar (o el cargador de barco que utilice) para que pueda contener y responder con una identificación única.

El problema con estos es que no hay ninguna opción, excepto 5, que funcione en todos los tableros.

Si su solución va a ser genérica, sugeriría que usar una ID de USB no sea el camino a seguir. Tengo ~ 30 placas basadas en Arduino, y solo 5 de ellas tienen hardware USB incorporado. Todos los demás necesitan un cable FTDI externo para ser programado. Esto significa que todos tendrían la misma identificación.

Cybergibbons
fuente
2
¿Qué haces con 30 tablas?
asheeshr
Principalmente para redes inalámbricas de sensores. Solo tengo unos pocos Arduinos reales: un Duemilanova, un Seeeduino Mega y un Uno. Todos los demás son Teensy, Jeenodes, WiNodes, Nanodes y RFus.
Cybergibbons
1
+1 para obtener una lista completa de las posibles opciones, ¡gracias! Prefiero evitar 4. ya que no quiero agregar hardware específico a todas mis placas. 5. Parece peligroso (fácil de cargar el mismo gestor de arranque modificado en 2 placas diferentes) y engorroso (necesita tener un código fuente de gestor de arranque diferente para cargar en cada placa). Hasta ahora, ID de USB y FTDI parecen soluciones bastante buenas, pero ¿funcionan con toda mi placa actual?
jfpoilpret
¿Arduino tiene ID de serie únicas a nivel mundial? ¿Cómo leerlo?
lanse7pty
13

El chip no tiene ningún tipo de identificación única hasta donde yo sé ... pero podría programar uno en la EEPROM de sus placas.

Documentación EEPROM

Escribiría a una dirección específica y luego los bocetos futuros pueden leer la ID y hacer lo que sea con ella.


También es posible que pueda ver una ID o dirección no solicitada en el lado del host. No sé lo suficiente sobre dispositivos USB para contarle más, pero el chip que maneja la comunicación USB podría tener una identificación única que podría usar. Sin embargo, su código Arduino no podrá usar esto.

Alternativamente, solo use una rotuladora y coloque una etiqueta en cada pizarra.

Sachleen
fuente
2
En cuanto al aspecto único de la pregunta, un GUID podría resolver eso (dentro de un pequeño margen de error).
Matthew G.
Originalmente había pensado en usar la EEPROM para eso; pero eso requiere trabajo adicional para cada placa: cree una nueva ID única y luego escríbala en la EEPROM. Además, puede haber incompatibilidades con las bibliotecas utilizadas por mis bocetos (que pueden escribir en la misma dirección EEPROM). Finalmente en mi contexto, necesitaría leer la ID de mi PC, lo cual es más difícil. La identificación única de USB me parece más interesante.
jfpoilpret
Según mi respuesta, si desea que esta sea una solución genérica (para la mayoría de las personas y una amplia gama de placas), confiar en la identificación USB significa que las personas que usan cables FTDI en placas sin un puente USB-> Serial no serían capaz de usar tu sistema.
Cybergibbons
8

Algunas placas, cuando están conectadas a una computadora, publican su número de serie. Mi Arduino Uno R3 dice

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

Aunque no estoy seguro de lo único que es.

Federico Fissore
fuente
¿Todas las placas Arduino tienen ese número? Sería bueno tener la lista de tableros que tienen uno (o no).
jfpoilpret
1
Mirando las minas, las basadas en 32u4 no, las de 328 y SAM3X8E lo tienen
Federico Fissore
4

Que yo sepa, todos los chips USB vienen con un número de serie único, al menos para los chips FTDI. En Linux puede asignar fácilmente nombres de dispositivos únicos a partir de eso, consulte mi sitio web .

Aparte de eso, lo que está describiendo es más o menos una forma simple de control de versiones . Asegúrese de que sus archivos de origen tengan números de versión. Para identificar su Arduino, puede hacer que Serial.Print();nombre y versión del código durante setup();.

jippie
fuente
Sí, el control de versiones es más o menos lo que quiero lograr; pero configurar una versión en código y cambiarla cada vez que cambia el código no es una opción (demasiado fácil de olvidar). Actualmente uso github para mis bocetos, pero me gustaría averiguar fácilmente qué versión de qué boceto se está ejecutando actualmente en una placa.
jfpoilpret
44
Hay una macro para la fecha y hora de compilación __DATE__y __TIME__. Así que al menos puede almacenar automáticamente esa información en su archivo .hex @jfpoilpret
jippie
Buen punto, no había pensado en estas macros para el control de versiones.
jfpoilpret
2

Dudo que la interfaz USB en el Uno te dé un número de serie único. Cualquier número sería parte del código cargado en el chip, por lo que sería el mismo entre múltiples Unos.

Un enfoque es el chip DS2401 "Número de serie de silicio" que utiliza la interfaz de un cable. Eso solo requeriría un pin libre y algo de código (el código podría ser el problema, posiblemente).

El método menos intrusivo, y probablemente el más confiable, sería simplemente volver a leer el código y verificarlo. Eso es exactamente lo que hago con mi detector de firma de chip . Sin embargo, eso solo detecta (como está escrito actualmente) la firma del gestor de arranque. Un cambio bastante menor y podría sumar MD5 todo el código del boceto.

Salida de ejemplo:

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 

Esa suma MD5 (última línea) es efectivamente la firma de ese gestor de arranque en particular. De hecho, la versión más reciente los busca en una tabla:

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

Entonces, lo que podría hacer es, al cargar un boceto, generar una suma MD5 del código hexadecimal. Hay formas bastante simples de hacerlo. Luego, podría hacer una operación de "etiqueta git" en su código fuente, y luego (usando algún proceso automático o manual) recuerde que una suma MD5 particular de código hexadecimal representa el código de boceto en un momento particular.

Algún tipo de base de datos 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

Ahora para ubicar la fuente desde el tablero, establezca la suma MD5 del código (leyéndola desde el tablero) y luego búsquela en su base de datos.

Nick Gammon
fuente
1

Conecté un sensor de temperatura de un cable que viene con un único. Todos los bocetos leen el arranque de I y escribieron la dirección en cada conexión en serie. Hice un escudo con todo el hardware que necesitaba, por lo que si necesitaba actualizar de Uno a Mega, el dispositivo mantendría su carácter único.

vlad b.
fuente
0

Hay una pequeña biblioteca para leer y escribir su ID de hardware personalizado en EEPROM. Puede usarlo para evitar enviar un boceto incorrecto a su Arduino o para identificar el dispositivo para otros fines.

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

Descargo de responsabilidad: soy autor de la biblioteca :-)

gingo
fuente