
Sve je počelo kupnjom zanimljivog uređaja na sekundarnom tržištu — Smart Response XE (). Namijenjen je školama: svaki učenik u razredu dobiva uređaj sličan elektroničkoj bilježnici ili prevoditelju iz devedesetih, učitelj postavlja pitanje, a učenici unose odgovore na tipkovnicama uređaja, koji se putem radio veze (802.15.4) šalju na prijemnik povezan s učiteljskim računalom.
Podrška za te uređaje prekinuta je prije nekoliko godina, a ono što su škole kupovale po 100-200 dolara za komad sada se na eBayu prodaje za 10 i manje. „Hardver“ je izuzetno prikladan za geekovske eksperimente:
- tipkovnica sa 60 tipki
- prikaz s rezolucijom od 384×136, 2 bita po pikselu — sličan BK, CGA, ali 4 nisu boje, nego nijanse svjetline
- mikrokontroler ATmega128RFA1 (128 kB flash memorije, 4 kB EEPROM-a, 16 kB RAM-a, prijemnik i odašiljač standarda 802.15.4)
- vanjska (u odnosu na mikrokontroler, a ne cijeli uređaj) flash memorija kapaciteta 1 megabit (128 kilobajta) s SPI sučeljem
- odjeljak za 4 AAA baterije.
Iz naziva mikrokontrolera jasno je da pripada AVR obitelji, a to znači da je zadatak učiniti uređaj kompatibilnim s Arduinom više nego trivijalan...
Iz vijesti na autor je saznao da je to (na toj istoj poveznici opisano je kako povezati), stječući mogućnost pokretanja igara za Arduboy:

No autora više zanima mogućnost ne igranja na uređaju, već istraživanje:
- flash memorija s serijskim SPI sučeljem
- bootloaderi za AVR
- standard 802.15.4
Autor je započeo pisanjem (GPL v3), koja omogućava inicijalizaciju prikaza, ispisivanje teksta i pravokutnika, te pristup flash memoriji s SPI sučeljem. Zatim je počeo smišljati ideje za praktičnu upotrebu uređaja: džepni VT-100-kompatibilan terminal, višekorisničke igre. Prepravivši tri uređaja, odlučio je "naučiti" ih primati skice "zrakom". Što bi bilo ne samo zanimljivo, nego i vrlo praktično: kućište uređaja svaki put teško je otvoriti, a ispod poklopca odjeljka za baterije nalaze se samo otvori koji omogućuju povezivanje JTAG programatora s pločom.

To je dovoljno za učitavanje Arduino bootloadera, ali ne i skice — serijski port nije dostupan, pa bez otvaranja kućišta neće ići. Također, TX0 i RX0 prve serijske linije su spojeni s linijama upitne matrice tipkovnice, točno s linijama koje provjeravaju funkcijske tipke s obje strane zaslona. No, što je tu je — autor je stvorio sljedeće:

Ovdje je isključio JTAG linije, i sada nije nužno otvoriti odjeljak za baterije. A kako bi mogao učitavati i skice, povezao je i oba serijska porta na ovu istu vezu, dodajući i prekidač, jer nije moguće fizički isključiti uređaj kada su baterije instalirane.
Bilo je potrebno prilično dugo raditi s lemilicom, službenim nožem i pištoljem za ljepilo. Ukratko, učitavanje skica 'zrakom' je znatno praktičnije, nešto se hitno mora izmisliti za to.
Arduino IDE za učitavanje skica koristi program . Komunicira s mikroprocesorom putem protokola , koji omogućuje prijenos datoteka u oba smjera. Loše se uklapa s kanalima gdje su moguće promjenjive kašnjenja, izobličenja i gubitak podataka. Ako u serijskom kanalu nešto škripi ili šumovi, možeš poludjeti pokušavajući pronaći uzrok. Jednom je autor proveo pola dana, dok nije shvatio da je problem u lošem kabelu, kao i u nepredvidljivom sučelju za pretvorbu CP2102. Čak i mikroprocesor s integriranim sučeljem za pretvorbu, poput ATmega32u4, ponekad može 'izgubiti razum'. Svaki korisnik Arduina primijetio je da greške pri učitavanju skica nisu tako rijetke. Ponekad zapis prolazi normalno, ali prilikom provjere očitavanja otkrije se greška. To ne znači da je greška bila pri zapisivanju — došlo je do kvara prilikom čitanja. A sada zamislite da će se isto to događati kada radite 'zrakom', ali mnogo češće.
Isprobavši različite načine rješavanja ovog problema, autor je smislio sljedeće. Uređaj ima 128-kilobajtnu FLASH memoriju s SPI sučeljem — primamo podatke kroz žice (sjetimo se da je jedan uređaj s priključkom sa strane već kod autora), koristimo ovu memoriju kao međuspremnik i šaljemo podatke na drugo uređaj putem radio kanala. To je pozdrav od Cybiko.
Nakon pisanja koda za rad s radio kanalom, kao i fonta, bootloader je postao duži od 4 kilobajta. Stoga je vrijednost HFUSE morala biti promijenjena s 0xDA na 0xD8. Sada bootloader može imati dužinu do 8 kilobajta, a početna adresa je postavljena na 0x1E000. To je odraženo u Makefile, ali treba to uzeti u obzir i pri učitavanju. pomoću avrdude.
Transiver standarda 802.15.4 u ATmega128RFA1 prvotno je namijenjen za rad s protokolom , koji je prilično složen, stoga je autor odlučio umjesto toga jednostavno slati pakete. To je u ATmega128RFA1 implementirano hardverski, tako da će trebati malo koda. Također, radi pojednostavljenja, autor je odlučio koristiti fiksni kanal, ne dopuštajući čak ni ručni odabir. Standard 802.15.4 podržava 16 kanala s brojevima od 11 do 26. Oni su prilično zasićeni, neki također preklapaju WiFi kanale (crvenom označeni ZigBee kanali, plavim, zelenim i žutim — WiFi).

