Fråga:
Hur kan jag få ett unikt ID för alla mina Arduino-kort?
jfpoilpret
2014-02-18 04:27:43 UTC
view on stackexchange narkive permalink

När du har laddat upp en skiss till ett av dina Arduino-kort är det svårt att veta exakt vilken källkod som ledde till den skissen.

Du kan faktiskt ändra källkoden för din skiss på din PC utan att uppdatera den (i binärt format) till ditt bräde.

Jag hade tanken att skapa ett slags " skissförvar " som skulle fyllas så snart jag laddade upp en skiss till en av mina brädor. Sedan kunde jag senare hämta källkoden för en skiss som körs på någon av mina brädor.

För ett sådant arkiv måste jag först ha ett " index " det skulle göra det möjligt för mig att veta vilket tavla skisskällkoden är länkad till.

Normalt bör ett sådant index vara unikt för varje enskilt arduino-kort.

Därav min fråga: hur kan jag få ett unikt ID för ett Arduino-kort?

Redigera:

Detta är min nuvarande lista över kort (miniumum lista som stöds av ett enda unikt ID-tillvägagångssätt):

  • UNO R3
  • Mega 2560
  • Yun
  • Arduino Robot (det måste vara två motsvarande Leonardo-brädor)

I framtiden kan jag också bygga mina egna brädor (Uno ekvivalenta men barebones, utan FTDI), alltså om en metod också stöder dessa som skulle bli bättre.

@jfpoilpret ... såg just det här inlägget medan du granskade webbplatsen..hittade du en lösning, eller i bästa fall om hur du implementerar detta?
Sju svar:
#1
+15
Cybergibbons
2014-02-18 14:27:20 UTC
view on stackexchange narkive permalink

Det finns ett antal tekniker du kan använda här för att få ett unikt ID.

  1. FTDI-chips har ett unikt serienummer programmerat på sig. Detta kan endast nås från PC-sidan av anslutningen så vitt jag känner till.
  2. Vissa av chipsen med inbyggd USB (t.ex. ATmega8U2 / 16U2 / 32U2) har ett unikt ID i signaturdata , används vanligtvis för USB. Kan lätt nås från båda sidor av anslutningen. Detta inkluderar ATmega16U2 som används som USB-> Serial bridge Arduino Uno R3.
  3. Några av chipsen med inbyggd USB men inget unikt ID i signaturen har fortfarande ett unikt ID programmerat i USB stack (t.ex. LUFA) som används för bootloader eller DFU (Device Firmware Upgrade).
  4. Det finns många marker med globalt unika serie-ID i t.ex. Microchip 11AA02E48, alla Dallas 1-Wire sensorer (inklusive den gemensamma DS18B20 temperatursensorn) och andra seriella EEPROMS. Jag har använt dessa i produktionshårdvara som måste ha en unik MAC-adress.
  5. Du kan ändra standardstartladdaren för Optiboot (eller vilken båtlastare du använder) så att den kan hålla och svara med ett unikt ID.

Problemet med dessa är att det inte finns något alternativ förutom 5 som kommer att fungera över alla kort.

Om din lösning kommer att bli generisk skulle jag föreslå att användning av ett USB-ID inte är vägen framåt. Jag har ~ 30 Arduino-baserade kort, och endast 5 av dem har inbyggd USB-hårdvara. Alla andra behöver en extern FTDI-kabel för att programmeras. Det betyder att de alla skulle ha samma ID.

Vad gör du * med * 30 ** brädor?
Främst för trådlösa sensornätverk. Jag har bara några riktiga Arduinos - en Duemilanova, en Seeeduino Mega och en Uno. Alla andra är Teensy, Jeenodes, WiNodes, Nanodes och RFus.
+1 för en ingående lista över möjliga alternativ, tack! Jag skulle hellre undvika 4. eftersom jag inte vill lägga till specifik hårdvara på alla mina kort. 5. ser farligt ut (lätt att ladda upp samma modifierade bootloader till två olika kort) och besvärlig (måste ha olika bootloaders källkod för att ladda upp för varje kort). Hittills verkar USB ID och FTDI ganska bra lösningar, men fungerar de med alla mina nuvarande kort?
Har Arduino globalt unika serie-ID? Hur läser man den?
#2
+13
sachleen
2014-02-18 05:37:06 UTC
view on stackexchange narkive permalink

Chipet har inte någon form av unikt ID så vitt jag vet .... men du kan programmera ett i EEPROM på dina kort.

EEPROM-dokumentation

Du skulle skriva till en specifik adress och sedan kan framtida skisser läsa ID och göra vad som helst med det.


Du kanske också kan se ett unqiue ID eller adress på värdssidan. Jag vet inte tillräckligt om USB-enheter för att berätta mer, men chiphantering av USB-kommunikation kan ha ett unikt ID som du kan använda. Din Arduino-kod skulle dock inte kunna använda detta.

Alternativt kan du bara använda en etiketttillverkare och sätta en etikett på varje kort.

