שְׁאֵלָה:
כיצד אוכל לקבל תעודת זהות ייחודית לכל לוחות הארדוינו שלי?
jfpoilpret
2014-02-18 04:27:43 UTC
view on stackexchange narkive permalink

לאחר שהעלאת סקיצה לאחד מלוחות ה- Arduino שלך, קשה לדעת בדיוק איזה קוד מקור הוביל לרישום זה.

אכן, תוכל לשנות את קוד המקור של השרטוט שלך מחשב בלי לעדכן אותו (בפורמט בינארי) ללוח שלך.

היה לי הרעיון להקים מעין " מאגר סקיצות " שיאוכלס ברגע שאעלה סקיצה לאחד הלוחות שלי. ואז אוכל לאחזר, בהמשך, את קוד המקור לשרטוט שרץ על כל אחד מהלוחות שלי.

עבור מאגר כזה, ראשית אצטרך שיהיה לי " אינדקס " שיאפשר לי לדעת ל איזה לוח קוד המקור לשרטוט מקושר.

בדרך כלל, אינדקס כזה צריך להיות ייחודי לכל לוח ארדואינו יחיד.

עריכה:

זו רשימת הלוחות הנוכחית שלי (המיניום) רשימה שתומכת בגישת מזהה ייחודית יחידה):

  • UNO R3
  • מגה 2560
  • Yun
  • Arduino Robot (חייבים להיות שני לוחות מקבילים של ליאונרדו)

בעתיד, אני עשוי לבנות גם לוחות משלי (Uno שווה ערך אך עצמות בר, ללא FTDI), ומכאן שאם גישה תומכת גם בכאלה שהיו תהיה טוב יותר.

@jfpoilpret ... פשוט ראיתי את הפוסט הזה תוך כדי עיון באתר..מצאת פיתרון, או תרחיש המקרה הטוב ביותר כיצד ליישם זאת?
שבע תשובות:
#1
+15
Cybergibbons
2014-02-18 14:27:20 UTC
view on stackexchange narkive permalink

יש כאן מספר טכניקות שתוכל להשתמש בהן כדי לקבל מזהה ייחודי.

  1. שבבי FTDI מתוכנתים מספר סידורי ייחודי. ניתן לגשת אליו רק מהצד המחשב של החיבור עד כמה שידוע לי.
  2. לחלק מהשבבים עם USB מובנה (למשל ATmega8U2 / 16U2 / 32U2) יש מזהה ייחודי בנתוני החתימה. , משמש בדרך כלל ל- USB. ניתן לגשת אליו בקלות משני צידי החיבור. זה כולל את ה- ATmega16U2 המשמש כ- USB-> גשר סידורי Arduino Uno R3.
  3. חלק מהשבבים עם USB מובנה אך ללא זיהוי ייחודי בחתימה עדיין יותקן מזהה ייחודי ב- USB. מחסנית (למשל LUFA) המשמשת לאתחול האתחול או DFU (שדרוג קושחת ההתקנים).
  4. ישנם שבבים רבים עם מזהים טוריים ייחודיים בעולם, למשל שבב המיקרו 11AA02E48, כל חיישני 1-Wire של דאלאס (כולל חיישן הטמפרטורה המשותף DS18B20), ו- EEPROMS סדרתי אחר. השתמשתי באלו בחומרת ייצור שחייבת להיות בעלת כתובת MAC ייחודית.
  5. תוכל לשנות את מטען האתחול הסטנדרטי של Optiboot (או מטעין הסירה בו אתה משתמש) כך שיוכל להחזיק ולהגיב עם מזהה ייחודי.

הבעיה באלה היא שאין אפשרות מלבד 5 שתעבוד בכל הלוחות.

אם הפיתרון שלך יהיה כללי, הייתי מציעים כי שימוש במזהה USB אינו הדרך הלאה. יש לי ~ 30 לוחות מבוססי Arduino, ורק 5 מהם בנו חומרת USB. כל השאר זקוקים לתכנות כבל FTDI חיצוני. פירוש הדבר שלכולם תהיה אותה תעודת זהות.

