Rašome OTA įkrovos programą, skirtą ATmega128RFA1 (kaip Smart Response XE įrenginio dalis)

Rašome OTA įkrovos programą, skirtą ATmega128RFA1 (kaip Smart Response XE įrenginio dalis)

Viskas prasidėjo nuo to, kad autorius antrinėje rinkoje įsigijo įdomų įrenginį - Smart Response XE (trumpas aprašymas). Jis skirtas mokykloms: kiekvienas klasės mokinys gauna prietaisą, panašų į elektroninį sąsiuvinį ar vertėją iš 802.15.4-ojo dešimtmečio, mokytojas užduoda klausimą, o mokiniai įrenginių klaviatūromis renka atsakymus, kurie gaunami per a. radijo kanalą (XNUMX) į imtuvą, prijungtą prie mokytojo PC.

Šie įrenginiai buvo nutraukti prieš kelerius metus, o mokyklos įsigijo už 100–200 USD, dabar „eBay“ pasirodo už 10 USD ar mažiau. Ten esanti techninė įranga labai tinka geekingiems eksperimentams:

  • 60 klavišų klaviatūra
  • ekranas su 384×136 raiška, 2 bitai pikselyje – panašus į BC, CGA, bet 4 ne spalvos, o ryškumo gradacijos
  • mikrovaldiklis ATmega128RFA1 (128 kB „flash“ atmintis, 4 kB ROM, 16 kB RAM, 802.15.4 siųstuvas-imtuvas)
  • išorinė (mikrovaldiklio, o ne viso įrenginio atžvilgiu) 1 megabito (128 kilobaitų) „flash“ atmintis su SPI sąsaja
  • skyrius 4 AAA elementams.

Iš mikrovaldiklio pavadinimo aišku, kad jis priklauso AVR šeimai, o tai reiškia, kad įrenginį suderinti su Arduino yra daugiau nei trivialus uždavinys...

Nuo naujienų Hackadajus autorius sužinojo, kas tai yra jau padarė (ta pati nuoroda nurodo, ką kur prijungti), turint galimybę paleisti žaidimus Arduboy:


Tačiau autorę labiau domina galimybė ne žaisti įrenginyje, o mokytis:

  • Flash atmintis su nuoseklia SPI sąsaja
  • AVR įkrovos įkrovikliai
  • Standartas 802.15.4

Autorius pradėjo rašyti bibliotekos (GPL v3), kuri leidžia inicijuoti ekraną, išvesti tekstą ir stačiakampius bei pasiekti SPI „flash“ atmintį. Tada jis pradėjo kurti praktinio įrenginio naudojimo idėjas: su VT-100 suderinamas kišeninis terminalas, kelių žaidėjų žaidimai. Perstatęs tris įrenginius, jis nusprendė „išmokyti“ juos priimti eskizus „per eterį“. Kas būtų ne tik įdomu, bet ir labai patogu: įrenginio korpusas kaskart sunkiai atsidaro, o po baterijos skyriaus dangteliu yra tik skylės, leidžiančios prie plokštės prijungti JTAG programuotoją.

Rašome OTA įkrovos programą, skirtą ATmega128RFA1 (kaip Smart Response XE įrenginio dalis)

To pakanka įkelti „Arduino“ įkrovos tvarkyklę, bet ne eskizą – nuoseklusis prievadas ten neprijungtas, todėl neatidarius dėklo vis tiek nepavyks. Be to, pirmojo nuosekliojo prievado TX0 ir RX0 eilutės yra derinamos su klaviatūros matricos apklausos eilutėmis, būtent tomis, kurios apklausia funkcijų klavišus ekrano šonuose. Bet ką tu gali padaryti - autorius sukūrė tai:

Rašome OTA įkrovos programą, skirtą ATmega128RFA1 (kaip Smart Response XE įrenginio dalis)

Jis ten atnešė JTAG linijas, o dabar nereikia atidaryti akumuliatoriaus skyriaus. O kad būtų galima įkelti eskizus, abu nuosekliuosius prievadus sujungiau prie tos pačios jungties, taip pat pridėdamas jungiklį, nes su įdėtomis baterijomis fiziškai neįmanoma išjungti įrenginio kitaip.

