題:
如何獲得我所有Arduino板的唯一ID?
jfpoilpret
2014-02-18 04:27:43 UTC
view on stackexchange narkive permalink

將草圖上傳到您的Arduino板之一後,很難確切知道導致該草圖的源代碼。

實際上,您可以在自己的草圖上更改草圖的源代碼。 PC,而無需將其(以二進制格式)更新到您的電路板上。我的一個董事會的草圖。然後,我可以稍後檢索在我的任意板上運行的草圖的源代碼。

對於這樣的存儲庫,我首先需要有一個“ index ”這樣一來,我就可以知道草圖源代碼鏈接到哪個板

通常,這樣的索引對於每個arduino板都應該是唯一的。

因此,我的問題是:如何獲得Arduino開發板的唯一ID?

編輯:

這是我當前的開發板列表(最小列表由單個唯一ID方法支持)

  • UNO R3
  • Mega 2560
  • Yun
  • Arduino機器人(必須是2個等效的Leonardo板)

將來,我可能還會構建自己的板(Uno等效板,但沒有FTDI的準系統),因此,如果某個方法也支持這些板變得更好。

@jfpoilpret ...只是在仔細閱讀該站點時看到了這篇文章。.您是否找到解決方案,或者是最佳實現方案?
七 答案:
Cybergibbons
2014-02-18 14:27:20 UTC
view on stackexchange narkive permalink

您可以在此處使用多種技術來獲得唯一的ID。

  1. FTDI芯片上已編程了唯一的序列號。據我所知,只能從連接的PC端進行訪問。
  2. 某些內置USB的芯片(例如ATmega8U2 / 16U2 / 32U2)在簽名數據中具有唯一的ID。 ,通常用於USB。可以從連接的兩側輕鬆訪問。其中包括用作USB->串行橋Arduino Uno R3的ATmega16U2。
  3. 某些具有內置USB的芯片,但簽名中沒有唯一ID的USB仍將編程有唯一ID用於引導程序或DFU(設備固件升級)的堆棧(例如LUFA)。
  4. 其中有很多芯片具有全局唯一的序列ID,例如Microchip的 11AA02E48,所有的Dallas 1-Wire傳感器(包括通用的DS18B20溫度傳感器)以及其他串行EEPROM。我在必須具有唯一MAC地址的生產硬件中使用了這些硬件。
  5. 您可以修改標準的Optiboot引導加載程序(或使用的任何船載程序),以便它可以保存並使用唯一的ID進行響應。
  6. ol>

    這些問題是,除了5個選項之外,沒有其他選項可以在所有板上使用。

    如果您的解決方案將是通用的,我會建議不要使用USB ID。我有約30個基於Arduino的板,其中只有5個內置USB硬件。所有其他組件都需要外部FTDI電纜進行編程。這意味著它們都將具有相同的ID。

您對** 30 **板*做什麼*?
主要用於無線傳感器網絡。我只有幾個真正的Arduino—— Duemilanova,Seeeduino Mega和Uno。所有其他人都是Teensy,Jenodes,WiNodes,Nanodes和RFus。
+1列出所有可能的選項,謝謝!我寧願避免4.,因為我不想在所有主板上添加特定的硬件。 5.看起來很危險(很容易將相同的修改過的Bootloader上載到2個不同的板上)並且麻煩(需要為每個板上載不同的Bootloader源碼來上載)。到目前為止,USB ID和FTDI似乎是不錯的解決方案,但是它們可以與我目前使用的所有主板一起使用嗎?
Arduino是否具有全局唯一的序列號?怎麼看?
sachleen
2014-02-18 05:37:06 UTC
view on stackexchange narkive permalink

據我所知,該芯片沒有任何唯一的ID ....但是您可以將其編程到板的EEPROM中。

EEPROM加密

您將寫一個特定的地址,然後以後的草圖可以讀取該ID並對其進行任何處理。


您也許還可以看到一個不固定的ID或地址在主機端。我對USB設備了解不多,無法告訴您更多信息,但是處理USB通信的芯片可能具有可以使用的唯一ID。但是,您的Arduino代碼將無法使用它。

或者,只需使用標籤製造商並在每塊板上貼上標籤即可。

