Vraag:
Hoe kan ik een unieke ID krijgen voor al mijn Arduino-boards?
jfpoilpret
2014-02-18 04:27:43 UTC
view on stackexchange narkive permalink

Als je eenmaal een schets naar een van je Arduino-borden hebt geüpload, is het moeilijk om precies te weten welke broncode tot die schets heeft geleid.

Je kunt inderdaad de broncode van je schets op je PC zonder het bij te werken (in binair formaat) naar je bord.

Ik had het idee om een ​​soort " sketch repository " op te zetten dat zou worden gevuld zodra ik upload een schets op een van mijn borden. Dan zou ik later de broncode kunnen ophalen voor een sketch die op een van mijn boards draait.

Voor zo'n repository zou ik eerst een " index " nodig hebben. dat zou me in staat stellen te weten aan welk bord de broncode van de schets is gekoppeld.

Typisch zou zo'n index uniek moeten zijn voor elk afzonderlijk Arduino-bord.

Vandaar mijn vraag: hoe kan ik een unieke ID krijgen voor een Arduino-bord?

Bewerken:

Dit is mijn huidige lijst met borden (het miniumum lijst die moet worden ondersteund door een enkele unieke ID-benadering):

  • UNO R3
  • Mega 2560
  • Yun
  • Arduino Robot (dat moeten 2 Leonardo-equivalente boards zijn)

In de toekomst kan ik ook mijn eigen boards bouwen (Uno-equivalent maar barebones, zonder FTDI), dus als een benadering deze ook ondersteunt, zou dat beter zijn.

@jfpoilpret ... zag dit bericht net tijdens het doornemen van de site ... heb je een oplossing of het beste scenario gevonden voor hoe dit te implementeren?
Zeven antwoorden:
#1
+15
Cybergibbons
2014-02-18 14:27:20 UTC
view on stackexchange narkive permalink

Er zijn een aantal technieken die u hier zou kunnen gebruiken om een ​​uniek ID te krijgen.

  1. Op FTDI-chips is een uniek serienummer geprogrammeerd. Dit is alleen toegankelijk vanaf de pc-kant van de verbinding voor zover ik weet.
  2. Sommige chips met ingebouwde USB (bijv.ATmega8U2 / 16U2 / 32U2) hebben een unieke ID in de handtekeninggegevens , normaal gebruikt voor USB. Gemakkelijk toegankelijk vanaf beide zijden van de aansluiting. Dit omvat de ATmega16U2 die wordt gebruikt als de USB-> Seriële brug Arduino Uno R3.
  3. Sommige chips met ingebouwde USB maar geen unieke ID in de handtekening hebben nog steeds een unieke ID geprogrammeerd in de USB stack (bijv. LUFA) gebruikt voor de bootloader of DFU (Device Firmware Upgrade).
  4. Er zijn veel chips met wereldwijd unieke seriële ID's, bijv. de Microchip 11AA02E48, alle Dallas 1-Wire-sensoren (inclusief de gewone DS18B20-temperatuursensor) en andere seriële EEPROMS. Ik heb deze gebruikt in productiehardware die een uniek MAC-adres moet hebben.
  5. Je zou de standaard Optiboot-bootloader (of welke bootloader je ook gebruikt) kunnen aanpassen zodat deze een uniek ID kan vasthouden en erop kan reageren.

Het probleem hiermee is dat er geen andere optie is dan 5 die voor alle boards zal werken.

Als je oplossing een algemene oplossing wordt, zou ik suggereren dat het gebruik van een USB-ID niet de juiste weg is. Ik heb ~ 30 Arduino-gebaseerde kaarten en slechts 5 daarvan hebben ingebouwde USB-hardware. De rest heeft een externe FTDI-kabel nodig om te worden geprogrammeerd. Dit betekent dat ze allemaal dezelfde ID zouden hebben.