Dirbti su lituokliu, komunaliniu peiliu ir klijų pistoletu prireikė nemažai laiko. Apskritai eskizų įkėlimas „per eterį“ yra daug patogiau, mums skubiai reikia ką nors sugalvoti.

Arduino IDE naudoja programą eskizams įkelti avrdude. Jis sąveikauja su mikrovaldikliu naudodamas protokolą STK500, kuri leidžia perkelti failus į abi puses. Jis prastai suderinamas su kanalais, kuriuose galimi kintami vėlavimai, iškraipymai ir duomenų praradimas. Jei nuosekliajame kanale kažkas atsilaisvins ar sušnabžda, galite išprotėti ieškodami priežasties. Kartą autorius kentėjo pusę dienos, kol suprato, kad problema – blogas laidas, taip pat kaprizingas CP2102 sąsajos keitiklis. Netgi mikrovaldiklis su įmontuotu sąsajos keitikliu, pavyzdžiui, ATmega32u4, kartais gali veikti taip. Kiekvienas Arduino vartotojas pastebėjo, kad klaidų įkeliant eskizus pasitaiko ne taip jau retai. Kartais įrašymas vyksta gerai, tačiau bandomojo skaitymo metu aptinkama klaida. Tai nereiškia, kad rašant įvyko klaida – skaitymo metu įvyko gedimas. Dabar įsivaizduokite, kad dirbant „per orą“ nutiks tas pats, bet daug dažniau.

Išbandęs įvairius būdus, kaip įveikti šią problemą, autorius sugalvojo štai ką. Įrenginys turi 128 KB „flash“ atmintį su SPI sąsaja – duomenis gauname laidais (atminkite, kad autorius jau turi vieną įrenginį su jungtimi šone), šią atmintį naudojame kaip buferį, o duomenis siunčiame per radiją. kanalą į kitą įrenginį. Sveiki iš Cybiko.

Parašius kodą darbui su radijo kanalu bei šriftą, kroviklis tapo ilgesnis nei 4 kilobaitai. Todėl HFUSE reikšmę reikėjo pakeisti iš 0xDA į 0xD8. Dabar įkrovos programa gali būti iki 8 kilobaitų ilgio, o pradinis adresas dabar yra 0x1E000. Tai atsispindi Makefile, bet į tai taip pat reikia atsižvelgti pildant įkrovos įkroviklis per avrdude.

802.15.4 siųstuvas-imtuvas ATmega128RFA1 iš pradžių buvo sukurtas veikti naudojant protokolą „ZigBee“, kuris yra gana sudėtingas, todėl autorius nusprendė tiesiog perduoti paketus. Tai įdiegta ATmega128RFA1 aparatinėje įrangoje, todėl reikia nedaug kodo. Be to, dėl paprastumo autorius nusprendė naudoti fiksuotą kanalą, neleisdamas jo pasirinkti net rankiniu būdu. 802.15.4 standartas palaiko 16 kanalų su skaičiais nuo 11 iki 26. Jie gana perpildyti, kai kurie taip pat persidengia su WiFi kanalais (raudona – ZigBee kanalai, mėlyna, žalia ir geltona – WiFi).

Rašome OTA įkrovos programą, skirtą ATmega128RFA1 (kaip Smart Response XE įrenginio dalis)

Paaiškėjo, kad mažiausiai WiFi trikdžiams jautrūs 15 ir 26 kanalai, iš kurių autorius pasirinko antrąjį. Atsakomybės apribojimas: vertėjas nežino, ar leidžiama tokiu būdu supaprastinti ZigBee. Gal reikėtų šiek tiek daugiau programuoti ir jį visiškai įgyvendinti?

Pirmajame įrenginyje būtina įdiegti baigtinės būsenos mašiną, kuri perduoda duomenis per STK500 protokolą. Dažniausiai perduodami ir gaunami pranešimai yra savarankiški, tačiau kai kurie yra susieti su tais, kurie kanalu buvo perduoti anksčiau. Pateikiamas dialogo aprašymas čia.

