Krijojmë një OTA-loder për ATmega128RFA1 (në përbërje të pajisjes Smart Response XE)

Krijojmë një OTA-loder për ATmega128RFA1 (në përbërje të pajisjes Smart Response XE)

E gjitha filloi me blerjen nga autori në tregun e dytë të një pajisjeje interesante — Smart Response XE (përshkrimi i shkurtër). Ajo është e destinuar për shkolla: çdo nxënës në klasë merr një pajisje, të ngjashme me një shënues elektronik ose përkthyes të viteve '90, mësuesi bën një pyetje dhe nxënësit shkruajnë përgjigjet në tastierat e pajisjeve, të cilat dërgojnë përgjigjet përmes një kanali radio (802.15.4) në një marrës të lidhur me PC-në e mësuesit.

Mbështetjes për këto pajisje u dha fund disa vite më parë, dhe ajo që shkollat blenin me 100-200 dollarë për copë, tani del në eBay për 10 dollarë e më pak. „Hardueri“ atje është shumë i përshtatshëm për eksperimente geek:

  • tastiera me 60 çelësa
  • ekrani me një rezolutë prej 384×136, 2 bita për pixel — ngjashëm me BK, CGA, por 4 jo ngjyra, por grada ndriçimi
  • mikrokontrolleri ATmega128RFA1 (128 kB memorie flash, 4 kB ROM, 16 kB RAM, marrësi-dërgues standard 802.15.4)
  • memoria flash e jashtme (në lidhje me mikrokontrollerin, jo me tërë pajisjen) me 1 megabit (128 kilobajt) me ndërfaqe SPI
  • kapsulë për 4 elemente AAA.

Nga emri i mikrokontrollerit kuptohet se ai i përket familjes AVR, dhe kështu, bërë pajisjen të përputhshme me Arduino — është një detyrë më shumë se triviale…

Nga një lajm në Hackaday autori mësoi se kjo është bërë tashmë (në këtë lidhje përshkruhet se ku të lidhet), duke marrë mundësinë për të luajtur lojëra për Arduboy:

Luaj videon

Por autori është më shumë i interesuar për mundësinë jo për të luajtur në pajisje, por për të studiuar:
  • memoria flash me ndërfaqe sekondare SPI
  • bootloaders për AVR
  • standarti 802.15.4

Autori filloi me shkruajtjen e bibliotekës (GPL v3), që lejon inicializimin e ekranit, shfaqjen e teksteve dhe drejtkëndëshave, si dhe aksesin në memorien flash me ndërfaqe SPI. Më pas, ai filloi të mendonte ide për përdorimin praktik të pajisjes: një terminal i ngjashëm me VT-100 portativ, lojëra multi-përdoruesish. Pas modifikimit të tre pajisjeve, ai vendosi të "mësojë" ato të marrin skica "në ajër". Çfarë do të ishte jo vetëm interesante, por edhe shumë e përshtatshme: hapja e çdo herë e trupit të pajisjes është e vështirë, dhe nën kapakun e hapësirës për bateri ka vetëm vrima që i lejojnë të lidhin një programues JTAG me bordin.

Krijojmë një OTA-loder për ATmega128RFA1 (në përbërje të pajisjes Smart Response XE)

Kjo është e mjaftueshme për të ngarkuar bootloader-in Arduino, por jo skicën — porta seriale nuk është e nxjerrë aty, pa hapur kabinetin nuk e ndalon dot. Gjithashtu, linjat TX0 dhe RX0 të portit serial të parë përputhen me linjat e pyetjes së tastierës, që nënkupton ato me të cilat bëhet pyetja e çelësave funksionalë nga anët e ekranit. Por çfarë të bëjmë — autori ka krijuar këtë:

Krijojmë një OTA-loder për ATmega128RFA1 (në përbërje të pajisjes Smart Response XE)

Ai i ka nxjerrë linjat JTAG, dhe tani nuk është e nevojshme të hapet ndarja e baterisë. Dhe për të ngarkuar edhe skicat, ka nxjerrë në këtë konektor dhe të dy portet seriale, duke shtuar gjithashtu një ndërprerës, sepse me bateri të instaluara, pajisja fizikisht nuk mund të fiket ndryshe.

