मुझे अपने सभी Arduino बोर्डों के लिए एक अद्वितीय आईडी कैसे मिल सकती है?


27

एक बार जब आपने अपने Arduino बोर्डों में से किसी एक को एक स्केच अपलोड किया है, तो यह जानना कठिन है कि उस स्केच के लिए स्रोत कोड क्या है।

वास्तव में, आप अपने बोर्ड पर इसे (बाइनरी प्रारूप में) अपडेट किए बिना अपने स्केच के स्रोत कोड को बदल सकते हैं।

मेरे पास एक प्रकार का " स्केच रिपॉजिटरी " स्थापित करने का विचार था जो मेरे एक बोर्ड पर स्केच अपलोड करते ही पॉपुलेट हो जाता। तब मैं पुनः प्राप्त कर सकता था, बाद में, मेरे किसी भी बोर्ड पर चलने वाले स्केच के लिए स्रोत कोड।

इस तरह के भंडार के लिए, मुझे पहले एक " इंडेक्स " की आवश्यकता होगी, जो मुझे यह जानने में सक्षम करेगा कि स्केच स्रोत कोड किस बोर्ड से जुड़ा है।

आमतौर पर, इस तरह के एक सूचकांक को हर एक arduino बोर्ड के लिए अद्वितीय होना चाहिए।

इसलिए मेरा सवाल: मैं एक Arduino बोर्ड के लिए एक अद्वितीय आईडी कैसे प्राप्त कर सकता हूं?

संपादित करें:

यह मेरी बोर्ड की वर्तमान सूची है (एकल यूनिक आईडी अप्रोच द्वारा समर्थित की जाने वाली मिनिमम सूची):

  • UNO R3
  • मेगा 2560
  • यूं
  • Arduino Robot (जो 2 लियोनार्डो के समकक्ष बोर्ड होना चाहिए)

भविष्य में, मैं अपने खुद के बोर्ड (यूनो समतुल्य लेकिन नंगे पांव, बिना एफडीडीआई) का निर्माण कर सकता हूं, इसलिए यदि कोई दृष्टिकोण भी इनका समर्थन करता है जो बेहतर होगा।


1
@jfpoilpret ... सिर्फ साइट पोस्ट करते समय इस पोस्ट को देखा..क्या आपको इसका हल ढूंढना है, या इसे लागू करने के तरीके पर सबसे अच्छा मामला है?
डिनोटोम

जवाबों:


14

ऐसी कई तकनीकें हैं जिनका उपयोग आप यहाँ एक अद्वितीय आईडी प्राप्त करने के लिए कर सकते हैं।

  1. FTDI चिप्स में एक अद्वितीय सीरियल नंबर होता है। यह केवल कनेक्शन के पीसी की ओर से पहुँचा जा सकता है जहाँ तक मैं जागरूक हूँ।
  2. USB में निर्मित कुछ चिप्स (जैसे ATmega8U2 / 16U2 / 32U2) में हस्ताक्षरित डेटा में एक विशिष्ट आईडी होती है, जिसे आमतौर पर USB के लिए उपयोग किया जाता है। कनेक्शन के दोनों तरफ से आसानी से पहुँचा जा सकता है। इसमें ATmega16U2 शामिल है जो USB-> सीरियल ब्रिज Arduino Uno R3 के रूप में उपयोग किया जाता है।
  3. USB में निर्मित कुछ चिप के साथ, लेकिन हस्ताक्षर में कोई अद्वितीय आईडी अभी भी USB स्टैक (जैसे LUFA) में बूटलोडर या DFU (डिवाइस फ़र्मवेयर अपग्रेड) के लिए उपयोग की जाने वाली एक अद्वितीय आईडी नहीं होगी।
  4. उनमें विश्व स्तर पर अद्वितीय सीरियल आईडी के साथ कई चिप्स हैं जैसे कि माइक्रोचिप 11AA02E48 , सभी डलास 1-वायर सेंसर (सामान्य DS18B20 तापमान सेंसर सहित), और अन्य धारावाहिक EEPROMS। मैंने इनका उपयोग उत्पादन हार्डवेयर में किया है जिसमें एक अद्वितीय मैक पता होना चाहिए।
  5. आप मानक ऑप्टिबूट बूटलोडर (या जो भी नाव लोडर आप उपयोग करते हैं) को संशोधित कर सकते हैं ताकि यह एक अद्वितीय आईडी के साथ पकड़ और जवाब दे सके।

इनके साथ समस्या यह है कि 5 के अलावा कोई विकल्प नहीं है जो सभी बोर्डों में काम करेगा।

यदि आपका समाधान एक सामान्य होने जा रहा है, तो मैं सुझाव दूंगा कि USB आईडी का उपयोग करना आगे की ओर नहीं है। मेरे पास ~ 30 Arduino- आधारित बोर्ड हैं, और उनमें से केवल 5 ने USB हार्डवेयर में बनाया है। बाकी सभी को प्रोग्राम किए जाने के लिए एक बाहरी FTDI केबल की आवश्यकता है। इसका मतलब है कि वे सभी की आईडी एक ही होगी।