Svarbus šio dialogo komponentas yra paketų, skirtų įrašyti į paskirties įrenginio „flash“ atmintį, perdavimas. Paprastiems AVR šeimos mikrovaldikliams puslapio dydis – 128 baitai, o ATmega128RFA1 – 256. O „flash“ atmintyje, kuri jungiama per SPI protokolą – tiek pat. Pirmame įrenginyje esanti programa, įkeldama eskizą, ne iš karto perkelia jį į antrąjį, o įrašo į šią atmintį. Kai Arduino IDE patikrina įrašo teisingumą, siunčiama tai, kas ten buvo parašyta. Dabar turime perduoti gautus duomenis radijo kanalu į antrąjį įrenginį. Tuo pačiu metu perėjimas iš priėmimo į siuntimą ir atgal vyksta gana dažnai. STK500 protokolas yra abejingas vėlavimui, tačiau netoleruoja duomenų praradimo (keista, bet aukščiau buvo pasakyta, kad vėlavimai taip pat turi įtakos duomenų perdavimui). O nuostoliai belaidžio perdavimo metu yra neišvengiami. ATmega128RFA1 turi įmontuotą techninę įrangą kartotinių užklausų įgyvendinimui, kai kyla abejonių dėl perdavimo teisingumo, tačiau autorius nusprendė tą patį įdiegti programinėje įrangoje. Jis sukūrė protokolą, pagal kurį į vieną pusę patenka daug daugiau duomenų nei į kitą.

Tai nėra tobula, bet veikia. 256 baitų puslapis yra padalintas į keturis segmentus, kurių kiekvienas yra perduodamas kaip paketas. Paketas gali talpinti iki 125 baitų duomenų plius vieną baitą ilgiui ir du baitus CRC. Taigi ten dedami 64 baitų ilgio fragmentai kartu su puslapių ir segmentų numeriais (nuo 0 iki 3). Priimantis įrenginys turi kintamąjį, leidžiantį sekti, kiek segmentų gauta, o kai atkeliauja visi keturi, siunčiantis įrenginys gauna patvirtinimą, kad gautas visas puslapis. Patvirtinimo nėra (CRC neatitiko) – iš naujo siųskite visą puslapį. Greitis dar didesnis nei perduodant laidu. Matyti:


Bet apskritai reikėtų numatyti patogų būdą prijungti laidą prie eskizų įkėlimo įrenginių ir per jį. Pavyzdžiui, įdėkite į CP2102 vidų tokį sąsajos keitiklį, kaip nuotraukoje, ir priklijuokite jį prie plokštės, kad jis atlaikytų jėgą prijungiant ir atjungiant Micro USB kabelį.

Rašome OTA įkrovos programą, skirtą ATmega128RFA1 (kaip Smart Response XE įrenginio dalis)

Jis taip pat turi 3,3 voltų stabilizatorių (ir kaip jį naudoti įrenginyje su 6 voltų maitinimo šaltiniu - jei tik jis turi tą patį stabilizatorių, ir galite pridėti du diodus, kad automatiškai pasirinktumėte, kuris iš jų maitins įrenginį) . Visi trys šviesos diodai turi būti išlituoti iš sąsajos keitiklio plokštės, kitaip jie papildomai apkraus baterijas, kai juos veikia, taip pat trukdys klaviatūros apklausai ir darbui su „flash“ atmintimi su SPI sąsaja.

Siekti tikslo pasirodė net įdomiau nei jį pasiekti (ir nereikia to juokelio apie autobusą). Autorius daug sužinojo apie AVR įkroviklius, SPI „flash“ atmintį, STK500 protokolą ir 802.15.4 standartą.

Visas kitas kodas, be aukščiau aprašytos bibliotekos, yra − čia, ir ji taip pat taikoma GPL v3. Autoriaus Twitter – čia.

Šaltinis: www.habr.com

Добавить комментарий