ฉันจะรับ ID เฉพาะสำหรับบอร์ด Arduino ทั้งหมดได้อย่างไร


27

เมื่อคุณอัปโหลดภาพร่างไปยังบอร์ด Arduino ของคุณแล้วมันก็ยากที่จะรู้ว่าซอร์สโค้ดใดที่นำไปสู่ภาพร่างนั้น

แน่นอนคุณสามารถเปลี่ยนซอร์สโค้ดร่างของคุณบนพีซีโดยไม่ต้องอัปเดต (ในรูปแบบไบนารี) เป็นบอร์ดของคุณ

ฉันมีความคิดในการตั้งค่า " พื้นที่เก็บข้อมูลร่าง " ซึ่งจะมีผู้เข้าชมทันทีที่ฉันอัปโหลดภาพร่างไปยังหนึ่งในบอร์ดของฉัน จากนั้นฉันก็สามารถเรียกคืนได้ในภายหลังรหัสที่มาสำหรับร่างที่ทำงานบนกระดานใด ๆ ของฉัน

สำหรับพื้นที่เก็บข้อมูลนั้นฉันต้องมี " ดัชนี " ก่อนซึ่งจะทำให้ฉันรู้ว่าบอร์ดซอร์สโค้ดร่างใดเชื่อมโยงอยู่

โดยทั่วไปดัชนีดังกล่าวควรมีความพิเศษสำหรับบอร์ด Arduino ทุกแผ่น

ดังนั้นคำถามของฉัน: ฉันจะรับ ID เฉพาะสำหรับบอร์ด Arduino ได้อย่างไร

แก้ไข:

นี่คือรายการบอร์ดปัจจุบันของฉัน (รายการ miniumum ที่จะสนับสนุนด้วยวิธีการ ID ที่ไม่ซ้ำกัน)

  • UNO R3
  • ล้าน 2560
  • หยุน
  • Arduino Robot (ต้องมีบอร์ดเทียบเท่า Leonardo 2 ตัว)

ในอนาคตฉันอาจสร้างบอร์ดของตัวเอง (Uno ที่เทียบเท่า แต่ไม่ได้ใช้ FTDI) ดังนั้นหากวิธีการสนับสนุนสิ่งเหล่านี้จะดีกว่า


1
@jfpoilpret ... เพิ่งเห็นโพสต์นี้ในขณะที่อ่านเว็บไซต์นี้คุณพบโซลูชันหรือสถานการณ์กรณีที่ดีที่สุดเกี่ยวกับวิธีการใช้งานหรือไม่
dinotom

คำตอบ:


14

มีหลายเทคนิคที่คุณสามารถใช้ที่นี่เพื่อรับรหัสที่ไม่ซ้ำกัน

  1. ชิป FTDI มีหมายเลขซีเรียลอันเป็นเอกลักษณ์ที่ตั้งโปรแกรมไว้ สิ่งนี้สามารถเข้าถึงได้จากด้านพีซีของการเชื่อมต่อเท่าที่ฉันทราบ
  2. ชิปบางตัวที่มี USB ในตัว (เช่น ATmega8U2 / 16U2 / 32U2) มี ID เฉพาะในข้อมูลลายเซ็นซึ่งโดยปกติจะใช้สำหรับ USB สามารถเข้าถึงได้ง่ายจากทั้งสองด้านของการเชื่อมต่อ ซึ่งรวมถึง ATmega16U2 ที่ใช้เป็น USB-> Serial Bridge Arduino Uno R3
  3. ชิปบางตัวที่มี USB ในตัว แต่ไม่มี ID เฉพาะในลายเซ็นจะยังคงมีรหัสเฉพาะที่ตั้งโปรแกรมไว้ในสแต็ก USB (เช่น LUFA) ที่ใช้สำหรับ bootloader หรือ DFU (อัปเกรดอุปกรณ์เฟิร์มแวร์)
  4. มีชิปมากมายที่มีซีเรียลนัมเบอร์ไอดีที่ไม่เหมือนใครในโลกเช่น Microchip 11AA02E48เซ็นเซอร์ดัลลัส 1-Wire ทั้งหมด (รวมถึงเซ็นเซอร์อุณหภูมิ DS18B20 ทั่วไป) และ EEPROMS อนุกรมอื่น ๆ ฉันใช้สิ่งเหล่านี้ในฮาร์ดแวร์การผลิตที่ต้องมีที่อยู่ MAC ที่ไม่ซ้ำกัน
  5. คุณสามารถปรับเปลี่ยน bootloader Optiboot มาตรฐาน (หรือตัวโหลดเรือใดก็ตามที่คุณใช้) เพื่อให้สามารถเก็บและตอบสนองด้วย ID เฉพาะ

ปัญหาเกี่ยวกับสิ่งเหล่านี้คือไม่มีตัวเลือกยกเว้น 5 ที่สามารถใช้งานได้กับทุกกระดาน

