Bagaimana saya bisa mendapatkan ID unik untuk semua papan Arduino saya?

27

Setelah Anda mengunggah sketsa ke salah satu papan Arduino Anda, sulit untuk mengetahui persis apa yang menyebabkan kode sumber sketsa itu.

Memang, Anda dapat mengubah kode sumber sketsa di PC Anda tanpa memperbaruinya (dalam format biner) ke papan Anda.

Saya memiliki ide untuk menyiapkan semacam " repositori sketsa " yang akan diisi segera setelah saya mengunggah sketsa ke salah satu papan saya. Kemudian saya bisa mengambil, nanti, kode sumber untuk sketsa yang berjalan di salah satu papan saya.

Untuk repositori seperti itu, pertama-tama saya perlu memiliki " indeks " yang memungkinkan saya mengetahui papan kode sumber sketsa mana yang ditautkan.

Biasanya, indeks seperti itu harus unik untuk setiap papan Arduino tunggal.

Maka pertanyaan saya: bagaimana saya bisa mendapatkan ID unik untuk papan Arduino?

Edit:

Ini adalah daftar board saya saat ini (daftar miniumum yang didukung oleh pendekatan ID unik tunggal):

  • UNO R3
  • Mega 2560
  • Yun
  • Robot Arduino (harus terdiri dari 2 papan setara Leonardo)

Di masa depan, saya juga dapat membangun papan sendiri (Uno setara tetapi barebone, tanpa FTDI), maka jika pendekatan juga mendukung ini yang akan lebih baik.

jfpoilpret
sumber
1
@ jfpoilpret ... baru saja melihat posting ini sambil membaca situs dengan seksama..apakah Anda menemukan solusi, atau skenario kasus terbaik tentang cara mengimplementasikannya?
dinotom

Jawaban:

14

Ada sejumlah teknik yang bisa Anda gunakan di sini untuk mendapatkan ID unik.

  1. Chip FTDI memiliki nomor seri unik yang diprogram pada mereka. Ini hanya dapat diakses dari sisi koneksi PC sejauh yang saya ketahui.
  2. Beberapa chip dengan bawaan USB (mis. ATmega8U2 / 16U2 / 32U2) memiliki ID unik dalam data tanda tangan, biasanya digunakan untuk USB. Dapat dengan mudah diakses dari kedua sisi koneksi. Ini termasuk ATmega16U2 yang digunakan sebagai USB-> Serial bridge Arduino Uno R3.
  3. Beberapa chip dengan bawaan USB tetapi tidak ada ID unik di tanda tangan masih akan memiliki ID unik yang diprogram ke dalam tumpukan USB (misalnya LUFA) yang digunakan untuk bootloader atau DFU (Peningkatan Firmware Perangkat).
  4. Ada banyak chip dengan ID seri global unik di dalamnya, misalnya Microchip 11AA02E48 , semua sensor Dallas 1-Wire (termasuk sensor suhu DS18B20 umum), dan EEPROMS serial lainnya. Saya telah menggunakan ini dalam perangkat keras produksi yang harus memiliki alamat MAC yang unik.
  5. Anda dapat memodifikasi bootloader Optiboot standar (atau pemuat kapal mana pun yang Anda gunakan) sehingga dapat menahan dan merespons dengan ID unik.

Masalah dengan ini adalah bahwa tidak ada pilihan kecuali 5 yang akan bekerja di semua papan.

Jika solusi Anda akan menjadi yang umum, saya akan menyarankan bahwa menggunakan USB ID bukan jalan ke depan. Saya memiliki ~ 30 papan berbasis Arduino, dan hanya 5 di antaranya yang memiliki perangkat keras USB. Semua dari mereka membutuhkan kabel FTDI eksternal untuk diprogram. Ini berarti mereka semua akan memiliki ID yang sama.

Cybergibbons
sumber
2
Apa yang Anda lakukan dengan 30 papan?
asheeshr
Terutama untuk jaringan sensor nirkabel. Saya hanya punya beberapa Arduino asli - Duemilanova, Seeeduino Mega, dan Uno. Yang lainnya adalah Teensy, Jeenodes, WiNodes, Nanodes dan RFus.
Cybergibbons
1
+1 untuk daftar lengkap opsi yang memungkinkan, terima kasih! Saya lebih suka menghindari 4. karena saya tidak ingin menambahkan perangkat keras khusus untuk semua papan saya. 5. terlihat berbahaya (mudah untuk mengunggah bootloader yang dimodifikasi ke 2 papan yang berbeda) dan rumit (perlu memiliki kode sumber bootloader yang berbeda untuk diunggah untuk setiap papan). Sejauh ini, USB ID dan FTDI tampaknya merupakan solusi yang cukup baik, tetapi apakah mereka bekerja dengan semua board saya saat ini?
jfpoilpret
Apakah Arduino memiliki ID seri unik secara global? Bagaimana cara membacanya?
lanse7pty
13

Chip tidak memiliki ID unik apa pun sejauh yang saya tahu .... tetapi Anda dapat memprogram satu ke dalam EEPROM papan Anda.

Dokumentasi EEPROM

Anda akan menulis ke alamat tertentu dan kemudian sketsa di masa depan dapat membaca ID dan melakukan apa pun dengannya.


Anda juga dapat melihat ID atau alamat yang tidak sesuai pada sisi host. Saya tidak cukup tahu tentang perangkat USB untuk memberi tahu Anda lebih banyak, tetapi chip yang menangani komunikasi USB mungkin memiliki ID unik yang dapat Anda gunakan. Kode Arduino Anda tidak akan dapat menggunakan ini.