Wat * doe je * met ** 30 ** borden?
Hoofdzakelijk voor draadloze sensornetwerken. Ik heb maar een paar echte Arduino's - een Duemilanova, een Seeeduino Mega en een Uno. Alle andere zijn Teensy, Jeenodes, WiNodes, Nanodes en RFus.
+1 voor een uitgebreide lijst met mogelijke opties, bedankt! Ik vermijd liever 4. omdat ik geen specifieke hardware aan al mijn kaarten wil toevoegen. 5. ziet er gevaarlijk uit (gemakkelijk om dezelfde gewijzigde bootloader te uploaden naar 2 verschillende boards) en omslachtig (moet voor elk board verschillende broncode voor bootloaders hebben om te uploaden). Tot nu toe lijken USB ID en FTDI best goede oplossingen, maar werken ze met al mijn huidige kaarten?
Heeft Arduino wereldwijd unieke seriële ID's? Hoe te lezen?
#2
+13
sachleen
2014-02-18 05:37:06 UTC
view on stackexchange narkive permalink

De chip heeft voor zover ik weet geen unieke ID ... maar je zou er een kunnen programmeren in de EEPROM van je kaarten.

EEPROM-documentatie

Je schrijft naar een specifiek adres en dan kunnen toekomstige schetsen de ID lezen en er wat mee doen.


Mogelijk kun je ook een uniek ID zien of adres aan de hostzijde. Ik weet niet genoeg over USB-apparaten om u meer te vertellen, maar de chip die USB-communicatie verwerkt, heeft mogelijk een unieke ID die u zou kunnen gebruiken. Je Arduino-code zou dit echter niet kunnen gebruiken.

Je kunt ook gewoon een labelmaker gebruiken en een label op elk bord plakken.

