Tüm Arduino kartlarım için nasıl benzersiz bir kimlik alabilirim?


27

Arduino kartlarınızdan birine bir çizim yükledikten sonra, hangi çizim kodunun o çizime yol açtığını tam olarak bilmek zordur.

Aslında, çiziminizin kaynak kodunu PC'nizdeki (ikili biçimde) panonuza güncellemeden değiştirebilirsiniz.

Tahtalarımdan birine taslak çizer yerleştirmez yerleştirilecek bir tür " taslak deposu " kurma fikrim vardı . Ardından, daha sonra panolarımın herhangi birinde çalışan bir taslak için kaynak kodunu alabilirim.

Böyle bir depo için, ilk önce taslak kaynak kodunun hangi panoya bağlı olduğunu bilmemi sağlayacak bir " indeks " e ihtiyacım olacaktı .

Tipik olarak, böyle bir endeks her bir arduino kartı için benzersiz olmalıdır.

Dolayısıyla benim sorum: Arduino kartı için nasıl benzersiz bir kimlik alabilirim?

Düzenle:

Bu benim şu anki yönetim kurulu listem (tek bir benzersiz kimlik yaklaşımı ile desteklenecek olan minumum listesi)

  • UNO R3
  • Mega 2560
  • Yun
  • Arduino Robot (2 Leonardo eşdeğeri pano olmalı)