Ispostavilo se da su kanali 15 i 26 najmanje podložni smetnjama od WiFi. Drugi od njih autor je izabrao. Odricanje od odgovornosti: prevoditelj ne zna je li dopušteno ovako pojednostaviti ZigBee. Možda bi trebalo još malo programirati i potpuno ga implementirati?
Na prvom od uređaja potrebno je implementirati konačni automat koji šalje podatke putem protokola STK500. Uglavnom, poruke koje se šalju i primaju su samodostatne, ali neke su vezane uz one koje su ranije prošle kroz kanal. Opis dijaloga je prikazan. .
Važan dio ovog dijaloga je prijenos paketa namijenjenih za upis u flash memoriju odredišnog uređaja. Kod jednostavnih mikrokontrolera iz AVR porodice veličina stranice iznosi 128 bajtova, dok je za ATmega128RFA1 256. A za tu flash memoriju koja se povezije putem SPI protokola, ona je ista. Program u prvom uređaju pri slanju sketcha ga ne šalje odmah u drugi, već ga zapisuje u tu memoriju. Kada Arduino IDE provjeri ispravnost upisa, šalje ono što je zabilježeno. Sada je potrebno prenijeti primljene podatke putem radijskog kanala u drugi uređaj. Pri tome, prebacivanje s primanja na slanje i obrnuto događa se prilično često. STK500 protokol je neosjetljiv na kašnjenja, ali ne trpi gubitak podataka (čudno, a ranije je rečeno da kašnjenja u prijenosu podataka također utječu). A gubici pri bežičnom prijenosu su neizbježni. U ATmega128RFA1 ugrađena je hardverska implementacija ponovljenih zahtjeva kada je u pitanju sumnja u ispravnost prijenosa, ali autor je odlučio implementirati isto programski sam. Razvio je protokol pri čemu u jednom smjeru prolazi znatno više podataka nego u drugom.
Nije savršen, ali sve radi. Stranica od 256 bajtova se dijeli na četiri segmenta, pri čemu se svaki prenosi putem radijskog kanala kao paket. Paket može sadržavati do 125 bajtova podataka plus jedan bajt — dužinu i dva — CRC. Tako da se fragmenti dužine 64 bajta zajedno s brojevima stranica i segmenata (od 0 do 3) smještaju. U primajućem uređaju postoji varijabla koja omogućava praćenje koliko je segmenata primljeno, a kada stignu svi četiri, na uređaj koji šalje dolazi potvrda da je cijela stranica primljena. Nema potvrde (CRC se ne poklapa) — ponovo šaljemo cijelu stranicu. Brzina pri tome ispada čak i veća nego prilikom prijenosa putem kabela. Pogledajte:

Ali zapravo, trebalo bi predvidjeti praktičan način za povezivanje uređaja putem kabela za slanje sketcheva. Na primjer, smjestiti unutar takvog pretvarača sučelja na CP2102, kao na fotografiji, i pričvrstiti ga na ploču tako da izdrži napor pri povezivanju i isključivanju Micro USB kabela.

Također, ima 3,3-voltnu stabilizaciju (i kako je primijeniti u uređaju s 6-voltnim napajanjem — ako postoji slična stabilizacija, može se dodati dva dioda kako bi se automatski biralo od kojeg će se napajati uređaj). Sa ploče pretvarača su potrebna uklanjanja tri LED dioda, inače će dodatno opterećivati baterije kada se radi s njima, kao i ometati upit tipkovnice i rad s flash memorijom putem SPI sučelja.
Progon cilja ispalo je čak zanimljivije od njegovog dostizanja (i ne trebate onaj vic o autobusu). Autor je saznao mnogo novog o bootloaderima za AVR, flash memoriji s SPI sučeljem, STK500 protokolu i 802.15.4 standardu.
Sav ostali kod uz navedenu biblioteku — , također je pod GPL v3. Autorov Twitter — .
Izvor: habr.com