מה אתה * עושה * עם ** 30 ** לוחות?
בעיקר לרשתות חיישנים אלחוטיות. יש לי רק כמה ארדואינו אמיתיים - Duemilanova, Seeeduino Mega ו- Uno. כל האחרים הם Teensy, Jeenodes, WiNodes, Nanodes ו- RFus.
+1 לרשימה מעמיקה של אפשרויות אפשריות, תודה! אני מעדיף להימנע מ- 4. מכיוון שאני לא רוצה להוסיף חומרה ספציפית לכל הלוחות שלי. 5. נראה מסוכן (קל להעלות את אותו bootloader שונה ל -2 לוחות שונים) ומסורבל (צריך להעלות קוד מקור של bootloaders שונים עבור כל לוח). עד כה, USB ID ו- FTDI נראים פתרונות די טובים, אך האם הם עובדים עם כל הלוח הנוכחי שלי?
האם לארדואינו יש תעודות זהות סדרתיות ייחודיות בעולם? איך לקרוא את זה?
#2
+13
sachleen
2014-02-18 05:37:06 UTC
view on stackexchange narkive permalink

לשבב אין שום סוג של מזהה ייחודי עד כמה שידוע לי .... אבל אתה יכול לתכנת אחד כזה ב- EEPROM של הלוחות שלך.

EEPROM documetnation

היית כותב לכתובת ספציפית ואז שרטוטים עתידיים יכולים לקרוא את המזהה ולעשות כל מה שאיתו.


ייתכן שתוכל גם לראות מזהה לא נכון כתובת בצד המארח. אני לא יודע מספיק על התקני USB כדי לספר לך יותר, אך לשבב המטפל בתקשורת USB יכול להיות מזהה ייחודי שתוכל להשתמש בו. אך קוד Arduino שלך לא יוכל להשתמש בזה.

לחלופין, פשוט השתמש ביצרן תוויות ושם תווית על כל לוח.