Atau, cukup gunakan pembuat label dan letakkan label di setiap papan.

sachleen
sumber
2
Sejauh aspek unik dari pertanyaan, GUID dapat menyelesaikannya (dalam beberapa kesalahan kecil).
Matius G.
Saya awalnya berpikir untuk menggunakan EEPROM untuk itu; tapi itu membutuhkan pekerjaan tambahan untuk setiap papan dapatkan: buat ID unik baru, lalu tulis ke EEPROM. Juga, mungkin ada ketidakcocokan dengan perpustakaan yang digunakan oleh sketsa saya (yang dapat menulis ke alamat EEPROM yang sama). Akhirnya dalam konteks saya, saya perlu membaca ID dari PC saya, yang lebih sulit. ID unik USB tampaknya lebih menarik bagi saya.
jfpoilpret
Sesuai jawaban saya, jika Anda ingin ini menjadi solusi umum (bagi kebanyakan orang, dan berbagai papan), mengandalkan USB ID berarti bahwa orang yang menggunakan kabel FTDI di papan tanpa USB-> Serial bridge tidak akan dapat menggunakan sistem Anda.
Cybergibbons
8

Beberapa papan, saat terhubung ke komputer, menerbitkan nomor seri mereka. My Arduino Uno R3 berkata

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

Meskipun saya tidak yakin betapa uniknya itu.

Federico Fissore
sumber
Apakah semua papan Arduino memiliki nomor seperti itu? Akan menyenangkan untuk memiliki daftar papan yang memiliki satu (atau tidak).
jfpoilpret
1
Melihat tambang, 32u4 yang berbasis tidak, 328 dan yang SAM3X8E memilikinya
Federico Fissore
4

Sepengetahuan saya, semua chip USB datang dengan nomor seri yang unik, setidaknya untuk chip FTDI. Di Linux Anda dapat dengan mudah menetapkan nama perangkat unik dari itu, periksa situs web saya .

Selain itu, apa yang Anda gambarkan adalah bentuk kontrol versi yang sederhana . Pastikan file sumber Anda memiliki nomor versi. Untuk mengidentifikasi Arduino Anda, Anda dapat membuatnya Serial.Print();nama dan versi kode selama setup();.

jippie
sumber
Ya kontrol versi kurang lebih apa yang ingin saya capai; tetapi mengatur versi dalam kode dan mengubahnya setiap kali kode itu berubah bukanlah suatu pilihan (terlalu mudah untuk dilupakan). Saat ini saya menggunakan github untuk sketsa saya, tetapi saya ingin dengan mudah mengetahui versi sketsa apa yang saat ini berjalan di satu papan.
jfpoilpret
4
Ada makro untuk tanggal dan waktu kompilasi __DATE__dan __TIME__. Jadi setidaknya Anda dapat secara otomatis menyimpan info itu di file .hex Anda @jfpoilpret
jippie
Poin baiknya, saya belum memikirkan makro ini untuk versi.
jfpoilpret
2

Saya ragu bahwa antarmuka USB di Uno memberi Anda nomor seri yang unik. Angka apa pun akan menjadi bagian dari kode yang diunggah ke chip yang karenanya akan sama di antara banyak Unos.

Salah satu pendekatan adalah chip "Silicon Serial Number" DS2401 yang menggunakan antarmuka One-wire. Itu hanya akan memerlukan satu pin gratis, dan beberapa kode (kode akan menjadi masalah, mungkin).

Metode yang paling tidak mengganggu, dan mungkin yang paling dapat diandalkan, adalah dengan hanya membaca kembali kode dan menjumlahkannya. Itulah tepatnya yang saya lakukan dengan detektor tanda tangan chip saya . Namun itu hanya mendeteksi (seperti yang ditulis saat ini) tanda tangan bootloader. Perubahan yang cukup kecil dan bisa MD5-jumlah seluruh kode sketsa.

Contoh output:

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 

Jumlah MD5 itu (baris terakhir) secara efektif merupakan tanda tangan dari bootloader tertentu. Faktanya, versi terbaru melihatnya dalam sebuah tabel:

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

Jadi yang dapat Anda lakukan adalah, saat mengunggah sketsa, menghasilkan jumlah MD5 dari kode hex. Ada beberapa cara sederhana untuk melakukan itu. Kemudian Anda bisa melakukan operasi "git tag" pada kode sumber Anda, dan kemudian (menggunakan beberapa proses otomatis atau manual) ingat bahwa jumlah MD5 tertentu dari kode hex mewakili kode sketsa pada saat tertentu.

Beberapa jenis database seperti:

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

Sekarang untuk mencari sumber dari papan, Anda menetapkan jumlah MD5 kode (dengan membacanya kembali dari papan) dan kemudian mencarinya di database Anda.

Nick Gammon
sumber
1

Saya menghubungkan sensor satu kawat temp yang masing-masing datang dengan saya yang unik. Semua sketsa membaca Aku akan boot dan menulis alamat pada setiap koneksi serial. Saya membuat perisai dengan semua perangkat keras yang saya butuhkan jadi jika saya perlu meningkatkan dari Uno ke Mega perangkat tetap unik saya akan.

vlad b.
sumber
0

Ada perpustakaan kecil untuk membaca dan menulis ID perangkat keras khusus Anda ke EEPROM. Anda dapat menggunakannya untuk menghindari mendorong sketsa yang salah ke Arduino Anda atau untuk mengidentifikasi perangkat untuk tujuan lain.

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

Penafian: Saya penulis perpustakaan :-)

gingo
sumber