就問題的獨特方面而言,[GUID](http://en.wikipedia.org/wiki/Globally_unique_identifier)可以解決這個問題(誤差很小)。
我最初曾想過使用EEPROM。但這需要為每個開發板進行額外的工作:創建一個新的唯一ID,然後將其寫入EEPROM。另外,我的草圖所使用的庫可能不兼容(可能會寫入相同的EEPROM地址)。最後,在我的上下文中,我需要從PC讀取ID,這比較困難。 USB唯一ID對我來說似乎更有趣。
根據我的回答,如果您希望這是一個通用的解決方案(對於大多數人和各種各樣的主板而言),那麼依靠USB ID意味著在沒有USB-> Serial網橋的主板上使用FTDI電纜的人們就不會能夠使用您的系統。
Federico Fissore
2014-02-18 05:45:14 UTC
view on stackexchange narkive permalink

某些板連接到計算機時,會發布其序列號。我的Arduino Uno R3說

  [16818.451423] usb 3-2:序列號:85235353137351E02242  

儘管我不確定它的獨特性。 >

所有的Arduino開發板都有這個數字嗎?擁有一個(或沒有)板的列表會很好。
看看地雷,沒有基於32u4的地雷,有328和SAM3X8E的有地雷
jippie
2014-02-18 11:19:19 UTC
view on stackexchange narkive permalink

據我所知,USB芯片都帶有唯一的序列號,至少對於FTDI芯片而言。在Linux上,您可以輕鬆地從中分配唯一的設備名稱,請訪問我的網站

除此之外,您所描述的幾乎是版本控制的一種簡單形式。確保您的源文件具有版本號。要識別您的Arduino,可以在 setup(); 期間使其成為 Serial.Print(); 名稱和代碼版本。

是的,版本控製或多或少是我想要實現的目標。但是無法在代碼中設置版本並在每次代碼更改時都進行更改(太容易忘記)。我目前在素描中使用github,但我想輕鬆地找出當前在板上運行的素描的哪個版本。
有一個宏用於編譯日期和時間“ __DATE__”和“ __TIME__”。因此,至少您可以自動將該信息存儲在您的.hex文件@jfpoilpret中
好一點,我沒有考慮過這些用於版本控制的宏。
Nick Gammon
2015-09-03 11:25:11 UTC
view on stackexchange narkive permalink

我懷疑Uno上的USB接口是否為您提供了唯一的序列號。任何數字都將是上傳到芯片上的代碼的一部分,因此在多個Unos中是相同的。

一種方法是使用單線接口的DS2401“矽序列號”芯片。那將只需要一個空閒的引腳,並需要一些代碼(可能是代碼問題。)

侵入性最小的方法,可能也是最可靠的方法,將是簡單地讀回代碼並求和-檢查。這正是我使用芯片簽名檢測器所做的。但是,它僅檢測(按當前寫入方式)引導加載程序簽名。

輸出示例:

 簽名檢測器。作者:NickGammon。Signature= 1E 95 0F FusesLow = FF高= D6外部= FF鎖定= CF處理器= ATmega328P閃存大小= 32768正在使用引導加載程序:是EEPROM通過擦除保留:是看門狗定時器始終開啟:從7E00開始NoBootloader為512字節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總和= 56 72 75 2D 5D B5 0D BA 25 10 DF BE 87 D2 A1 27  

MD5總和(最後一行)是有效的有效地表示該特定引導加載程序的簽名。實際上,最新版本會在表中查找它們:

  MD5自舉程序總和= FB F4 9B 7B 59 73 7F 65 E8 D0 F8 A5 08 12 E7 9F自舉程序名稱:optiboot_atmega328 代碼> 

因此,您可以做的是,在上傳草圖時,生成十六進制代碼的MD5總和。有相當簡單的方法可以做到這一點。然後,您可以在源代碼上執行“ git tag”操作,然後(使用某種自動或手動過程)記住,特定時刻MD5的十六進制代碼總和表示草圖代碼。

某種數據庫,例如:

 芯片:UnoMD5總和:D8 8C 70 6D FE 1F DC 38 82 1E CE AE 23 B2 E6 E7草圖:My_robot_sketch_42.inoGit標籤:version666  

現在可以從開發板上找到源代碼,您可以建立代碼的MD5總和(通過從開發板中讀取回來),然後在數據庫中查找它。

vlad b.
2015-09-03 12:20:07 UTC
view on stackexchange narkive permalink

我連接了一個單線溫度傳感器,每個溫度傳感器都具有唯一的標識。所有草圖都讀取了啟動時的編號,並在每個串行連接上寫入了地址。我用了所需的所有硬件作為防護罩,因此,如果需要從Uno升級到Mega,該設備將保持其獨特的性能。

gingo
2018-03-06 02:59:43 UTC
view on stackexchange narkive permalink

有一個很小的庫,用於將您的自定義硬件ID讀寫到EEPROM。您可以使用它來避免將錯誤的草圖推入Arduino或為其他目的識別設備。

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

免責聲明:我是圖書館的作者:-) >



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...