Làm thế nào tôi có thể nhận được một ID duy nhất cho tất cả các bo mạch Arduino của mình?


27

Một khi bạn đã tải lên một bản phác thảo cho một trong các bảng Arduino của bạn, thật khó để biết chính xác mã nguồn nào dẫn đến bản phác thảo đó.

Thật vậy, bạn có thể thay đổi mã nguồn của bản phác thảo trên PC mà không cần cập nhật nó (ở định dạng nhị phân) lên bảng của bạn.

Tôi đã có ý tưởng thiết lập một loại " kho lưu trữ phác thảo " sẽ được phổ biến ngay khi tôi tải một bản phác thảo lên một trong các bảng của mình. Sau đó, tôi có thể lấy lại, sau này, mã nguồn cho một bản phác thảo chạy trên bất kỳ bảng nào của tôi.

Đối với một kho lưu trữ như vậy, đầu tiên tôi sẽ cần phải có một " chỉ số " mà sẽ cho phép tôi để biết mà hội đồng quản trị mã nguồn phác thảo được liên kết với.

Thông thường, một chỉ mục như vậy phải là duy nhất cho mỗi bảng arduino duy nhất.

Do đó câu hỏi của tôi: làm thế nào tôi có thể nhận được một ID duy nhất cho một bảng Arduino?

Chỉnh sửa:

Đây là danh sách bảng hiện tại của tôi (danh sách tối thiểu được hỗ trợ bởi một phương pháp ID duy nhất):

  • UNO R3
  • Số tiền lớn 2560
  • Vân
  • Arduino Robot (phải là 2 bảng tương đương Leonardo)

Trong tương lai, tôi cũng có thể xây dựng các bảng của riêng mình (Uno tương đương nhưng barebones, không có FTDI), do đó, nếu một cách tiếp cận cũng hỗ trợ những bảng này sẽ tốt hơn.


1
@jfpoilpret ... vừa thấy bài đăng này trong khi lướt qua trang web..có bạn tìm thấy một giải pháp, hoặc trường hợp tốt nhất về cách thực hiện điều này?
dinotom

Câu trả lời:


14

Có một số kỹ thuật bạn có thể sử dụng ở đây để có được một ID duy nhất.

  1. Các chip FTDI có một số sê-ri duy nhất được lập trình trên chúng. Điều này chỉ có thể được truy cập từ phía PC của kết nối theo như tôi biết.
  2. Một số chip có USB tích hợp (ví dụ ATmega8U2 / 16U2 / 32U2) có ID duy nhất trong dữ liệu chữ ký, thường được sử dụng cho USB. Có thể dễ dàng truy cập từ cả hai phía của kết nối. Điều này bao gồm ATmega16U2 được sử dụng làm USB-> Cầu nối nối tiếp Arduino Uno R3.
  3. Một số chip có USB tích hợp nhưng không có ID duy nhất trong chữ ký sẽ vẫn có ID duy nhất được lập trình vào ngăn xếp USB (ví dụ LUFA) được sử dụng cho bộ tải khởi động hoặc DFU (Nâng cấp phần sụn thiết bị).
  4. Có rất nhiều chip có ID nối tiếp duy nhất trên toàn cầu, ví dụ như Microchip 11AA02E48 , tất cả các cảm biến 1 dây của Dallas (bao gồm cảm biến nhiệt độ DS18B20 phổ biến) và EEPROMS nối tiếp khác. Tôi đã sử dụng chúng trong phần cứng sản xuất phải có một địa chỉ MAC duy nhất.
  5. Bạn có thể sửa đổi bộ tải khởi động Optiboot tiêu chuẩn (hoặc bất kỳ trình tải thuyền nào bạn sử dụng) để nó có thể giữ và phản hồi với một ID duy nhất.

Vấn đề với những điều này là không có tùy chọn nào ngoại trừ 5 sẽ hoạt động trên tất cả các bảng.

Nếu giải pháp của bạn sẽ là một giải pháp chung chung, tôi sẽ đề nghị rằng sử dụng ID USB không phải là cách chuyển tiếp. Tôi có ~ 30 bo mạch dựa trên Arduino và chỉ có 5 trong số chúng được tích hợp phần cứng USB. Tất cả những người còn lại cần một cáp FTDI bên ngoài để được lập trình. Điều này có nghĩa là tất cả họ sẽ có cùng một ID.