2
आप क्या करते करते के साथ 30 बोर्डों?
एशेश्र

मुख्य रूप से वायरलेस सेंसर नेटवर्क के लिए। मेरे पास केवल कुछ वास्तविक Arduinos - एक Duemilanova, एक Seeeduino मेगा और एक Uno हैं। अन्य सभी टेनेसी, जेनोड्स, वाईनोड्स, नैनोड्स और आरएफस हैं।
साइबरबर्ग

1
संभावित विकल्पों की पूरी सूची के लिए +1, धन्यवाद! मैं इससे बचना चाहता हूं। 4. क्योंकि मैं अपने सभी बोर्डों में विशिष्ट हार्डवेयर नहीं जोड़ना चाहता। 5. खतरनाक लगता है (एक ही संशोधित बूटलोडर को 2 अलग-अलग बोर्डों पर अपलोड करना आसान है) और बोझिल (प्रत्येक बोर्ड के लिए अपलोड करने के लिए अलग-अलग बूटलोडर्स स्रोत कोड की आवश्यकता है)। अब तक, USB ID और FTDI काफी अच्छे समाधान हैं, लेकिन क्या वे मेरे सभी वर्तमान बोर्ड के साथ काम करते हैं?
jfpoilpret

क्या Arduino के पास विश्व स्तर पर अद्वितीय सीरियल आईडी हैं? इसे कैसे पढ़ें?
lanse7pty

13

चिप में किसी भी प्रकार की अद्वितीय आईडी नहीं है जहाँ तक मुझे पता है .... लेकिन आप अपने बोर्ड के ईप्रोम में एक प्रोग्राम कर सकते हैं।

EEPROM डोक्यूमिनेशन

आप एक विशिष्ट पते पर लिखते हैं और फिर भविष्य के नमूने आईडी पढ़ सकते हैं और इसके साथ जो भी कर सकते हैं।


हो सकता है कि आप होस्ट की ओर से कोई यूनिक्यू आईडी या पता भी देख सकें। मैं आपको और अधिक बताने के लिए USB उपकरणों के बारे में पर्याप्त नहीं जानता, लेकिन USB संचार को संभालने वाली चिप में एक विशिष्ट आईडी हो सकती है जिसका आप उपयोग कर सकते हैं। आपका Arduino कोड हालांकि इसका उपयोग नहीं कर पाएगा।

वैकल्पिक रूप से, बस एक लेबल निर्माता का उपयोग करें और प्रत्येक बोर्ड पर एक लेबल लगाएं।


2
जहां तक ​​सवाल के अनूठे पहलू का है, एक GUID इसे हल कर सकती है (त्रुटि के कुछ छोटे मार्जिन के भीतर)।
मैथ्यू जी।

मैंने मूल रूप से उसके लिए EEPROM का उपयोग करने के बारे में सोचा था; लेकिन इसके लिए हर बोर्ड को अतिरिक्त काम करने की आवश्यकता होती है: एक नई यूनिक आईडी बनाएं, फिर उसे EEPROM को लिखें। इसके अलावा, मेरे रेखाचित्रों द्वारा प्रयुक्त पुस्तकालयों के साथ असंगति हो सकती है (जो कि उसी EEPROM पते पर लिख सकते हैं)। अंत में मेरे संदर्भ में, मुझे अपने पीसी से आईडी पढ़ने की आवश्यकता होगी, जो अधिक कठिन है। यूएसबी यूनिक आईडी मुझे अधिक दिलचस्प लगती है।
jfpoilpret

मेरे उत्तर के अनुसार, यदि आप चाहते हैं कि यह एक जेनेरिक समाधान हो (ज्यादातर लोगों के लिए, और बोर्ड की एक विस्तृत श्रृंखला), तो USB ID पर निर्भर होने का मतलब है कि लोग बिना USB-> सीरियल ब्रिज के बिना बोर्डों पर FTDI केबलों का उपयोग नहीं करेंगे। आप प्रणाली का उपयोग करने में सक्षम।
Cybergibbons

8

कुछ बोर्ड, जब कंप्यूटर से जुड़े होते हैं, तो अपना सीरियल नंबर प्रकाशित करते हैं। मेरा अरुडिनो उनो आर 3 कहता है

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

हालांकि मुझे यकीन नहीं है कि यह कितना अनूठा है।


क्या सभी Arduino बोर्डों में इतनी संख्या है? उन बोर्डों की सूची बनाना अच्छा होगा जो एक (या नहीं) हैं।
jfpoilpret

1
खानों को देखते हुए, 32u4 आधारित नहीं हैं, 328 और SAM3X8E वाले इसके पास नहीं हैं
फेडेरिको फिशोर

4

