
Allt började med att författaren köpte en intressant enhet pĂ„ andrahandsmarknaden â Smart Response XE (). Den Ă€r avsedd för skolor: varje elev i klassen fĂ„r en enhet som liknar en elektronisk anteckningsbok eller en översĂ€ttare frĂ„n nittiotalet, lĂ€raren stĂ€ller en frĂ„ga, och eleverna skriver sina svar pĂ„ enhetens tangentbord, som sĂ€nds via radiokanal (802.15.4) till en mottagare kopplad till lĂ€rarens dator.
Stödet för dessa enheter upphörde för flera Är sedan, och det som skolor köpte för 100-200 dollar styck dyker nu upp pÄ eBay för 10 eller mindre. 'HÄrdvaran' dÀr passar verkligen för nördiga experiment:
- ett tangentbord med 60 tangenter
- en skĂ€rm med en upplösning pĂ„ 384Ă136, 2 bitar per pixel â liknande BK, CGA, men 4 fĂ€rger, utan gradationer av ljusstyrka
- mikrokontroller ATmega128RFA1 (128 kB flashminne, 4 kB EEPROM, 16 kB RAM, sÀndare/mottagare av standard 802.15.4)
- extern (i förhÄllande till mikrokontrollern, inte hela enheten) flashminne pÄ 1 megabit (128 kilobyte) med SPI-grÀnssnitt
- fack för 4 AAA-batterier.
Av namnet pÄ mikrokontrollern framgÄr att den tillhör AVR-familjen, och att göra enheten Arduino-kompatibel Àr en mer Àn trivialisak uppgift...
FrÄn nyheten pÄ fick författaren veta att detta (i samma lÀnk förklaras vad som ska kopplas till var), vilket ger möjlighet att köra spel för Arduboy:

Men författaren Àr mer intresserad av möjligheten att inte bara spela pÄ enheten, utan att studera:
- flashminnet med seriellt SPI-grÀnssnitt
- bootloaders för AVR
- standard 802.15.4
Författaren började med att skriva (GPL v3), vilket möjliggör att initiera skÀrmen, visa text och rektanglar, samt fÄ tillgÄng till flashminnet med SPI-grÀnssnitt. Sedan började han tÀnka pÄ idéer för praktisk anvÀndning av enheten: en fick VT-100-kompatibel terminal, multiplayer-spel. Efter att ha modifierat tre enheter bestÀmde han sig för att 'lÀra' dem att ta emot sketches 'över luften'. Det skulle vara bÄde intressant och mycket bekvÀmt: det Àr svÄrt att öppna enhetens hölje varje gÄng, och under batterifacket finns bara hÄl för att koppla JTAG-programmeraren till kortet.

Detta Ă€r tillrĂ€ckligt för att ladda upp bootloadern för Arduino, men inte sketcher â seriellporten Ă€r inte utkopplad, sĂ„ utan att öppna höljet kommer man inte undan. Dessutom Ă€r TX0- och RX0-linjerna för den första seriella porten ihopkopplade med linjerna som anvĂ€nds för att frĂ„ga tangentbordsmatrisen, det vill sĂ€ga de som ocksĂ„ anvĂ€nds för att frĂ„ga funktionsknapparna pĂ„ sidorna av skĂ€rmen. Men vad ska man göra â författaren har konstruerat det hĂ€r:

Till dessa har han kopplat JTAG-linjerna, och nu Àr det inte lÀngre nödvÀndigt att öppna batterifacket. För att man ocksÄ ska kunna ladda upp sketcher har han kopplat bÄda de seriella portarna till samma kontakt, och lagt till en strömbrytare, eftersom det pÄ annat sÀtt Àr omöjligt att stÀnga av enheten med installerade batterier.
Det tog ganska lÄng tid att arbeta med lödkolven, en skrivkniv och en limpistol. Generellt sett Àr det betydligt enklare att ladda upp sketcher "trÄdlöst"; man mÄste snabbt hitta nÄgot för detta.
Arduino IDE anvĂ€nder programmet för att ladda upp sketcher . Det interagerar med mikrokontrollern enligt protokollet , vilket möjliggör överföring av filer i bĂ„da riktningarna. Det Ă€r dĂ„ligt kompatibelt med kanaler dĂ€r variabla fördröjningar, distorsion och dataförlust kan intrĂ€ffa. Om det Ă€r nĂ„got som knastrar eller brĂ„kar i den seriella kanalen kan man bli galen av att söka efter orsaken. En gĂ„ng kĂ€mpade författaren en halv dag innan han insĂ„g att det berodde pĂ„ en dĂ„lig kabel, samt en nyckfull interfacekonverter CP2102. Till och med en mikrokontroller med inbyggd interfacekonverterare, som ATmega32u4, kan ibland göra likadant. Varje Arduino-anvĂ€ndare har mĂ€rkt att fel vid uppladdning av sketcher inte Ă€r sĂ„ ovanliga. Ibland gĂ„r skrivningen bra, men vid kontrollerande lĂ€sning upptĂ€cks ett fel. Det betyder inte att felet var vid skrivningen â problemet uppstod vid lĂ€sningen. Och tĂ€nk nu att om man arbetar "trĂ„dlöst" kan samma sak hĂ€nda, men mycket oftare.
Efter att ha prövat olika sĂ€tt att övervinna detta problem, kom författaren pĂ„ följande. Enheten har 128 kilobyte flashminne med SPI-interface â vi tar emot data via kablar (vi kommer ihĂ„g att författaren redan har en enhet med en kontakt pĂ„ sidan), anvĂ€nder detta minne som en buffert och skickar data till en annan enhet via radiokanalen. En hĂ€lsning frĂ„n Cybiko.
Efter att ha skrivit koden för att arbeta med radiokanalen samt teckensnittet blev bootloader lÀngre Àn 4 kilobyte. DÀrför var det nödvÀndigt att Àndra vÀrdet pÄ HFUSE frÄn 0xDA till 0xD8. Nu kan bootloadern vara upp till 8 kilobyte lÄng, och startadressen har blivit 0x1E000. Detta Äterspeglas i Makefile, men det mÄste ocksÄ beaktas vid uppladdning. med hjÀlp av avrdude.
SÀndarmottagaren i standarden 802.15.4 i ATmega128RFA1 var ursprungligen avsedd för att arbeta enligt protokollet , vilket Àr ganska komplext, sÄ författaren beslutade att istÀllet bara överföra paket. Detta Àr implementerat hÄrdvarumÀssigt i ATmega128RFA1, sÄ det krÀvs lite kod. För enkelhetens skull beslutade författaren ocksÄ att anvÀnda en fast kanal och inte ge möjlighet att vÀlja den ens manuellt. Standard 802.15.4 stöder 16 kanaler med nummer frÄn 11 till 26. De Àr ganska överbelastade, och vissa överlappar Àven med WiFi-kanaler (röd markerar ZigBee-kanaler, blÄ, grön och gul markerar WiFi).

