Po przesłaniu szkicu na jedną ze swoich tablic Arduino trudno jest dokładnie wiedzieć, jaki kod źródłowy doprowadził do tego szkicu.
Rzeczywiście, możesz zmienić kod źródłowy swojego szkicu na komputerze bez aktualizacji (w formacie binarnym) na swoją tablicę.
Wpadłem na pomysł stworzenia „ repozytorium szkiców ”, które będzie zapełniane, gdy tylko prześlę szkic do jednej z moich plansz. Następnie mogłem później pobrać kod źródłowy szkicu działającego na dowolnej mojej planszy.
W przypadku takiego repozytorium najpierw potrzebowałbym „ indeksu ”, który pozwoliłby mi dowiedzieć się, z którą tablicą jest powiązany kod źródłowy szkicu.
Zazwyczaj taki indeks powinien być unikalny dla każdej tablicy arduino.
Stąd moje pytanie: jak mogę uzyskać unikatowy identyfikator płyty Arduino?
Edytować:
Oto moja aktualna lista plansz (lista miniumum obsługiwana przez jedno unikalne podejście ID):
- UNO R3
- Mega 2560
- Yun
- Arduino Robot (muszą to być 2 tablice równoważne Leonardo)
W przyszłości mogę również budować własne płyty (odpowiednik Uno, ale bez kości, bez FTDI), dlatego jeśli podejście obsługuje również te, które byłyby lepsze.
źródło
Odpowiedzi:
Istnieje wiele technik, których możesz użyć tutaj, aby uzyskać unikalny identyfikator.
Problem polega na tym, że nie ma żadnej opcji oprócz 5, która będzie działać na wszystkich tablicach.
Jeśli twoje rozwiązanie będzie ogólne, sugeruję, że użycie identyfikatora USB nie jest rozwiązaniem. Mam ~ 30 płyt opartych na Arduino, a tylko 5 z nich ma wbudowany sprzęt USB. Wszystkie pozostałe wymagają programowania zewnętrznego kabla FTDI. Oznacza to, że wszyscy mieliby ten sam identyfikator.
źródło
Chip nie ma żadnego unikalnego identyfikatora, o ile wiem ... ale możesz zaprogramować go w EEPROM swoich płyt.
Dokumentacja EEPROM
Pisałbyś pod konkretny adres, a następnie przyszłe szkice mogły odczytać identyfikator i zrobić z nim cokolwiek.
Po stronie hosta możesz także zobaczyć unikatowy identyfikator lub adres. Nie wiem wystarczająco dużo o urządzeniach USB, aby powiedzieć ci więcej, ale układ obsługujący komunikację USB może mieć unikalny identyfikator, którego możesz użyć. Twój kod Arduino nie byłby jednak w stanie tego użyć.
Alternatywnie, po prostu użyj drukarki etykiet i umieść etykietę na każdej płycie.
źródło
Niektóre płyty, po podłączeniu do komputera, publikują swój numer seryjny. Mój Arduino Uno R3 mówi
Chociaż nie jestem pewien, jak wyjątkowy jest.
źródło
Według mojej najlepszej wiedzy, wszystkie układy USB mają unikalny numer seryjny, przynajmniej dla układów FTDI. W systemie Linux możesz łatwo przypisać do niego unikalne nazwy urządzeń, sprawdź moją stronę internetową .
Poza tym to, co opisujesz, jest w zasadzie prostą formą kontroli wersji . Upewnij się, że pliki źródłowe mają numery wersji. Aby zidentyfikować swoje Arduino, możesz nadać mu
Serial.Print();
nazwę i wersję kodu podczassetup();
.źródło
__DATE__
oraz__TIME__
. Tak przynajmniej możesz automatycznie przechowywać te informacje w pliku .hex @jfpoilpretWątpię, czy interfejs USB w Uno daje unikalny numer seryjny. Dowolna liczba byłaby częścią kodu przesłanego do układu, który byłby zatem taki sam wśród wielu Unos.
Jednym z podejść jest układ DS2401 „Silicon Serial Number”, który wykorzystuje interfejs One-wire. Wymagałoby to tylko jednego wolnego kodu PIN i trochę kodu (prawdopodobnie byłby to problem).
Najmniej natrętną i prawdopodobnie najbardziej niezawodną metodą byłoby po prostu ponowne odczytanie kodu i sprawdzenie go. Właśnie to robię z moim detektorem sygnatur chipów . Wykrywa to jednak tylko (obecnie zapisany) podpis bootloadera. Dość niewielka zmiana, która może sumować MD5 cały kod szkicu.
Przykładowe dane wyjściowe:
Ta suma MD5 (ostatnia linia) jest faktycznie sygnaturą tego konkretnego programu ładującego. W rzeczywistości najnowsza wersja wyszukuje je w tabeli:
Więc, co możesz zrobić, to podczas przesyłania szkicu wygenerować sumę MD5 kodu szesnastkowego. Są na to dość proste sposoby. Następnie możesz wykonać operację „git tag” na kodzie źródłowym, a następnie (przy użyciu zautomatyzowanego lub ręcznego procesu) pamiętać, że konkretna suma kodu szesnastkowego MD5 reprezentuje kod szkicu w danym momencie.
Jakaś baza danych, taka jak:
Teraz, aby zlokalizować źródło z tablicy, ustal sumę MD5 kodu (odczytując ją z tablicy), a następnie wyszukaj w swojej bazie danych.
źródło
Podłączyłem jednoprzewodowy czujnik temp., Z których każdy ma unikalny „ja”. Wszystkie szkice czytały „Ja przy starcie” i zapisywały adres przy każdym połączeniu szeregowym. Zrobiłem tarczę z całym sprzętem, którego potrzebowałem, więc jeśli potrzebowałbym uaktualnić Uno do Mega, urządzenie zachowałoby swoje unikalne ja.
źródło
Istnieje niewielka biblioteka do odczytu i zapisu niestandardowego identyfikatora sprzętu w pamięci EEPROM. Możesz go użyć, aby uniknąć popychania niewłaściwego szkicu do Arduino lub do identyfikacji urządzenia do innych celów.
https://github.com/skoumalcz/arduino-id-guard
Oświadczenie: Jestem autorem biblioteki :-)
źródło