หากวิธีการแก้ปัญหาของคุณจะเป็นวิธีทั่วไปฉันขอแนะนำให้ใช้ USB ID ไม่ใช่วิธีการส่งต่อ ฉันมีบอร์ด Arduino ประมาณ 30 บอร์ดและมีเพียง 5 บอร์ดเท่านั้นที่สร้างขึ้นในฮาร์ดแวร์ USB ที่เหลือทั้งหมดของพวกเขาต้องการสายเคเบิล FTDI ภายนอกที่จะตั้งโปรแกรม ซึ่งหมายความว่าพวกเขาทุกคนจะมีรหัสเดียวกัน


2
คุณทำอะไรกับบอร์ด30บอร์ด
asheeshr

ส่วนใหญ่สำหรับเครือข่ายเซ็นเซอร์ไร้สาย ฉันมี Arduinos ตัวจริงเพียงไม่กี่ตัว - Duemilanova, Seeeduino Mega และ Uno ส่วนคนอื่น ๆ ก็คือ Teensy, Jeenodes, WiNodes, Nanodes และ RFus
Cybergibbons

1
+1 สำหรับรายการตัวเลือกที่เป็นไปได้ทั้งหมดขอบคุณ! ฉันควรหลีกเลี่ยง 4. เนื่องจากฉันไม่ต้องการเพิ่มฮาร์ดแวร์เฉพาะลงในบอร์ดของฉันทั้งหมด 5. ดูเป็นอันตราย (ง่ายต่อการอัปโหลด bootloader ที่แก้ไขเดียวกันไปยัง 2 บอร์ดที่แตกต่างกัน) และยุ่งยาก (ต้องมีซอร์สโค้ด bootloaders ที่แตกต่างกันเพื่ออัปโหลดสำหรับทุกบอร์ด) จนถึงตอนนี้ USB ID และ FTDI ดูเหมือนจะเป็นคำตอบที่ดี แต่มันทำงานกับบอร์ดปัจจุบันของฉันได้หรือไม่?
jfpoilpret

Arduino มีรหัสประจำตัวที่ไม่ซ้ำใครทั่วโลกหรือไม่? อ่านอย่างไร
lanse7pty

13

ชิปไม่มีรหัสเฉพาะใด ๆ เท่าที่ฉันรู้ .... แต่คุณสามารถตั้งโปรแกรมหนึ่งลงใน EEPROM ของบอร์ดของคุณได้

เอกสารกำกับ EEPROM

คุณจะเขียนไปยังที่อยู่ที่เฉพาะเจาะจงจากนั้นร่างในอนาคตสามารถอ่าน ID และทำอะไรกับมัน


นอกจากนี้คุณยังสามารถดู ID หรือที่อยู่ unqiue ที่ด้านโฮสต์ ฉันไม่รู้มากพอเกี่ยวกับอุปกรณ์ USB ที่จะบอกคุณมากกว่านี้ แต่ชิปที่จัดการการสื่อสาร USB อาจมี ID เฉพาะที่คุณสามารถใช้ได้ แม้ว่ารหัส Arduino ของคุณจะไม่สามารถใช้สิ่งนี้ได้

หรือเพียงแค่ใช้เครื่องทำป้ายและวางป้ายบนกระดานแต่ละอัน


2
เท่าที่มีลักษณะเฉพาะของคำถามGUIDสามารถแก้ไขได้ (ภายในข้อผิดพลาดเล็กน้อย)
Matthew G.

ฉันเคยคิดว่าจะใช้ EEPROM สำหรับสิ่งนั้น แต่นั่นต้องใช้งานเพิ่มเติมสำหรับทุกบอร์ดรับ: สร้าง ID ใหม่ที่ไม่ซ้ำกันจากนั้นเขียนไปยัง EEPROM นอกจากนี้อาจมีความเข้ากันไม่ได้กับห้องสมุดที่ใช้โดยร่างของฉัน (ซึ่งอาจเขียนไปยังที่อยู่ EEPROM เดียวกัน) สุดท้ายในบริบทของฉันฉันจะต้องอ่าน ID จากพีซีของฉันซึ่งยากกว่า ID เฉพาะของ USB นั้นน่าสนใจมากกว่าสำหรับฉัน
jfpoilpret

ตามคำตอบของฉันหากคุณต้องการให้นี่เป็นโซลูชันทั่วไป (สำหรับคนส่วนใหญ่และบอร์ดที่หลากหลาย) การใช้ USB ID หมายความว่าคนที่ใช้สายเคเบิล FTDI บนบอร์ดโดยไม่ใช้ USB-> Serial bridge จะไม่เป็นเช่นนั้น สามารถใช้ระบบของคุณ
Cybergibbons

8

บอร์ดบางบอร์ดเมื่อเชื่อมต่อกับคอมพิวเตอร์ให้เผยแพร่หมายเลขซีเรียล Arduino Uno R3 ของฉันบอกว่า

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