Det visade sig att de kanaler som Àr minst kÀnsliga för störningar frÄn WiFi Àr 15 och 26. Den andra av dessa valde författaren. Ansvarsfriskrivning: översÀttaren vet inte om det Àr tillÄtet att förenkla ZigBee pÄ detta sÀtt. Kanske borde man programmera lite mer och implementera det helt?
PÄ den första enheten mÄste en slutautomat implementeras som överför data enligt protokollet STK500. I allmÀnhet Àr de sÀnda och mottagna meddelandena sjÀlvförsörjande, men vissa Àr bundna till de som tidigare passerat genom kanalen. Beskrivningen av dialogen Àr angiven. .
En viktig del av denna dialog Àr överföringen av paket som Àr avsedda för att skrivas till flashminnet pÄ destinationsenheten. För enkla mikrokontroller av AVR-familjen Àr sidstorleken 128 byte, men för ATmega128RFA1 Àr den 256. Och för det flashminnet som ansluts via SPI-protokollet Àr den densamma. Programmet i den första enheten överför inte sketch direkt till den andra, utan skriver det till detta minne. NÀr Arduino IDE kontrollerar skrivningens korrekthet, skickas det som har skrivits dit tillbaka. Nu mÄste de mottagna uppgifterna överföras via radiokanalen till den andra enheten. Under detta sker vÀxlingen mellan mottagning och sÀndning ganska ofta. STK500-protokollet Àr oavsett för fördröjningar, men tÄl inte dataförlust (konstigt, men ovan nÀmnts att fördröjningar vid dataöverföring ocksÄ pÄverkar). Men förluster vid trÄdlös överföring Àr oundvikliga. ATmega128RFA1 har en hÄrdvaruimplementering av ÄterbegÀran vid tvivel om korrektheten i överföringen, men författaren beslutade att genomföra detta programmÀssigt sjÀlv. Han utvecklade ett protokoll dÀr det gÄr betydligt mer data i en riktning Àn i den andra.
Det Ă€r inte perfekt, men allt fungerar. Den 256-byte sidor delas upp i fyra segment, dĂ€r varje segment överförs via radiokanalen i form av ett paket. Paketet rymmer upp till 125 byte data plus en byte â lĂ€ngden och tvĂ„ â CRC. SĂ„ fragment pĂ„ 64 byte ryms tillsammans med sid- och segmentnummer (frĂ„n 0 till 3) dĂ€r. PĂ„ mottagarenheten finns en variabel som gör det möjligt att spĂ„ra hur mĂ„nga segment som har tagits emot, och nĂ€r alla fyra kommer, gĂ„r en bekrĂ€ftelse tillbaka till sĂ€ndarenhet att hela sidan har tagits emot. Ingen bekrĂ€ftelse (CRC stĂ€mmer inte) â vi skickar hela sidan igen. Hastigheten fĂ„r till och med vara större Ă€n vid överföring via kabel. Se:

Men egentligen borde vi förutse ett bekvÀmt sÀtt att ansluta en kabel till enheterna för att ladda upp sketcher via den. Till exempel, placera en sÄdan grÀnssnittskonverterare som CP2102 inuti, som pÄ bilden, och klistra fast den pÄ kortet sÄ att den klarar anstrÀngningen vid anslutning och frÄnkoppling av Micro USB-kabeln.

Det finns ocksĂ„ en 3,3-volts stabilisator (och hur man anvĂ€nder den i en enhet med 6-volts strömförsörjning â om det finns en liknande stabilisator dĂ€r, gĂ„r det att lĂ€gga till tvĂ„ dioder för att automatiskt vĂ€lja vilken av dem enheten ska drivas av). Alla tre lysdioderna mĂ„ste avlĂ€gsnas frĂ„n grĂ€nssnittets omvandlingskort, annars kommer de att belasta batterierna ytterligare nĂ€r de drivs av dem och ocksĂ„ störa lĂ€sningen av tangentbordet och anvĂ€ndningen av flashminnet med SPI-grĂ€nssnitt.
Att strÀva efter mÄlet visade sig vara Ànnu mer intressant Àn att uppnÄ det (och jag behöver inte berÀtta den dÀr skÀmtet om bussen). Författaren lÀrde sig mycket nytt om bootloaders för AVR, flashminnen med SPI-grÀnssnitt, STK500-protokollet och 802.15.4-standarden.
All annan kod utöver det som beskrivits ovan Ă€r , och den Ă€r ocksĂ„ under GPL v3. Författarens Twitter â .
KĂ€lla: habr.com