Duhej punuar mjaft për të përdorur një stilolaps, një thikë kancelarie dhe një armë ngjitëse. Në përgjithësi, ngarkimi "në ajër" i skicave është shumë më i përshtatshëm, urgjentisht duhet të shpikim diçka për këtë.

Arduino IDE përdor programin për ngarkimin e skicave avrdude. Ai komunikon me mikroprocesorin nëpërmjet protokollit STK500, që lejon transferimin e skedarëve në të dy drejtimet. Ai është keq i pajtueshëm me kanalet ku ndodhin vonesa të ndryshme, deformim dhe humbje të të dhënave. Nëse në kanalin serial ndodh diçka ose ka zhurma, mund të jesh duke u çmendur për të kërkuar shkakun. Njëherë, autori u mundua për gjysmë dite derisa kuptoi se problemi ishte në një kabllo të keqe, si dhe një konvertues të ndërlikuar interface CP2102. Edhe mikroprocesori me konvertuesin e integruar të interface, për shembull ATmega32u4, mund të bëjë kështu ndonjëherë. Çdo përdorues i Arduino ka vërejtur se gabimet gjatë ngarkimit të skicave nuk janë aq të rralla. Ndonjëherë regjistrimi kalon normalisht, por gjatë leximit verifikues zbulohet një gabim. Kjo nuk do të thotë se gabimi ndodhi gjatë regjistrimit — dështimi ishte gjatë leximit. Tani imagjinoni se gjatë punës "në ajër" ndodhi e njëjta gjë, por shumë më shpesh.

Pas provave të ndryshme për të tejkaluar këtë problem, autori shpiku diçka të tillë. Pajisja ka një memorie flash prej 128 KB me interface SPI — pranojmë të dhënat përmes kabllove (kujtojmë se një pajisje me konektor anash autori tashmë e ka), përdorim këtë memorie si tampon dhe dërgojmë të dhënat në një pajisje tjetër përmes kanali radio. Një përshëndetje nga Cybiko.

Pas skriptimi i kodit për të punuar me kanalin radio, si dhe fontin, bootloader-i u zgjat më shumë se 4 kilobajt. Prandaj, vlera e HFUSE duhej të ndryshohej nga 0xDA në 0xD8. Tani bootloader-i mund të jetë deri në 8 kilobajt, dhe adresa fillestare u bë 0x1E000. Kjo reflektohet në Makefile, por duhet marrë parasysh edhe gjatë ngarkimit. bootloader nëpërmjet avrdude.

Transceiver standardi 802.15.4 në ATmega128RFA1 fillimisht është menduar për të punuar me protokollin ZigBee, i cili është mjaft kompleks, prandaj autori vendosi të transmetojë thjesht paketat. Kjo realizohet harduerikisht në ATmega128RFA1, kështu që do të nevojitet pak kod. Po ashtu për lehtësi, autori vendosi të përdorë një kanal të fiksuar, pa lejuar zgjedhjen e tij as në mënyrë manuale. Standardi 802.15.4 mbështet 16 kanale me numra nga 11 deri në 26. Ata janë mjaft të ngjeshur, disa gjithashtu mbulojnë kanale WiFi (kanalet ZigBee janë të shënuara me të kuqe, ndërsa ato WiFi me ngjyrë blu, jeshile dhe të verdhë).

Krijojmë një OTA-loder për ATmega128RFA1 (në përbërje të pajisjes Smart Response XE)

Doli se kanalet 15 dhe 26 janë më pak të ndjeshme ndaj ndërhyrjeve nga WiFi. Autori zgjodhi të dytin. Disklemer: përkthyesi nuk di nëse është e lejuar të thjeshtohet kaq shumë ZigBee. Ndoshta duhet edhe pak programim për ta realizuar plotësisht?

Në pajisjen e parë, duhen realizuar automatikët përfundimtarë që transmetojnë të dhëna sipas protokollit STK500. Kryesisht, mesazhet e transmetuara dhe të pranuara janë të mjaftueshme për vete, por disa janë të lidhura me ato që kanë kaluar më parë në kanal. Përshkrimi i dialogut është i dhënë. këtu.