Gelecekte, kendi yönetim kurullarımı da (Uno eşdeğeri ama FTDI'sız barebones) kurabilirim, eğer bir yaklaşım daha iyi olacağını söylese,


1
@jfpoilpret ... sadece siteyi incelerken bu yazıyı gördüm ... bunun nasıl bir çözüm bulacağını ya da bunun nasıl uygulanacağına dair en iyi senaryoyu buldunuz mu?
dinotom

Yanıtlar:


14

Burada benzersiz bir kimlik almak için kullanabileceğiniz birkaç teknik var.

  1. FTDI yongaları kendilerine programlanmış benzersiz bir seri numarasına sahiptir. Bu, yalnızca bildiğim kadarıyla bağlantının PC tarafından erişilebilir.
  2. Dahili USB bulunan yongaların bazıları (örneğin ATmega8U2 / 16U2 / 32U2), normal olarak USB için kullanılan imza verilerinde benzersiz bir kimliğe sahiptir. Bağlantının her iki tarafından da kolayca erişilebilir. Buna USB-> Seri köprü Arduino Uno R3 olarak kullanılan ATmega16U2 de dahildir.
  3. USB'de yerleşik olan ancak imzada benzersiz bir kimlik bulunmayan çiplerden bazıları, önyükleyici veya DFU (Aygıt Firmware Güncellemesi) için kullanılan USB yığına (örneğin LUFA) programlanmış benzersiz bir kimliğe sahip olacaktır.
  4. Bunların arasında dünya genelinde benzersiz seri ID'leri olan birçok yonga vardır; örneğin Microchip 11AA02E48 , tüm Dallas 1-Wire sensörleri (ortak DS18B20 sıcaklık sensörü dahil) ve diğer seri EEPROMS. Bunları, benzersiz bir MAC adresine sahip olması gereken üretim donanımlarında kullandım.
  5. Standart Optiboot açılış yükleyicisini (veya kullandığınız tekne yükleyicisini), benzersiz bir kimlikle tutması ve yanıt vermesi için değiştirebilirsiniz.

Bunlarla ilgili sorun, tüm kartlarda işe yarayacak 5 dışında seçenek olmamasıdır.

Çözümünüz genel olacaksa, bir USB kimliğini kullanmanın ileriye dönük olmadığını söylerdim. ~ 30 Arduino tabanlı anakart var ve sadece 5 tanesi USB donanımına sahip. Hepsinin programlanması için harici bir FTDI kablosuna ihtiyaç vardır. Bu, hepsinin aynı kimliğe sahip olacağı anlamına gelir.


2
Ne mi yapmak ile 30 panoları?
asheeshr

Esas olarak kablosuz sensör ağları için. Sadece birkaç gerçek Arduinosum var - bir Duemilanova, bir Seeeduino Mega ve bir Uno. Diğerleri Teensy, Jeenodes, WiNodes, Nanodes ve RFus'tur.
Cybergibbons

1
Olası seçeneklerin kapsamlı bir listesi için +1, teşekkürler! Tüm panolarıma özel bir donanım eklemek istemediğim için 4. sakınmayı tercih ederim. 5. tehlikeli (aynı değiştirilmiş önyükleyiciyi 2 farklı panoya yüklemek kolay) ve zahmetli (her panoya yüklemek için farklı önyükleyici kaynak koduna sahip olmak gerekir). Şimdiye kadar, USB ID ve FTDI oldukça iyi çözümler gibi gözüküyor, fakat şu anki kartımla çalışıyorlar mı?
jfpoilpret

Arduino'nun dünya çapında benzersiz seri kimlikleri var mı? Nasıl okunur?
lanse7pty

13

Çip, bildiğim kadarıyla benzersiz bir kimliğe sahip değil .... ama panolarınızı EEPROM'a programlayabilirsiniz.

EEPROM dokümantasyonu

Belirli bir adrese yazacaksınız ve sonra gelecek çizimler kimliği okuyabilir ve onunla ne yaparsa yapabilir.


Ayrıca, ev sahibi tarafında açık olmayan bir kimlik veya adres görebilirsiniz. USB aygıtları hakkında size daha fazla bilgi verecek kadar bilgim yok, ancak USB iletişimini yöneten yonga, kullanabileceğiniz benzersiz bir kimliğe sahip olabilir. Ancak, Arduino kodunuz bunu kullanamazdı.

Alternatif olarak, sadece bir etiket makinesi kullanın ve her bir panoya bir etiket koyun.


2
Sorunun benzersiz yönüne gelince, bir GUID bunu çözebilir (küçük bir hata payı içinde).
Matthew G.

Aslında bunun için EEPROM kullanmayı düşündüm; ancak bu her kurul için ek çalışma gerektiriyor: yeni bir benzersiz kimlik oluşturun, sonra EEPROM'a yazın. Ayrıca, çizimlerimin kullandığı kütüphanelerle uyumsuzluklar olabilir (aynı EEPROM adresine yazabilir). Sonunda benim bağlamımda, bilgisayarımdaki kimliği okumam gerekecekti, bu daha zor. USB benzersiz kimliği benim için daha ilginç görünüyor.
jfpoilpret

Cevabım gereğince, bunun genel bir çözüm olmasını istiyorsanız (çoğu insan için ve çok çeşitli kartlar için), USB kimliğine güvenmek, USB-> Seri köprüsüz panolarda FTDI kablo kullanan kişilerin sistemi kullanabiliyoruz.
Cybergibbons

8

Bazı kartlar, bir bilgisayara bağlandığında seri numaralarını yayınlar. Arduino Uno R3'üm diyor

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

Ne kadar eşsiz olduğundan emin değilim.


Tüm Arduino kartlarında böyle bir numara var mı? Biri olan veya olmayan panoların listesine sahip olmak güzel olurdu.
jfpoilpret

1
Madenlere bakarken, 32u4 merkezli olanlar, 328 ve SAM3X8E'de olanlar yok
Federico Fissore

4

Bildiğim kadarıyla, USB yongalarının tümü, en azından FTDI yongaları için benzersiz bir seri numarasına sahip. Linux'ta kolayca benzersiz cihaz adları atayabilir, web siteme bakabilirsiniz .

Bunun dışında, tarif ettiğiniz şey hemen hemen basit bir sürüm kontrolü biçimidir . Kaynak dosyalarınızın sürüm numaralarına sahip olduğundan emin olun. Arduino'nuzu tanımlamak için Serial.Print();kodun adını ve sürümünü yazabilirsiniz setup();.


Evet sürüm kontrolü, ulaşmak istediğim şeylerden daha fazla veya daha az; ancak kodun bir sürümünü ayarlamak ve kod her değiştiğinde değiştirmek bir seçenek değildir (unutması çok kolaydır). Eskizlerim için şu anda github kullanıyorum, ancak hangi skeçin şu anda bir panoda çalıştığını kolayca bulmak istiyorum.
jfpoilpret

4
Derleme tarihi ve saati __DATE__ve için bir makro var __TIME__. Yani en azından bu bilgiyi otomatik olarak .hex dosyanızda saklayabilirsiniz. Jfpoilpret
jippie

Güzel olan, sürümleme için bu makroları düşünmemiştim.
jfpoilpret

2

Uno'daki USB arayüzünün size benzersiz bir seri numarası verdiğinden şüpheliyim. Herhangi bir sayı, bu yongaya yüklenen kodun bir parçası olacak ve bu nedenle birden fazla Unos arasında aynı olacaktır.

Bir yaklaşım, One-wire arayüzünü kullanan DS2401 "Silikon Seri Numarası" yongasıdır. Bu sadece bir serbest pin ve bir miktar kod gerektirecektir (kod muhtemelen sorun olacaktır).

En az müdahaleci yöntem ve muhtemelen en güvenilir yöntem, kodu tekrar okumak ve toplamı kontrol etmek olacaktır. Bu kesinlikle çip imza dedektörümle yaptığım şey . Ancak, bu yalnızca (şu anda yazıldığı gibi) bootloader imzasını algılar. Oldukça küçük bir değişiklik ve tüm taslak kodunu MD5 ile özetleyebilir.

Örnek çıktı:

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 

Bu MD5 toplamı (son satır) etkin olarak belirli bir önyükleyicinin imzasıdır. Aslında en yeni sürüm onları bir masaya koyuyor:

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

Yani yapabileceğiniz şey, bir çizim yüklerken, hex kodunun MD5 toplamını oluşturmaktır. Bunu yapmanın oldukça basit yolları var. Daha sonra kaynak kodunuzda bir "git tag" işlemi yapabilirsiniz ve ardından (bazı otomatik veya manuel işlemler kullanarak) belirli bir MD5 toplam altıgen kod toplamının belirli bir anda çizim kodunu temsil ettiğini hatırlayın.

Bir çeşit veritabanı:

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

Şimdi kaynağı panodan bulmak için, kodun MD5 toplamını belirlersiniz (tahtadan geri okuyarak) ve sonra veritabanınıza bakarsınız.


1

Her biri benzersiz bir ürünle gelen bir telli sıcaklık sensörü bağladım. Tüm eskizler açılışta ben okudum ve adresi her seri bağlantıya yazdı. İhtiyacım olan tüm donanıma sahip bir kalkan yaptım, bu yüzden Uno'dan Mega'ya yükseltme yapmam gerekirse, cihazın kendine özgü bir özelliği vardı.


0

Özel donanım kimliğinizi EEPROM'a okumak ve yazmak için küçük bir kütüphane var. Arduino'nuza yanlış çizim yapmaktan kaçınmak veya başka amaçlar için cihazı tanımlamak için kullanabilirsiniz.

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

Yasal Uyarı: Ben kütüphanenin yazarı :-)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.