När det gäller den unika aspekten av frågan kan en [GUID] (http://en.wikipedia.org/wiki/Globally_unique_identifier) ​​lösa det (inom någon liten felmarginal).
Jag hade ursprungligen tänkt på att använda EEPROM för det; men det kräver ytterligare arbete för varje styrelseförsök: skapa ett nytt unikt ID och skriv det sedan till EEPROM. Det kan också finnas inkompatibiliteter med bibliotek som används av mina skisser (som kan skriva till samma EEPROM-adress). Slutligen i mitt sammanhang skulle jag behöva läsa ID: n från min dator, vilket är svårare. USB-unikt ID verkar mer intressant för mig.
Enligt mitt svar, om du vill att det här ska vara en generisk lösning (för de flesta och ett brett utbud av kort), förlitar sig på USB-ID att personer som använder FTDI-kablar på kort utan USB-> Serial bridge inte skulle vara kunna använda ditt system.
#3
+8
Federico Fissore
2014-02-18 05:45:14 UTC
view on stackexchange narkive permalink

Vissa kort publicerar serienumret när de är anslutna till en dator. Min Arduino Uno R3 säger

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

Även om jag inte är säker på hur unik den är.

Har alla Arduino-kort ett sådant nummer? Det skulle vara trevligt att ha listan över styrelser som har en (eller inte).
Om man tittar på gruvor har 32u4-baserade sådana inte, 328 och SAM3X8E har det
#4
+4
jippie
2014-02-18 11:19:19 UTC
view on stackexchange narkive permalink

Så vitt jag vet har USB-chipsen alla ett unikt serienummer, åtminstone för FTDI-chips. På Linux kan du enkelt tilldela unika enhetsnamn från det, kolla min webbplats.

Förutom det är det du beskriver ganska mycket en enkel form av versionskontroll. Se till att dina källfiler har versionsnummer. För att identifiera din Arduino kan du göra den Seriell utskrift (); namn och version av koden under -inställning (); .

Ja versionskontroll är mer eller mindre vad jag vill uppnå; men att ställa in en version i kod och ändra den varje gång koden ändras är inte ett alternativ (för lätt att glömma). Jag använder för närvarande github för mina skisser, men jag vill enkelt ta reda på vilken version av vilken skiss som för närvarande körs på ett bräde.
Det finns ett makro för sammanställningsdatum och tid '__DATE__' och '__TIME__'. Så åtminstone kan du automatiskt lagra den informationen i din .hex-fil @jfpoilpret
Bra poäng, jag hade inte tänkt på dessa makron för versionering.
#5
+2
Nick Gammon
2015-09-03 11:25:11 UTC
view on stackexchange narkive permalink

Jag tvivlar på att USB-gränssnittet på Uno ger dig ett unikt serienummer. Vilket nummer som helst skulle vara en del av koden som laddas upp till chipet, vilket därför skulle vara detsamma bland flera Uno. Det skulle bara kräva en ledig pin och lite kod (koden skulle kunna vara problemet, möjligen).

Den minst påträngande metoden, och förmodligen den mest tillförlitliga, skulle vara att helt enkelt läsa tillbaka koden och summan -kolla upp det. Det är precis vad jag gör med min chip signatur detektor. Men det upptäcker bara (som för närvarande skrivet) bootloader-signaturen. En ganska liten förändring och det kan MD5 summera hela skisskoden.

Exempel på utdata:

  Signaturdetektor. Skriven av Nick Gammon.Signatur = 1E 95 0F FusesLow = FF High = D6 Ext = FF Lock = CFProcessor = ATmega328PFlash-minnesstorlek = 32768Bootloader används: JaEEPROM bevaras genom radering: Ja Watchdog timer alltid på: NejBootloader är 512 byte från 7E00Bootloader: 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 summan av bootloader = 56 72 75 2D 5D B5 0D BA 25 10 DF BE 87 D2 A1 27 

Den MD5-summan (sista raden) är effektiv ectively signaturen för den specifika bootloader. I själva verket slår den senaste versionen upp dem i en tabell:

  MD5 summan av bootloader = FB F4 9B 7B 59 73 7F 65 E8 D0 F8 A5 08 12 E7 9F Bootloader namn: optiboot_atmega328  kod> 

Så vad du kan göra är att när du laddar upp en skiss genererar du en MD5-summa av hexkoden. Det finns ganska enkla sätt att göra det. Då kan du göra en "git tag" -åtgärd på din källkod och sedan (med hjälp av någon automatiserad eller manuell process) komma ihåg att en viss MD5-summa av hexkod representerar skisskoden vid ett visst ögonblick.

Någon sorts databas som:

  Chip: UnoMD5 sum: D8 8C 70 6D FE 1F DC 38 82 1E CE AE 23 B2 E6 E7 Skiss: My_robot_sketch_42.inoGit tag: version666  

Nu för att lokalisera källan från tavlan skapar du MD5-summan av koden (genom att läsa den tillbaka från tavlan) och letar upp den i din databas.

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

Jag anslöt en entrådssensor som var och en har en unik jag. Alla skisser läser jag skulle starta och skrev adressen på varje seriell anslutning. Jag gjorde en sköld med all hårdvara jag behövde, så om jag behövde uppgradera från Uno till Mega behöll enheten sin unika.

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

Det finns ett litet bibliotek för att läsa och skriva ditt anpassade hårdvaru-ID till EEPROM. Du kan använda den för att undvika att trycka fel skiss till din Arduino eller för att identifiera enheten för andra ändamål.

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

Ansvarsfriskrivning: Jag är författare till biblioteket: -)



Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 3.0-licensen som det distribueras under.
Loading...