모든 Arduino 보드의 고유 ID를 어떻게 얻을 수 있습니까?


27

Arduino 보드 중 하나에 스케치를 업로드 한 후에는 해당 소스를 어떤 소스 코드로 이끄는지를 정확히 알기가 어렵습니다.

실제로, 스케치를 보드로 업데이트하지 않고 PC에서 스케치의 소스 코드를 변경할 수 있습니다 (이진 형식).

보드 중 하나에 스케치를 업로드하자마자 채워지 는 일종의 " 스케치 저장소 "를 설정할 생각이있었습니다 . 그런 다음 나중에 내 보드에서 실행되는 스케치의 소스 코드를 검색 할 수 있습니다.

이러한 저장소의 경우 먼저 스케치 소스 코드가 연결된 보드 를 알 수 있는 " 색인 " 이 필요 합니다.

일반적으로 이러한 인덱스는 모든 단일 arduino 보드마다 고유해야합니다.

따라서 내 질문 : Arduino 보드의 고유 ID를 어떻게 얻을 수 있습니까?

편집하다:

이것은 현재 보드 목록입니다 (단일 고유 ID 방식으로 지원되는 최소 목록).

  • UNO R3
  • 메가 2560
  • Arduino 로봇 (Leonardo 동등한 보드 2 개 여야 함)

앞으로는 나 자신의 보드 (FTDI가없는 동등한 보드는 아니지만 베어 본)를 구축 할 수 있으므로 접근 방식이 더 나은 보드를 지원할 수 있습니다.


1
@ jfpoilpret ... 단지 사이트를 숙고 하면서이 게시물을 보았습니다.
dinotom

답변:


14

고유 ID를 얻기 위해 여기에서 사용할 수있는 여러 가지 기술이 있습니다.

  1. FTDI 칩에는 고유 한 일련 번호가 프로그래밍되어 있습니다. 이것은 내가 아는 한 연결의 PC 측에서만 액세스 할 수 있습니다.
  2. USB가 내장 된 일부 칩 (예 : ATmega8U2 / 16U2 / 32U2)은 서명 데이터에 고유 ID가 있으며 일반적으로 USB에 사용됩니다. 연결의 양쪽에서 쉽게 액세스 할 수 있습니다. 여기에는 USB-> 직렬 브리지 Arduino Uno R3로 사용되는 ATmega16U2가 포함됩니다.
  3. USB가 내장되어 있지만 서명에 고유 ID가없는 일부 칩에는 여전히 부트 로더 또는 DFU (Device Firmware Upgrade)에 사용되는 USB 스택 (예 : LUFA)에 고유 ID가 프로그래밍되어 있습니다.
  4. Microchip 11AA02E48 , 모든 Dallas 1-Wire 센서 (공통 DS18B20 온도 센서 포함) 및 기타 직렬 EEPROMS 와 같이 전 세계적으로 고유 한 일련 ID를 가진 칩이 많이 있습니다 . 나는 고유 한 MAC 주소를 가져야하는 프로덕션 하드웨어에서 이것을 사용했습니다.
  5. 고유 한 ID로 보유하고 응답 할 수 있도록 표준 Optiboot 부트 로더 (또는 사용중인 보트 로더)를 수정할 수 있습니다.

이것의 문제점은 모든 보드에서 작동하는 5 이외의 옵션이 없다는 것입니다.

솔루션이 일반적인 솔루션이라면 USB ID를 사용하는 것이 앞으로 나아지지 않는 것이 좋습니다. ~ 30 개의 Arduino 기반 보드가 있으며 그 중 5 개만 USB 하드웨어에 내장되어 있습니다. 나머지는 모두 프로그래밍 할 외부 FTDI 케이블이 필요합니다. 이는 모두 동일한 ID를 갖음을 의미합니다.


2
당신이 무엇을 30 개 보드?
asheeshr

주로 무선 센서 네트워크 용. 나는 Duemilanova, Seeeduino Mega 및 Uno와 같은 실제 Arduinos가 거의 없습니다. 다른 모든 것은 Teensy, Jeenodes, WiNodes, Nanodes 및 RFus입니다.
Cybergibbons