मेरे ज्ञान का सबसे अच्छा करने के लिए USB चिप्स सभी एक अद्वितीय सीरियल नंबर के साथ आते हैं, कम से कम FTDI चिप्स के लिए। लिनक्स पर आप आसानी से अद्वितीय डिवाइस नाम निर्दिष्ट कर सकते हैं, मेरी वेबसाइट देखें

इसके अलावा, आप जो वर्णन कर रहे हैं, वह संस्करण नियंत्रण का एक सरल रूप है । सुनिश्चित करें कि आपके स्रोत फ़ाइलों में संस्करण संख्याएँ हैं। अपने Arduino की पहचान करने के लिए, आप इसे Serial.Print();कोड के दौरान नाम और संस्करण बना सकते हैं setup();


हां संस्करण नियंत्रण कमोबेश वही है जो मैं हासिल करना चाहता हूं; लेकिन कोड में एक संस्करण सेट करना और इसे हर बार बदलना कोड परिवर्तन एक विकल्प नहीं है (भूल जाना भी आसान है)। मैं वर्तमान में अपने स्केच के लिए गितुब का उपयोग करता हूं, लेकिन मैं आसानी से यह पता लगाना चाहूंगा कि वर्तमान में एक बोर्ड पर किस स्केच का क्या संस्करण चल रहा है।
jfpoilpret

4
संकलन दिनांक और समय के लिए एक मैक्रो है __DATE__और __TIME__। तो कम से कम आप स्वचालित रूप से उस जानकारी को अपने .hex फ़ाइल @jfpoilpret
jippie

अच्छी बात है, मैंने इन मैक्रो को संस्करण बनाने के बारे में नहीं सोचा था।
jfpoilpret

2

मुझे संदेह है कि ऊनो पर यूएसबी इंटरफ़ेस आपको एक अद्वितीय सीरियल नंबर देता है। कोई भी संख्या चिप पर अपलोड किए गए कोड का हिस्सा होगी जो कि कई यूनो के बीच समान होगी।

एक दृष्टिकोण DS2401 "सिलिकॉन सीरियल नंबर" चिप है जो वन-वायर इंटरफ़ेस का उपयोग करता है। यह केवल एक मुफ्त पिन की आवश्यकता होगी, और कुछ कोड (कोड समस्या होगी, संभवतः)।

कम से कम घुसपैठ विधि, और शायद सबसे विश्वसनीय, बस कोड को वापस पढ़ना और इसे जांचना होगा। यह वही है जो मैं अपने चिप हस्ताक्षर डिटेक्टर के साथ करता हूं । हालाँकि यह केवल बूटलोडर हस्ताक्षर का पता लगाता है (जैसा कि वर्तमान में लिखा गया है)। एक मामूली बदलाव और यह संपूर्ण स्केच कोड को एमडी 5-सम कर सकता है।

उदाहरण आउटपुट:

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 

एमडी 5 राशि (अंतिम पंक्ति) प्रभावी रूप से उस विशेष बूटलोडर के हस्ताक्षर हैं। वास्तव में सबसे हाल का संस्करण उन्हें एक तालिका में दिखता है:

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

तो आप क्या कर सकते हैं, एक स्केच अपलोड करते समय, हेक्स कोड का एमडी 5 योग उत्पन्न करें। ऐसा करने के काफी सरल तरीके हैं। तब आप अपने स्रोत कोड पर "गिट टैग" ऑपरेशन कर सकते थे, और फिर (कुछ स्वचालित या मैनुअल प्रक्रिया का उपयोग करके) याद रखें कि हेक्स कोड का एक विशेष एमडी 5 योग एक विशेष क्षण में स्केच कोड का प्रतिनिधित्व करता है।

डेटाबेस के कुछ प्रकार:

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

अब बोर्ड से स्रोत का पता लगाने के लिए, आप कोड के एमडी 5 योग (बोर्ड से इसे वापस पढ़कर) स्थापित करते हैं और फिर इसे अपने डेटाबेस में देखते हैं।


1

मैंने एक वायर टेम्प सेंसर को कनेक्ट किया है जो प्रत्येक को एक अनोखे आई के साथ आता है। सभी रेखाचित्रों ने I on boot को पढ़ा और प्रत्येक धारावाहिक कनेक्शन पर पता लिखा। मैं सभी हार्डवेयर मैं जरूरत के साथ एक ढाल बनाया तो अगर मैं जरूरत से मेगा से अपग्रेड करने के लिए डिवाइस अपने अद्वितीय मैं रखा था।


0

EEPROM को अपने कस्टम हार्डवेयर ID को पढ़ने और लिखने के लिए छोटी लाइब्रेरी है। आप अपने Arduino पर गलत स्केच को धकेलने से बचने या अन्य उद्देश्यों के लिए डिवाइस की पहचान करने के लिए इसका उपयोग कर सकते हैं।

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

अस्वीकरण: मैं पुस्तकालय का लेखक हूं :-)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.