בכל הנוגע להיבט הייחודי של השאלה, [GUID] (http://en.wikipedia.org/wiki/Globally_unique_identifier) ​​יכול לפתור את זה (בטווח שגיאה זעיר כלשהו).
במקור חשבתי להשתמש ב- EEPROM לשם כך; אבל זה דורש עבודה נוספת עבור כל לוח מקבל: צור מזהה ייחודי חדש, ואז כתוב אותו ל- EEPROM. כמו כן, ייתכן שיש אי התאמה לספריות המשמשות את הרישומים שלי (שעשויות לכתוב לאותה כתובת EEPROM). לבסוף בהקשר שלי, אצטרך לקרוא את המזהה מהמחשב האישי שלי, וזה קשה יותר. מזהה ה- USB הייחודי נראה לי מעניין יותר.
לפי התשובה שלי, אם אתה רוצה שזה יהיה פיתרון כללי (עבור רוב האנשים ומגוון רחב של לוחות), הסתמכות על מזהה ה- USB פירושה שאנשים המשתמשים בכבלי FTDI בלוחות ללא USB-> גשר סידורי לא יהיו מסוגל להשתמש במערכת שלך.
#3
+8
Federico Fissore
2014-02-18 05:45:14 UTC
view on stackexchange narkive permalink

חלק מהלוחות מחוברים למחשב ומפרסמים את המספר הסידורי שלהם. ה- Arduino Uno R3 שלי אומר

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

אם כי אני לא בטוח עד כמה הוא ייחודי.

האם לכל לוחות הארדואינו יש מספר כזה? זה יהיה נחמד שיש את רשימת הלוחות שיש להם (או לא).
כשמסתכלים על מוקשים, לא על בסיס 32u4 אין, על 328 ו- SAM3X8E יש את זה
#4
+4
jippie
2014-02-18 11:19:19 UTC
view on stackexchange narkive permalink

למיטב ידיעתי שבבי ה- USB מגיעים כולם עם מספר סידורי ייחודי, לפחות עבור שבבי FTDI. ב- Linux תוכלו להקצות בקלות שמות מכשירים ייחודיים מכך, בדקו את האתר שלי.

מלבד זאת, מה שאתם מתארים הוא די פשוט סוג של בקרת גרסה . ודא שקבצי המקור שלך כוללים מספרי גרסאות. כדי לזהות את Arduino שלך, אתה יכול לעשות את זה Serial.Print (); שם וגרסת הקוד במהלך הגדרת (); .

כן גרסת בקרה היא פחות או יותר מה שאני רוצה להשיג; אך הגדרת גרסה בקוד ושינויו בכל פעם שהקוד משתנה אינה אפשרות (קל מכדי לשכוח). כרגע אני משתמש ב- github לרישומים שלי, אך ברצוני לברר בקלות איזו גרסה של איזה סקיצה פועלת כרגע על לוח אחד.
יש מאקרו לתאריך ולשעת האוסף "__DATE__" ו- "__TIME__". אז לפחות תוכל לאחסן את המידע באופן אוטומטי בקובץ ה- .hex שלך @jfpoilpret
נקודה טובה, לא חשבתי על פקודות המאקרו האלה לצורך גרסאות.
#5
+2
Nick Gammon
2015-09-03 11:25:11 UTC
view on stackexchange narkive permalink

אני בספק שממשק ה- USB ב- Uno נותן לך מספר סידורי ייחודי. כל מספר יהיה חלק מהקוד שהועלה לשבב, ולכן יהיה זהה בקרב מספר רב של יחידות Uno.

גישה אחת היא שבב DS2401 "מספר סידורי הסיליקון" המשתמש בממשק חוט אחד. זה ידרוש רק סיכה אחת פנויה וקוד כלשהו (ייתכן שהקוד יהיה הבעיה).

השיטה הפחות פולשנית, וכנראה האמינה ביותר, תהיה פשוט לקרוא את הקוד ואת הסכום. -בדוק את זה. זה בדיוק מה שאני עושה עם גלאי חתימת השבבים שלי. עם זאת זה מגלה (כפי שנכתב כרגע) רק את חתימת האתחול. שינוי די קל וזה יכול לסכם MD5 את כל קוד השרטוט.

פלט לדוגמא:

  גלאי חתימות. נכתב על ידי Nick Gammon. חתימה = 1E 95 0F FusesLow = FF High = D6 Ext = FF Lock = CFProcessor = ATmega328P גודל זיכרון פלאש = 32768 מטען אתחול בשימוש: כן EEPROM נשמר באמצעות מחיקה: כן טיימר כלב השעון תמיד פועל: לא Bootloader הוא 512 בתים החל מ- 7E00 מטען אתחול: 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 סכום האתחול = 56 72 75 2D 5D B5 0D BA 25 10 DF BE 87 D2 A1 27 

סכום MD5 זה (השורה האחרונה) הוא אפק ectively החתימה של אותו מטען אתחול מסוים. למעשה הגרסה האחרונה מחפשת אותם בטבלה:

  סכום MD5 של Bootloader = FB F4 9B 7B 59 73 7F 65 E8 D0 F8 A5 08 12 E7 9F שם Bootloader: optiboot_atmega328  קוד> 

אז מה שאתה יכול לעשות זה, בעת העלאת סקיצה, ליצור סכום MD5 של קוד ה- hex. ישנן דרכים פשוטות למדי לעשות זאת. אז אתה יכול לבצע פעולת "git tag" על קוד המקור שלך, ואז (באמצעות תהליך אוטומטי או ידני כלשהו) לזכור שסכום מסוים של MD5 של קוד hex מייצג את קוד השרטוט ברגע מסוים.

סוג של מסד נתונים כמו:
  שבב: סכום UnoMD5: D8 8C 70 6D FE 1F DC 38 82 1E CE AE 23 B2 E6 E7 סקיצה: My_robot_sketch_42.inoGit תג: version666  

כעת כדי לאתר את המקור מהלוח, אתה קובע את סכום הקוד MD5 (על ידי קריאתו מהלוח) ואז מחפש אותו במסד הנתונים שלך.

#6
+1
vlad b.
2015-09-03 12:20:07 UTC
view on stackexchange narkive permalink

חיברתי חיישן טמפ 'של חוט אחד, שכל אחד מהם הגיע עם אופן ייחודי. כל השרטוטים קראו את התוכנה שהתחלתי וכתבו את הכתובת בכל חיבור סדרתי. הכנתי מגן עם כל החומרה הדרושה לי, כך שאם הייתי צריך לשדרג מאונו למגה המכשיר שמר על הייחודי שלו.

#7
+1
gingo
2018-03-06 02:59:43 UTC
view on stackexchange narkive permalink

קיימת ספרייה זעירה לקריאה וכתיבה של מזהה החומרה המותאם אישית שלך ל- EEPROM. אתה יכול להשתמש בו כדי להימנע מלדחוף שרטוט שגוי לארדואינו שלך או לזהות מכשיר למטרות אחרות.

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

הצהרת אחריות: אני מחבר הספרייה: -)



שאלה ותשובה זו תורגמה אוטומטית מהשפה האנגלית.התוכן המקורי זמין ב- stackexchange, ואנו מודים לו על רישיון cc by-sa 3.0 עליו הוא מופץ.
Loading...