Një komponent i rëndësishëm i këtij dialogu është transferimi i paketave të destinuara për shkrimin në memorien flash të pajisjes së destinacionit. Te mikrocontrolerët e thjeshtë të familjes AVR, madhësia e faqes është 128 byte, por te ATmega128RFA1 është 256. Po ashtu, te ajo memorie flash që lidhet përmes protokollit SPI, është e njëjtë. Programi në pajisjen e parë, kur ngarkon skicën, nuk e dërgon atë menjëherë në të dytën, por e shkruan atë në këtë memorie. Kur Arduino IDE verifikon saktësinë e shkrimit, i dërgohet ajo që është shkruar atje. Tani duhet të transferohet e dhëna e marrë përmes kanaleve radio në pajisjen e dytë. Këtu ndodh një ndërrim mjaft i shpeshtë midis marrjes dhe dërgimit. Protokolli STK500 është i papërfillshëm ndaj vonesave, por nuk toleron humbjen e të dhënave (e çuditshme, pasi më lart është thënë se vonesat në transferimin e të dhënave ndikon gjithashtu). Dhe humbjet në transferimin wireless janë të pashmangshme. Te ATmega128RFA1 ekziston një implementim harduerik i ripërsëritjeve në rast dyshimi për saktësinë e transferimit, por autori vendosi ta implementojë të njëjtën gjë programatikisht vetë. Ai zhvilloi një protokoll, sipas të cilit kalon shumë më të dhëna në një drejtim sesa në anën tjetër.

Ai nuk është i përsosur, por gjithçka funksionon. Një faqe 256-byte ndahet në katër segmente, secili prej të cilëve dërgohet përmes kanaleve radio si një paketë. Paketa mund të përmbajë deri në 125 byte të dhënash plus një byte—gjatësia dhe dy—CRC. Pra, fragmentet me gjatësi 64 byte vendosen aty me numrat e faqeve dhe segmenteve (nga 0 deri në 3). Në pajisjen që merr, është parashikuar një variabël që lejon të gjurmohet se sa segmente janë pranuar, dhe kur arrijnë të katërta, i dërgohet pajisjes transmetuese një konfirmim se është pranuar e gjithë faqja. Nëse nuk ka konfirmim (CRC nuk përputhet)—dërgojmë të gjithë faqen përsëri. Shpejtësia e kësaj është madje më e lartë se ajo e transferimit përmes kabllit. Shihni:

Luaj videon

Por në të vërtetë, duhet të parashikohet një mënyrë e përshtatshme për të lidhur kabullin me pajisjet për ngarkimin e skicave dhe përmes saj. Për shembull, të vendosni brenda një konvertuesi interfaces si CP2102, si në foto, dhe ta ngjitni atë në bord në mënyrë që të përballojë forcën gjatë lidhjes dhe shkëputjes së kabullit Micro USB.

Krijojmë një OTA-loder për ATmega128RFA1 (në përbërje të pajisjes Smart Response XE)

Në të ka gjithashtu një stabilizues 3.3-voltes (dhe si ta përdorim në një pajisje me furnizim 6-voltes — nëse ka një stabilizues të tillë, dhe mund të shtojmë dy dioda për të zgjedhur automatikisht nga cila prej tyre do të furnizohet pajisja). Duhet të hiqen të tre LED-ët nga bordi i konvertuesit të ndërfaqes, përndryshe ata do të ngarkojnë shtesë bateritë kur punojnë nga ato, dhe gjithashtu do të pengojnë anketimin e tastierës dhe funksionimin e memories flash me ndërfaqen SPI.

Ndjekja e qëllimit ishte madje më interesante se arritja e tij (dhe nuk nevojitet ajo anekdota për autobusin). Autori zbuloi shumë gjëra të reja për ngarkuesit për AVR, memories flash me ndërfaqen SPI, protokollin STK500 dhe standardin 802.15.4.

Kodi tjetër i mbetur përveç bibliotekës së përshkruar më sipër — këtu, dhe ai është gjithashtu nën GPL v3. Twitter-i i autorit — këtu.

Burimi: habr.com

Blini hostim të besueshëm për faqe interneti me mbrojtje DDoS, serverë VPS VDS 🔥 Blini hostim të besueshëm për faqe interneti me mbrojtje DDoS, serverë VPS VDS - ProHoster