2
Bạn làm với 30 bảng?
asheeshr

Chủ yếu cho các mạng cảm biến không dây. Tôi chỉ có một vài Arduinos thực sự - một Duemilanova, Seeeduino Mega và Uno. Tất cả những người khác là Teensy, Jeenodes, WiNodes, Nanodes và RFus.
Cyberg Ribbon

1
+1 cho danh sách kỹ lưỡng các tùy chọn có thể, cảm ơn! Tôi muốn tránh 4. vì tôi không muốn thêm phần cứng cụ thể vào tất cả các bảng của mình. 5. có vẻ nguy hiểm (dễ dàng tải lên cùng một bộ tải khởi động đã sửa đổi lên 2 bảng khác nhau) và cồng kềnh (cần phải có mã nguồn của bộ tải khởi động khác nhau để tải lên cho mỗi bảng). Cho đến nay, USB ID và FTDI có vẻ là giải pháp khá tốt, nhưng chúng có hoạt động với tất cả các bo mạch hiện tại của tôi không?
jfpoilpret

Arduino có ID nối tiếp duy nhất trên toàn cầu không? Làm thế nào để đọc nó?
lanse7pty

13

Con chip không có bất kỳ loại ID duy nhất nào theo như tôi biết .... nhưng bạn có thể lập trình một loại vào EEPROM của các bo mạch của mình.

Tài liệu EEPROM

Bạn sẽ viết thư đến một địa chỉ cụ thể và sau đó các bản phác thảo trong tương lai có thể đọc ID và làm bất cứ điều gì với nó.


Bạn cũng có thể thấy ID hoặc địa chỉ unueue ở phía máy chủ. Tôi không biết đủ về các thiết bị USB để cho bạn biết thêm, nhưng việc xử lý chip Giao tiếp USB có thể có một ID duy nhất bạn có thể sử dụng. Mã Arduino của bạn sẽ không thể sử dụng điều này, mặc dù.

Ngoài ra, chỉ cần sử dụng một nhà sản xuất nhãn và đặt một nhãn trên mỗi bảng.


2
Theo khía cạnh duy nhất của câu hỏi, GUID có thể giải quyết điều đó (trong phạm vi sai số nhỏ).
Matthew G.

Ban đầu tôi đã nghĩ đến việc sử dụng EEPROM cho việc đó; nhưng điều đó đòi hỏi công việc bổ sung cho mỗi bảng nhận: tạo một ID duy nhất mới, sau đó viết nó vào EEPROM. Ngoài ra, có thể có sự không tương thích với các thư viện được sử dụng bởi các bản phác thảo của tôi (có thể ghi vào cùng một địa chỉ EEPROM). Cuối cùng, trong bối cảnh của tôi, tôi sẽ cần đọc ID từ PC, điều này khó hơn. ID duy nhất USB có vẻ thú vị hơn đối với tôi.
jfpoilpret

Theo câu trả lời của tôi, nếu bạn muốn đây là một giải pháp chung (đối với hầu hết mọi người và nhiều loại bảng), việc dựa vào ID USB có nghĩa là những người sử dụng cáp FTDI trên các bo mạch không có USB-> Cầu nối tiếp sẽ không có thể sử dụng hệ thống của bạn.
Dải băng

8

Một số bảng, khi được kết nối với máy tính, xuất bản số sê-ri của chúng. Arduino Uno R3 của tôi nói

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

Mặc dù tôi không chắc nó độc đáo như thế nào.


Có phải tất cả các bảng Arduino có một số như vậy? Sẽ thật tốt nếu có danh sách các bảng có một (hoặc không).
jfpoilpret

1
Nhìn vào các mỏ, những cái dựa trên 32u4 thì không, những cái 328 và SAM3X8E không có nó
Federico Fissore

4

Theo hiểu biết của tôi, tất cả các chip USB đều có một số sê-ri duy nhất, ít nhất là cho các chip FTDI. Trên Linux, bạn có thể dễ dàng gán tên thiết bị duy nhất từ ​​đó, kiểm tra trang web của tôi .

