Kõik sai alguse sellest, et autor ostis järelturult huvitava seadme - Smart Response XE (
Nende seadmete tootmine lõpetati mitu aastat tagasi ja koolid, mille igaüks ostsid 100–200 dollari eest, ilmuvad nüüd eBays 10 dollari või vähema hinnaga. Sealne riistvara sobib väga hästi nörditavateks katseteks:
- 60 klahviga klaviatuur
- ekraan eraldusvõimega 384 × 136, 2 bitti piksli kohta - sarnane BC-le, CGA-le, kuid 4 mitte värvi, vaid heleduse gradatsiooni
- mikrokontroller ATmega128RFA1 (128 kB välkmälu, 4 kB ROM, 16 kB RAM, 802.15.4 transiiver)
- väline (mikrokontrolleri, mitte kogu seadme suhtes) 1-megabitine (128 kilobaiti) välkmälu koos SPI-liidesega
- sahtel 4 AAA elemendi jaoks.
Mikrokontrolleri nimest selgub, et see kuulub AVR perekonda, mis tähendab, et seadme Arduino-ühilduvaks muutmine on enam kui triviaalne ülesanne...
Alates uudistest
Kuid autorit huvitab rohkem võimalus mitte seadmes mängida, vaid õppida:
- välkmälu koos jadaliidesega SPI
- AVR-i alglaadurid
- standard 802.15.4
Autor alustas kirjutamisega
Sellest piisab Arduino alglaaduri üleslaadimiseks, kuid mitte eskiisi - jadaport pole seal ühendatud, nii et ilma korpuse avamiseta ei saa ikkagi hakkama. Samuti on esimese jadapordi read TX0 ja RX0 kombineeritud klaviatuurimaatriksi pollimisliinidega, nimelt nendega, mis küsivad ekraani külgedel olevaid funktsiooniklahve. Aga mis sa teha saad - autor ehitas selle:
Ta tõi sinna JTAGi liinid ja nüüd pole akupesa avamist vaja. Ja et sketše saaks üles laadida, siis ühendasin mõlemad jadapordid samasse pesasse, lisades ka lüliti, sest paigaldatud patareidega on seadet muul viisil välja lülitada füüsiliselt võimatu.
Jootekolvi, tarbenoa ja liimipüstoliga töötamine võttis päris palju aega. Üldiselt on visandite "üle õhu" üleslaadimine palju mugavam, selleks peame kiiresti midagi leiutama.
Arduino IDE kasutab programmi visandite üleslaadimiseks
Olles proovinud erinevaid viise sellest probleemist üle saada, jõudis autor järgmiseni. Seadmel on 128 KB välkmälu koos SPI liidesega - saame andmeid üle juhtmete (pidage meeles, et autoril on juba üks seade, mille küljes on pistikupesa), kasutame seda mälu puhvrina ja saadame andmed raadio teel kanalit teise seadmesse. Tere Cybikolt.
Pärast raadiokanaliga töötamiseks mõeldud koodi ja fondi kirjutamist muutus laadija pikemaks kui 4 kilobaiti. Seetõttu tuli HFUSE väärtus 0xDA-lt 0xD8-ks muuta. Nüüd võib alglaadur olla kuni 8 kilobaiti pikk ja algusaadress on nüüd 0x1E000. See kajastub Makefile'is, kuid seda tuleks arvestada ka täitmisel
ATmega802.15.4RFA128 1 transiiver on algselt loodud töötama protokolli abil
Selgus, et WiFi-st tulenevatele häiretele on kõige vähem vastuvõtlikud kanalid 15 ja 26. Autor valis neist teise. Vastutusest loobumine: tõlkija ei tea, kas ZigBee on lubatud sel viisil lihtsustada. Võib-olla peaksime natuke rohkem programmeerima ja selle täielikult juurutama?
Esimeses seadmes on vaja rakendada lõpliku oleku masin, mis edastab andmeid protokolli STK500 kaudu. Enamasti on edastatud ja vastuvõetud sõnumid isemajandavad, kuid mõned on seotud kanali varem läbinud sõnumitega. Antakse dialoogi kirjeldus
Selle dialoogi oluline komponent on sihtseadme välkmällu kirjutamiseks mõeldud pakettide edastamine. Lihtsate AVR-perekonna mikrokontrollerite puhul on lehe suurus 128 baiti, aga ATmega128RFA1 puhul 256. Ja SPI-protokolli kaudu ühendatud välkmälu puhul on see sama. Esimeses seadmes olev programm visandi üleslaadimisel ei kanna seda kohe teise, vaid kirjutab sellesse mällu. Kui Arduino IDE kontrollib kirje õigsust, siis saadetakse sinna, mis seal kirjas oli. Nüüd peame edastama vastuvõetud andmed raadiokanali kaudu teisele seadmele. Samal ajal toimub üsna sageli ümberlülitumine vastuvõtmiselt saatmisele ja tagasi. STK500 protokoll on viivituste suhtes ükskõikne, kuid ei talu andmekadu (kummaline, aga eespool öeldi, et viivitused mõjutavad ka andmeedastust). Ja kaod traadita edastuse ajal on vältimatud. ATmega128RFA1-l on sisseehitatud riistvaraline korduvate päringute realiseerimine, kui on kahtlusi ülekande õigsuses, kuid autor otsustas sama tarkvara ise juurutada. Ta töötas välja protokolli, milles ühes suunas liigub palju rohkem andmeid kui teises suunas.
See pole täiuslik, kuid see töötab. 256-baidine leht on jagatud neljaks segmendiks, millest igaüks edastatakse õhu kaudu paketina. Pakett mahutab kuni 125 baiti andmeid, millele lisandub üks bait pikkuseks ja kaks baiti CRC jaoks. Nii paigutatakse sinna 64 baiti pikkused fragmendid koos lehe- ja segmendinumbritega (0 kuni 3). Vastuvõtval seadmel on muutuja, mis võimaldab jälgida, mitu segmenti on vastu võetud ja kui kõik neli saabuvad, saab saatev seade kinnituse, et kogu leht on vastu võetud. Kinnitust pole (CRC ei ühti) – saada terve leht uuesti. Kiirus on isegi suurem kui kaabli kaudu edastamisel. Vaata:
Aga üldiselt oleks vaja ette näha mugav viis juhtme ühendamiseks sketšide üleslaadimiseks ja selle kaudu seadmetega. Näiteks asetage CP2102-le selline liidesemuundur, nagu fotol, ja liimige see plaadile, et see taluks Micro USB-kaabli ühendamisel ja lahtiühendamisel tekkivat jõudu.
Sellel on ka 3,3-voldine stabilisaator (ja kuidas seda kasutada 6-voldise toiteallikaga seadmes - kui ainult sellel on sama stabilisaator ja saate lisada kaks dioodi, et automaatselt valida, kumb neist seadet toidab) . Kõik kolm LED-i peavad olema liidese muunduri plaadilt lahti joodetud, vastasel juhul koormavad nad nendega töötades täiendavalt akusid ning segavad ka klaviatuuri pollimist ja tööd SPI-liidesega välkmäluga.
Eesmärgi poole püüdlemine osutus veelgi huvitavamaks kui selle saavutamine (ja seda nalja bussi kohta pole vaja). Autor sai palju teada AVR alglaadurite, SPI välkmälu, STK500 protokolli ja 802.15.4 standardi kohta.
Kõik muud koodid lisaks ülalkirjeldatud teegile on −
Allikas: www.habr.com