1
가능한 옵션의 전체 목록을 보려면 +1하십시오. 감사합니다! 모든 보드에 특정 하드웨어를 추가하고 싶지 않기 때문에 오히려 4를 피하고 싶습니다. 5. 위험한 것처럼 보임 (같은 수정 된 부트 로더를 2 개의 다른 보드에 업로드하기 쉬움) 및 번거로운 (모든 보드에 대해 다른 부트 로더 소스 코드를 업로드해야 함). 지금까지 USB ID 및 FTDI는 상당히 좋은 솔루션으로 보이지만 현재 모든 보드에서 작동합니까?
jfpoilpret

Arduino에는 전 세계적으로 고유 한 일련 ID가 있습니까? 읽는 방법?
lanse7pty 5

13

이 칩에는 내가 아는 한 고유 한 ID가 없지만 보드의 EEPROM에 프로그래밍 할 수 있습니다.

EEPROM 문서화

특정 주소에 쓰면 향후 스케치에서 ID를 읽고 아무거나 할 수 있습니다.


호스트 측에서 unqiue ID 또는 주소를 볼 수도 있습니다. USB 장치에 대해 더 잘 알지 못하지만 USB 통신을 처리하는 칩에는 사용할 수있는 고유 ID가있을 수 있습니다. 그러나 Arduino 코드는 이것을 사용할 수 없습니다.

또는 라벨 메이커를 사용하여 각 보드에 라벨을 붙이십시오.


2
질문의 고유 한 측면에서 GUID 는 약간의 오차 범위 내에서 해결할 수 있습니다.
Matthew G.

나는 원래 EEPROM을 사용하려고 생각했습니다. 그러나 모든 보드를 구매할 때마다 추가 작업이 필요합니다. 새로운 고유 ID를 만든 다음 EEPROM에 작성하십시오. 또한 내 스케치에 사용 된 라이브러리 (동일한 EEPROM 주소에 쓸 수 있음)와 호환되지 않을 수 있습니다. 마지막으로, 내 상황에서 PC에서 ID를 읽어야하는데, 이는 더 어렵다. USB 고유 ID가 더 흥미로워 보입니다.
jfpoilpret

내 대답에 따르면, 이것이 일반적인 솔루션 (대부분의 사람들과 광범위한 보드)이되기를 원한다면 USB ID를 사용한다는 것은 USB-> 직렬 브리지가없는 보드에서 FTDI 케이블을 사용하는 사람들이 그렇지 않다는 것을 의미합니다 시스템을 사용할 수 있습니다.
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

Uno의 USB 인터페이스가 고유 한 일련 번호를 제공하는지 의심합니다. 임의의 숫자는 칩에 업로드 된 코드의 일부이므로 여러 Unos에서 동일합니다.

한 가지 방법은 One-wire 인터페이스를 사용하는 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

스케치를 업로드 할 때 16 진 코드의 MD5 합계를 생성하면됩니다. 그렇게하는 매우 간단한 방법이 있습니다. 그런 다음 소스 코드에서 "git tag"작업을 수행 한 다음 (자동 또는 수동 프로세스를 사용하여) 특정 MD5 16 진 코드 합계가 특정 시점의 스케치 코드를 나타냅니다.

어떤 종류의 데이터베이스는 다음과 같습니다.

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

각기 고유 한 I 'd 온도 센서 하나를 연결했습니다. 모든 스케치는 부팅시 I 'd를 읽고 모든 직렬 연결에 주소를 썼습니다. 나는 필요한 모든 하드웨어로 방패를 만들었으므로 Uno에서 Mega로 업그레이드해야 할 경우 장치는 고유 한 ID를 유지했습니다.


0

EEPROM에 사용자 정의 하드웨어 ID를 읽고 쓸 수있는 작은 라이브러리가 있습니다. 이를 사용하여 잘못된 스케치를 Arduino로 푸시하지 않거나 다른 목적으로 장치를 식별 할 수 있습니다.

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

면책 조항 : 저는 도서관의 저자입니다 :-)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.