Ngoài ra, những gì bạn đang mô tả gần như là một hình thức kiểm soát phiên bản đơn giản . Đảm bảo các tệp nguồn của bạn có số phiên bản. Để xác định Arduino của bạn, bạn có thể đặt Serial.Print();tên và phiên bản mã trong đó setup();.


Có kiểm soát phiên bản ít nhiều là những gì tôi muốn đạt được; nhưng thiết lập một phiên bản trong mã và thay đổi nó mỗi khi mã thay đổi không phải là một tùy chọn (quá dễ quên). Tôi hiện đang sử dụng github cho các bản phác thảo của mình, nhưng tôi muốn dễ dàng tìm ra phiên bản nào của bản phác thảo hiện đang chạy trên một bảng.
jfpoilpret

4
Có một macro cho ngày và thời gian biên dịch __DATE____TIME__. Vì vậy, ít nhất bạn có thể tự động lưu trữ thông tin đó trong tệp .hex của bạn @jfpoilpret
jippie

Điểm hay, tôi đã không nghĩ về các macro này để tạo phiên bản.
jfpoilpret

2

Tôi nghi ngờ rằng giao diện USB trên Uno cung cấp cho bạn một số sê-ri duy nhất. Bất kỳ số nào cũng sẽ là một phần của mã được tải lên chip, do đó sẽ giống nhau giữa nhiều Unos.

Một cách tiếp cận là chip DS2401 "Số sê-ri Silicon" sử dụng giao diện Một dây. Điều đó sẽ chỉ yêu cầu một mã pin miễn phí và một số mã (mã có thể là vấn đề, có thể).

Phương pháp ít xâm nhập nhất và có lẽ là đáng tin cậy nhất sẽ chỉ đơn giản là đọc lại mã và kiểm tra tổng hợp. Đó là chính xác những gì tôi làm với máy dò chữ ký chip của tôi . Tuy nhiên, điều đó chỉ phát hiện (như được viết hiện tại) chữ ký bộ nạp khởi động. Một thay đổi khá nhỏ và nó có thể MD5 tổng hợp toàn bộ mã phác thảo.

Ví dụ đầu ra:

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 

Tổng MD5 đó (dòng cuối cùng) thực sự là chữ ký của bộ tải khởi động cụ thể đó. Trong thực tế, phiên bản gần đây nhất tìm kiếm chúng trong một bảng:

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

Vì vậy, những gì bạn có thể làm là, khi tải lên bản phác thảo, tạo tổng MD5 của mã hex. Có những cách khá đơn giản để làm điều đó. Sau đó, bạn có thể thực hiện thao tác "thẻ git" trên mã nguồn của mình và sau đó (sử dụng một số quy trình tự động hoặc thủ công) hãy nhớ rằng một tổng số mã hex MD5 cụ thể đại diện cho mã phác thảo tại một thời điểm cụ thể.

Một số loại cơ sở dữ liệu như:

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

Bây giờ để xác định nguồn từ bảng, bạn thiết lập tổng MD5 của mã (bằng cách đọc lại từ bảng) và sau đó tra cứu nó trong cơ sở dữ liệu của bạn.


1

Tôi đã kết nối một cảm biến nhiệt độ một dây mà mỗi cái đi kèm với một tôi. Tất cả các bản phác thảo đều đọc Tôi khi khởi động và viết địa chỉ trên mỗi kết nối nối tiếp. Tôi đã tạo một lá chắn với tất cả các phần cứng tôi cần vì vậy nếu tôi cần nâng cấp từ Uno lên Mega thì thiết bị vẫn giữ được sự độc đáo của tôi.


0

Có thư viện nhỏ để đọc và ghi ID phần cứng tùy chỉnh của bạn vào EEPROM. Bạn có thể sử dụng nó để tránh đẩy bản phác thảo sai vào Arduino của bạn hoặc để xác định thiết bị cho các mục đích khác.

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

Tuyên bố miễn trừ trách nhiệm: Tôi là tác giả của thư viện :-)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.