
Kõik algas autori huvitava seadme — Smart Response XE (). See on mõeldud koolidele: iga õpilane klassis saab seadme, mis sarnaneb elektroonilise märkmiku või 90ndate tõlkijaga, õpetaja esitab küsimuse ja õpilased sisestavad seadme klaviatuuridel vastused, mis saadetakse raadiokanali (802.15.4) kaudu vastuvõtjale, mis on ühendatud õpetaja PC-ga.
Nende seadmete tugi lõpetati aastaid tagasi, ja see, mida koolid ostsid 100–200 dollari eest tükist, on nüüd eBay-s saadaval alla 10 dollariga. "Riistvara" sobib väga hästi geegikatsedeks:
- 60 klahvi klaviatuur
- näidik 384×136 eraldusvõimega, 2 bitti pikseli kohta — sarnane BKi, CGA-ga, kuid 4 ei ole värve, vaid heledusastmeid
- mikrokontroller ATmega128RFA1 (128 kB mäluflash, 4 kB ROM, 16 kB RAM, 802.15.4 standardi vastuvõtja ja saatja)
- väline (mikrokontrolleri suhtes, mitte kogu seadme suhtes) 1 megabiti (128 kilobaiti) mäluflash SPI liidese kaudu
- jaoks 4 AAA elementi.
Mikrokontrolleri nimetust vaadates on selge, et see kuulub AVR perekonda, mis tähendab, et Arduino ühilduva seadme valmistamine on rohkem kui triviaalne ülesanne...
Uudise põhjal autor sai teada, et (sama link räägib ka sellest, kuhu ühenduda), võimaldades mängude käivitamist Arduboy jaoks:

Kuid autorit huvitab rohkem võimalus mitte mängida seadmest, vaid uurida:
- seeria SPI liidesega mälumäng
- AVRi laadijad
- 802.15.4 standard
Autor hakkas kirjutama (GPL v3), mis võimaldab algatada ekraani, kuvada teksti ja ristkülikke ning ligipääsu saada seeria SPI liidesega mälule. Seejärel hakkas ta välja mõtlema seadme praktilisi kasutusideid: taskus olev VT-100 ühilduv terminal, mitme mängijaga mängud. Kolme seadme ümbertegemise järel otsustas ta neid 'õhust' sketšidega 'koolitada'. See oleks mitte ainult huvitav, vaid ka väga mugav: seadme korpuse avamine iga kord on keeruline ning patareide sahtli all on vaid augud, mis võimaldavad JTAG programmeerija plaadiga ühendamist.

Selle on piisav, et laadida Arduino alglaadija, kuid mitte skeemi — seeriaporti sinna ei viidud, ilma korpuse avamiseta ei saa ühtegi asja teha. Samuti on TX0 ja RX0 esimese seeria porti jooned ühendatud klaviatuuri maatriksi küsitluse joontega, nimelt — nende, mille kaudu küsitakse funktsionaalseid klahve ekraani külgedel. Kuid mis teha — autor on kokku pannud sellise lahenduse:

Seal on ta välja toonud JTAG-jooned, ja nüüd ei ole aku pesa avamine vajalik. Ja et oleks võimalik laadida ka skeeme, on ta samale ühendusele viinud välja ka mõlemad seeria pordid, lisades ka lüliti, kuna akud paigaldatuna ei saa seadet muul viisil füüsiliselt välja lülitada.
Töötasin üsna kaua jootekolbiga, kontorinoaga ja liimipüstoliga. Ühesõnaga, "õhu kaudu" skeemide laadimine on oluliselt mugavam, tuleks sellele kiiresti midagi välja mõelda.
Arduino IDE skeemide laadimiseks kasutab programmi . See suheldakse mikrokontrolleriga protokolli kaudu , failide edastamiseks mõlemas suunas. See on halva ühilduvusega kanalite puhul, kus esinevad muutuvad viivitused, moonutused ja andmete kadumine. Kui järjestikuses kanalis midagi klõbiseb või krigiseb, võib põhjusest tulenev otsing viia hulluks. Ühe korra kulutas autor pool päeva, enne kui mõistis, et probleem oli halvas kaablis ning probleemses CP2102 liideseadapteris. Isegi mikrojuhtimisseade koos sisseehitatud liideseadapteriga, näiteks ATmega32u4, võib aeg-ajalt „vinguda”. Iga Arduino kasutaja on märganud, et sketšide üleslaadimise vead ei ole haruldased. Mõnikord läheb kirjutamine probleemideta, kuid kontrollides ilmneb viga. See ei tähenda, et kirjutamise ajal esines viga — tõrge ilmus lugemise ajal. Kujutage nüüd ette, et juhtmevabalt töötades toimub sama, kuid palju sagedamini.
Pärast erinevate meetodite proovimist selle probleemi ületamiseks leidis autor järgmise lahenduse. Seadmestikul on 128-kilobaitine Flash-mälu SPI-liidesega — andmeid edastatakse kaabli kaudu (peame meeles, et autoril on juba üks seade, millel on külgport), kasutame seda mälu puhvrina ja edastame andmed raadioside kaudu teise seadmesse. Selline tervitus Cybikolt.
Pärast koodi kirjutamist raadioside jaoks ja fondi jaoks kasvas laadija pikkus üle 4 kilobaiti. Seetõttu pidi HFUSE väärtus muutuma 0xDA-lt 0xD8-le. Nüüd võib laadija olla kuni 8 kilobaidi pikkune, algne aadress on nüüd 0x1E000. See on kajastatud Makefile'is, kuid peab olema arvesse võetud ka üleslaadimise ajal. avrdude'i abil.
802.15.4 standardiga vastuvõtja ja saatja ATmega128RFA1 on algselt mõeldud tööks protokolliga , mis on üsna keeruline, seetõttu otsustas autor selle asemel lihtsalt pakette edasi anda. ATmega128RFA1 on see riistvaraliselt teostatud, nii et koodi vajatakse vähe. Samuti otsustas autor lihtsuse huvides kasutada fikseeritud kanali, võimaldades isegi selle käsitsi valida. Standard 802.15.4 toetab 16 kanalit numbritega alates 11 kuni 26. Need on üsna hõivatud, mõned kattuvad ka WiFi kanalitega (ZigBee kanalid on märgitud punasega, WiFi kanalid sinise, rohelise ja kollasega).