Wat het unieke aspect van de vraag betreft, zou een [GUID] (http://en.wikipedia.org/wiki/Globally_unique_identifier) ​​dat kunnen oplossen (met een kleine foutmarge).
Ik had er oorspronkelijk aan gedacht om de EEPROM daarvoor te gebruiken; maar dat vereist extra werk voor elke board-get: maak een nieuwe unieke ID aan en schrijf deze naar de EEPROM. Er kunnen ook incompatibiliteiten zijn met bibliotheken die worden gebruikt door mijn schetsen (die kunnen schrijven naar hetzelfde EEPROM-adres). Ten slotte zou ik in mijn context de ID van mijn pc moeten lezen, wat moeilijker is. De unieke USB-ID lijkt mij interessanter.
Volgens mijn antwoord, als je wilt dat dit een generieke oplossing is (voor de meeste mensen, en een breed scala aan kaarten), betekent vertrouwen op de USB ID dat mensen die FTDI-kabels gebruiken op kaarten zonder een USB-> Seriële brug niet zou zijn je systeem kunnen gebruiken.
#3
+8
Federico Fissore
2014-02-18 05:45:14 UTC
view on stackexchange narkive permalink

Sommige kaarten publiceren hun serienummer wanneer ze op een computer zijn aangesloten. Mijn Arduino Uno R3 zegt

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

Hoewel ik niet zeker weet hoe uniek het is.

Hebben alle Arduino-boards zo'n nummer? Het zou leuk zijn om de lijst te hebben met borden die er een hebben (of niet).
Als we naar mijnen kijken, hebben 32u4-gebaseerde mijnen dat niet, 328 en SAM3X8E-mijnen hebben het wel
#4
+4
jippie
2014-02-18 11:19:19 UTC
view on stackexchange narkive permalink

Voor zover ik weet, hebben de USB-chips allemaal een uniek serienummer, althans voor de FTDI-chips. Onder Linux kun je daar gemakkelijk unieke apparaatnamen aan toewijzen, kijk op mijn website.

Anders dan dat, is wat je beschrijft vrijwel een eenvoudige vorm van versiebeheer. Zorg ervoor dat uw bronbestanden versienummers hebben. Om uw Arduino te identificeren, kunt u deze Serial.Print (); naam en versie van de code maken tijdens setup (); .

Ja, versiebeheer is min of meer wat ik wil bereiken; maar een versie in code instellen en deze elke keer dat de code verandert, wijzigen is geen optie (te gemakkelijk om te vergeten). Ik gebruik momenteel github voor mijn schetsen, maar ik zou graag willen weten welke versie van welke schets momenteel op één bord wordt uitgevoerd.
Er is een macro voor de compilatiedatum en -tijd `__DATE__` en` __TIME__`. Dus je kunt die info tenminste automatisch opslaan in je .hex-bestand @jfpoilpret
Goed punt, ik had niet aan deze macro's gedacht voor versiebeheer.
#5
+2
Nick Gammon
2015-09-03 11:25:11 UTC
view on stackexchange narkive permalink

Ik betwijfel of de USB-interface op de Uno je een uniek serienummer geeft. Elk nummer zou deel uitmaken van de code die naar de chip wordt geüpload, wat bij meerdere Uno's hetzelfde zou zijn.

Een benadering is de DS2401 "Silicon Serial Number" -chip die gebruikmaakt van de One-wire-interface. Dat zou slechts één gratis pincode vereisen, en wat code (de code zou het probleem mogelijk zijn).

De minst ingrijpende methode, en waarschijnlijk de meest betrouwbare, zou zijn om simpelweg de code en de som -controleer het. Dat is precies wat ik doe met mijn chip-handtekeningdetector. Dat detecteert echter alleen (zoals momenteel geschreven) de handtekening van de bootloader. Een vrij kleine wijziging en het zou de volledige schetscode MD5-optellen.

Voorbeelduitvoer:

  Handtekeningdetector Geschreven door Nick Gammon.Signature = 1E 95 0F FusesLow = FF Hoog = D6 Ext = FF Lock = CFProcessor = ATmega328P Grootte flashgeheugen = 32768 Bootloader in gebruik: Ja EEPROM behouden door wissen: Ja Watchdog-timer altijd aan: Nee Bootloader is 512 bytes beginnend bij 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 som van bootloader = 56 72 75 2D 5D B5 0D BA 25 10 DF BE 87 D2 A1 27 

Die MD5-som (laatste regel) is eff eigenlijk de handtekening van die specifieke bootloader. In feite zoekt de meest recente versie ze op in een tabel:

  MD5 som van bootloader = FB F4 9B 7B 59 73 7F 65 E8 D0 F8 A5 08 12 E7 9F Bootloader-naam: optiboot_atmega328  

Dus wat je zou kunnen doen is, bij het uploaden van een sketch, een MD5-som van de hex-code genereren. Er zijn vrij eenvoudige manieren om dat te doen. Dan zou je een "git tag" -bewerking op je broncode kunnen uitvoeren, en dan (met behulp van een geautomatiseerd of handmatig proces) onthouden dat een bepaalde MD5-som van hexadecimale code de sketchcode op een bepaald moment vertegenwoordigt.

Een soort database zoals:

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

Om nu de bron op het bord te vinden, bepaal je de MD5-som van de code (door het terug te lezen vanaf het bord) en zoek je het vervolgens op in je database.

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

Ik heb een enkeldraads temperatuursensor aangesloten die elk wordt geleverd met een unieke ik. Alle schetsen lazen de ik bij het opstarten en schreven het adres op elke seriële verbinding. Ik heb een schild gemaakt met alle hardware die ik nodig had, dus als ik moest upgraden van Uno naar Mega, bleef het apparaat zijn unieke ik.

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

Er is een kleine bibliotheek voor het lezen en schrijven van uw aangepaste hardware-ID naar EEPROM. U kunt het gebruiken om te voorkomen dat u een verkeerde schets naar uw Arduino duwt of om het apparaat voor andere doeleinden te identificeren.

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

Disclaimer: ik ben auteur van de bibliotheek: -)



Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 3.0-licentie waaronder het wordt gedistribueerd.
Loading...