แม้ว่าฉันจะไม่แน่ใจว่ามันเป็นเอกลักษณ์


บอร์ด Arduino ทุกอันมีหมายเลขดังกล่าวหรือไม่? มันจะดีถ้ามีรายการของบอร์ดที่มีหนึ่งอัน (หรือไม่)
jfpoilpret

1
ดูที่เหมือง, คนที่ใช้ 32u4 ไม่, คนที่ 328 และ SAM3X8E มีอยู่
Federico Fissore

4

เพื่อความรู้ที่ดีที่สุดของฉันชิป USB ทั้งหมดมาพร้อมกับหมายเลขซีเรียลที่ไม่ซ้ำกันอย่างน้อยสำหรับชิป FTDI บน Linux คุณสามารถกำหนดชื่ออุปกรณ์ที่ไม่ซ้ำกันจากที่ตรวจสอบเว็บไซต์ของฉัน

อื่น ๆ กว่าที่สิ่งที่คุณจะอธิบายสวยมากเป็นรูปแบบที่เรียบง่ายของการควบคุมเวอร์ชัน ตรวจสอบให้แน่ใจว่าไฟล์ต้นฉบับของคุณมีหมายเลขเวอร์ชัน เพื่อแจ้ง Arduino ของคุณคุณสามารถทำให้มันชื่อและรุ่นของรหัสในช่วงSerial.Print();setup();


ใช่การควบคุมเวอร์ชันเป็นสิ่งที่ฉันต้องการให้มากขึ้นหรือน้อยลง; แต่การตั้งค่ารุ่นในรหัสและการเปลี่ยนแปลงทุกครั้งที่การเปลี่ยนแปลงรหัสไม่ใช่ตัวเลือก (ง่ายเกินไปที่จะลืม) ขณะนี้ฉันใช้ GitHub สำหรับงานสเก็ตช์ของฉัน แต่ฉันต้องการทราบว่าเวอร์ชันใดของสเก็ตช์ที่กำลังทำงานอยู่บนกระดานเดียว
jfpoilpret

4
มีแมโครวันรวบรวมและเวลาและ__DATE__ __TIME__ดังนั้นอย่างน้อยคุณสามารถจัดเก็บข้อมูลนั้นในไฟล์. hex ของคุณ @jfpoilpret ได้อย่างง่ายดาย
jippie

จุดดีฉันไม่ได้คิดเกี่ยวกับมาโครเหล่านี้สำหรับการกำหนดเวอร์ชัน
jfpoilpret

2

ฉันสงสัยว่าอินเตอร์เฟส USB ของ Uno ให้หมายเลขซีเรียลที่ไม่ซ้ำใคร หมายเลขใด ๆ จะเป็นส่วนหนึ่งของรหัสที่อัปโหลดไปยังชิปซึ่งจะเหมือนกันระหว่าง Unos หลาย ๆ อัน

วิธีหนึ่งคือชิป "หมายเลขซีเรียลของซิลิคอน" DS2401 ซึ่งใช้อินเทอร์เฟซ One-wire ที่จะต้องมีเพียงหนึ่งขาฟรีและรหัสบางอย่าง (รหัสจะเป็นปัญหาอาจเป็นไปได้)

วิธีที่ล่วงล้ำน้อยที่สุดและน่าจะเป็นวิธีที่น่าเชื่อถือที่สุดก็คือการอ่านโค้ดกลับมาและตรวจสอบผลรวม นั่นคือสิ่งที่ฉันทำกับฉันชิปตรวจจับลายเซ็น อย่างไรก็ตามจะตรวจพบลายเซ็น bootloader (ตามที่เขียนในปัจจุบัน) เท่านั้น การเปลี่ยนแปลงเล็กน้อยอย่างเป็นธรรมและมันสามารถ 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 นั้น (บรรทัดสุดท้าย) เป็นลายเซ็นของ bootloader นั้น ในความเป็นจริงแล้วเวอร์ชันล่าสุดจะค้นหาในตาราง:

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" ในซอร์สโค้ดของคุณและจากนั้น (โดยใช้กระบวนการอัตโนมัติหรือกระบวนการด้วยตนเอง) โปรดจำไว้ว่าผลรวม 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 อุปกรณ์จะคงความเป็นเอกลักษณ์เอาไว้


0

มีห้องสมุดขนาดเล็กสำหรับอ่านและเขียน ID ฮาร์ดแวร์ที่กำหนดเองของคุณไปยัง EEPROM คุณสามารถใช้มันเพื่อหลีกเลี่ยงการผลักร่างภาพที่ไม่ถูกต้องไปยัง Arduino ของคุณหรือเพื่อระบุอุปกรณ์สำหรับวัตถุประสงค์อื่น ๆ

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

คำเตือน: ฉันเป็นผู้เขียนของห้องสมุด :-)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.