如何获得我所有Arduino板的唯一ID?


27

将草图上传到您的Arduino板之一后,就很难确切知道导致该草图的源代码。

实际上,您可以在PC上更改草图的源代码,而无需将其(以二进制格式)更新到您的电路板上。

我有一个想法,就是要建立一种“ 草图存储库 ”,一旦我将一个草图上载到我的木板上,就会立即填充它。然后,我可以稍后检索在我的任何板上运行的草图的源代码。

对于这样的存储库,我首先需要有一个“ 索引 ”,使我能够知道草图源代码链接到哪个板

通常,这样的索引对于每个arduino板都应该是唯一的。

因此,我的问题是:如何获得Arduino板的唯一ID?

编辑:

这是我当前的板列表(单个唯一ID方法支持的最小列表):

  • UNO R3
  • 兆丰2560
  • Arduino机器人(必须是2个Leonardo等效板)

将来,我可能还会构建自己的板(Uno等效,但没有FTDI的准系统),因此,如果一种方法也支持这些板,那会更好。


1
@jfpoilpret ...只是在仔细阅读站点时看到了这篇文章。.您是否找到解决方案,或者是最佳实现方案?
dinotom '16

Answers:


14

您可以在此处使用多种技术来获取唯一的ID。

  1. FTDI芯片具有编程的唯一序列号。据我所知,只能从连接的PC端进行访问。
  2. 某些内置USB的芯片(例如ATmega8U2 / 16U2 / 32U2)在签名数据中具有唯一的ID,通常用于USB。可以从连接的两侧轻松访问。这包括ATmega16U2,用作USB->串行桥Arduino Uno R3。
  3. 某些具有内置USB但签名中没有唯一ID的芯片仍将具有唯一ID,该ID已编程到用于引导加载程序或DFU(设备固件升级)的USB堆栈中(例如LUFA)。
  4. 其中有许多芯片具有全局唯一的串行ID,例如Microchip 11AA02E48,所有Dallas 1-Wire传感器(包括通用的DS18B20温度传感器)和其他串行EEPROM。我在必须具有唯一MAC地址的生产硬件中使用了它们。
  5. 您可以修改标准的Optiboot引导加载程序(或使用的任何船载程序),以使其可以保存并使用唯一ID进行响应。

这些问题是,除了5个选项之外,没有其他选项可在所有板上使用。

如果您的解决方案将成为通用解决方案,我建议不要使用USB ID。我有约30个基于Arduino的板,其中只有5个内置USB硬件。所有其他组件都需要外部FTDI电缆进行编程。这意味着它们都将具有相同的ID。


2
你用30个板子什么?
asheeshr 2014年

主要用于无线传感器网络。我只有几个真正的Arduino—— Duemilanova,Seeeduino Mega和Uno。所有其他人都是Teensy,Jenodes,WiNodes,Nanodes和RFus。
Cyber​​gibbons

1
+1列出所有可能的选项,谢谢!我宁愿避免4.,因为我不想在所有主板上添加特定的硬件。5.看起来很危险(很容易将相同的修改过的Bootloader上载到2个不同的板上)并且麻烦(需要为每个板上载不同的Bootloader源码上载)。到目前为止,USB ID和FTDI似乎是不错的解决方案,但是它们可以与我目前使用的所有主板一起使用吗?
jfpoilpret 2014年

Arduino是否具有全局唯一的序列号?怎么看?
lanse7pty

13

据我所知,该芯片没有任何种类的唯一ID。但是您可以将其编程到板的EEPROM中。

EEPROM休眠

您将写入一个特定的地址,然后以后的草图可以读取该ID并对其进行任何处理。


您也许还可以在主机端看到一个不合法的ID或地址。我对USB设备了解不多,无法告诉您更多信息,但是处理USB通信的芯片可能具有可以使用的唯一ID。但是,您的Arduino代码将无法使用它。

或者,只需使用标签制造商并在每个板上贴上标签。


2
就问题的独特方面而言,GUID可以解决该问题(误差很小)。
马修·G。

我最初曾想过使用EEPROM。但这需要为每个开发板进行额外的工作:创建一个新的唯一ID,然后将其写入EEPROM。另外,我的草图所使用的库可能不兼容(可能会写入相同的EEPROM地址)。最后,在我的上下文中,我需要从PC读取ID,这比较困难。USB唯一ID对我来说似乎更有趣。
jfpoilpret 2014年

根据我的回答,如果您希望这是一个通用解决方案(对于大多数人和各种各样的主板而言),那么依靠USB ID意味着在没有USB-> Serial网桥的主板上使用FTDI电缆的人们就不会能够使用您的系统。
Cyber​​gibbons

8

一些主板连接到计算机时,会发布其序列号。我的Arduino Uno R3说

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

虽然我不确定它的独特性。


所有的Arduino开发板都有这个数字吗?拥有一个(或没有)板的列表会很不错。
jfpoilpret 2014年

1
看看地雷,没有基于32u4的地雷,有328和SAM3X8E的有地雷
Federico Fissore 2014年

4

据我所知,USB芯片都带有唯一的序列号,至少对于FTDI芯片而言。在Linux上,您可以轻松地为其分配唯一的设备名称,请访问我的网站

除此之外,您所描述的几乎是版本控制的一种简单形式。确保您的源文件具有版本号。为了标识您的Arduino,您可以Serial.Print();在期间为其指定名称和代码版本setup();


是的,版本控制或多或少是我想要实现的目标。但是不能在代码中设置版本并在每次代码更改时都进行更改(太容易忘记)。我目前在素描中使用github,但我想轻松地找出当前在板上运行的素描的哪个版本。
jfpoilpret 2014年

4
有编译日期和时间的宏观__DATE____TIME__。因此,至少您可以将这些信息自动存储在.hex文件@jfpoilpret中
jippie 2014年

好一点,我没有考虑过这些用于版本控制的宏。
jfpoilpret 2014年

2

我怀疑Uno上的USB接口是否为您提供了唯一的序列号。任何数字都将是上传到芯片的代码的一部分,因此在多个Unos中将是相同的。

一种方法是使用单线接口的DS2401“硅序列号”芯片。那将只需要一个空闲引脚和一些代码(可能是代码问题)。

侵入性最小的方法,也许是最可靠的方法,将是简单地读回代码并对其进行总和检查。这正是我使用芯片签名检测器所做的。但是,它仅检测(按当前编写方式)引导加载程序签名。相当小的更改,它可以MD5-求和整个草图代码。

输出示例:

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 

该MD5总和(最后一行)实际上是该特定引导程序的签名。实际上,最新版本在表中查找它们:

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

因此,您可以做的是,在上传草图时,生成十六进制代码的MD5总和。有相当简单的方法可以做到这一点。然后,您可以对源代码执行“ git tag”操作,然后(使用某种自动或手动过程)记住,特定MD5十六进制代码总和表示特定时刻的草图代码。

某种数据库,例如:

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

现在,要从开发板上找到源代码,就可以建立代码的MD5和(通过从开发板读回),然后在数据库中查找它。


1

我连接了一个单线温度传感器,每个温度传感器都配有一个独特的传感器。所有草图都读取了启动时的编号,并在每个串行连接上写入了地址。我用了我需要的所有硬件作为防护罩,因此,如果我需要从Uno升级到Mega,该设备将保持其独特的性能。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.