Selgus, et WiFi häiretele on kõige vähem vastuvõtlikud kanalid 15 ja 26. Teise neist valis autor. Üksikasjalik tähelepanek: tõlkija ei tea, kas ZigBee simplifitseerimine on lubatud. Võib-olla tasub veel veidi programmeerida ja see täielikult rakendada?
Esimesel seadmel tuleb rakendada lõppautomaat, mis edastab andmeid protokolli STK500 kaudu. Enamasti on edastatavad ja vastuvõetavad sõnumid iseseisvad, kuid mõned on seotud varem kanalil läbinud sõnumitega. Dialooge kirjeldav teave on toodud. .
Oluline osa sellest dialoogist on andmepakettide edastamine, mis on mõeldud määratud seadme mälusse kirjutamiseks. Lihtsatel AVR mikrocontrolleritel on lehekülje suurus 128 baiti, kuid ATmega128RFA1-l on see 256 baiti. Samuti on see sama SPI protokolli kaudu ühendatud välkmälus. Esimeses seadmes, kui sketši üleslaadimine toimub, ei edastata seda kohe teise seadmesse, vaid kirjutatakse see mälu. Kui Arduino IDE kontrollib kirjutamise õigsust, saadetakse sellele see, mis sinna on salvestatud. Nüüd tuleb edastada saadud andmed raadiokanalil teise seadmesse. Sel juhul toimub vastuvõtult edastamisele ja tagasi lülitumine üsna tihti. Protokoll STK500 on viivituste suhtes ükskõikne, kuid ei talu andmete kaotsiminekut (imet, eelnevalt öeldi, et andmete edastamise viivitused mõjutavad samuti). Kuid kaotused juhtmevabas edastamises on vältimatud. ATmega128RFA1-l on sisseehitatud riistvaraline kordusküsimise teostus kahtluse korral edastamise õigsusest, kuid autor otsustas selle ise programmeerida. Ta töötas välja protokolli, mille kohaselt ühes suunas edastatakse oluliselt rohkem andmeid kui teises.
See ei ole ideaalne, kuid kõik töötab. 256-baitine leht jagatakse neljaks segmendiks, millest igaüht edastatakse raadiosaatjana paketina. Pakett mahutab kuni 125 baitit andmeid pluss ühe bait – pikkus ja kaks – CRC. Nii et 64-baitised fragmendid koos lehe ja segmentide numbritega (0–3) mahutatakse sinna. Vastava seadme abil on võimalik jälgida, kui palju segmente on vastuvõetud, ja kui kõik neli saabuvad, saadetakse edastavale seadmele kinnitussignaal, et kogu leht on vastuvõetud. Kui kinnitust ei ole (CRC ei klapi) – saadame kogu lehe uuesti. Sellegipoolest on edastuskiirus isegi suurem kui kaabli kaudu edastamisel. Vaata:

Kuid tegelikult peaks planeerima mugava viisi seadmete ühendamiseks kaabli abil sketšide üleslaadimiseks. Näiteks panna sisse selline CP2102 liidese konverter, nagu pildil, ja kleepida see plaadile nii, et see talub jõudu Micro USB kaabli ühendamisel ja eemaldamisel.

Samuti on seal 3,3-volti stabilisaator (ja kuidas seda kasutada 6-volti toitega seadmes — ainult juhul, kui seal on sama stabilisaator, ja saab lisada kaks dioodi, et automaatselt valida, millest seade toidet saab). Liidese muunduri plaadilt tuleb välja joota kõik kolm LED-i, vastasel juhul koormavad need patareisid lisaks nende töötamisele ning takistavad klaviatuuri küsitlemist ja töötlust SPI liidese mäluga.
Sihtpunkti jahtimine osutus isegi huvitavamaks kui selle saavutamine (ja ei tohi mainida seda anekdooti bussist). Autor õppis palju uut AVR-i laadijate, SPI liidese mälude, STK500 protokolli ja 802.15.4 standardi kohta.
Kogu ülejäänud kood lisaks eelpool kirjeldatud teegile — , ja see on samuti GPL v3 all. Autori Twitter — .
Allikas: habr.com
