Viskas prasidėjo nuo to, kad autorius antrinėje rinkoje įsigijo įdomų įrenginį - Smart Response XE (
Š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ų
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
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:
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
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
802.15.4 siųstuvas-imtuvas ATmega128RFA1 iš pradžių buvo sukurtas veikti naudojant protokolą
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
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į.
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 −
Šaltinis: www.habr.com