Všetko to začalo tým, že si autor kúpil zaujímavé zariadenie na sekundárnom trhu – Smart Response XE (
Tieto zariadenia boli prerušené pred niekoľkými rokmi a to, čo školy kúpili za 100 až 200 dolárov, sa teraz objavuje na eBay za 10 dolárov alebo menej. Hardvér je veľmi vhodný pre geekské experimenty:
- 60 klávesová klávesnica
- displej s rozlíšením 384×136, 2 bity na pixel - podobne ako BC, CGA, ale 4 nie farby, ale gradácie jasu
- mikrokontrolér ATmega128RFA1 (128 kB flash pamäť, 4 kB ROM, 16 kB RAM, 802.15.4 transceiver)
- externá (vo vzťahu k mikrokontroléru, nie k celému zariadeniu) 1 megabit (128 kilobajtov) flash pamäť s rozhraním SPI
- priehradka na 4 AAA prvky.
Už z názvu mikrokontroléra je jasné, že patrí do rodiny AVR, čo znamená, že urobiť zariadenie kompatibilné s Arduino je viac ako triviálna úloha...
Od správ ďalej
Autora však viac zaujíma možnosť nehrať sa na zariadení, ale študovať:
- flash pamäť so sériovým SPI rozhraním
- bootloadery pre AVR
- štandard 802.15.4
Autor začal písaním
To stačí na nahranie zavádzača Arduino, ale nie náčrtu - sériový port tam nie je pripojený, takže bez otvorenia puzdra sa stále nezaobídete. Tiež linky TX0 a RX0 prvého sériového portu sú kombinované s pollingovými linkami matice klávesnice, a to tými, ktoré vyvolávajú dopyt po funkčných klávesoch po stranách displeja. Ale čo sa dá robiť - autor postavil toto:
Priniesol tam linky JTAG a teraz netreba otvárať priehradku na batérie. A aby sa dali nahrať náčrty, pripojil som oba sériové porty na rovnaký konektor aj s prepínačom, pretože s nainštalovanými batériami je fyzicky nemožné zariadenie iným spôsobom vypnúť.
Práca s spájkovačkou, nožom a lepiacou pištoľou trvala pomerne dlho. Vo všeobecnosti je nahrávanie náčrtov „vzduchom“ oveľa pohodlnejšie, naliehavo musíme niečo vymyslieť.
Arduino IDE používa program na nahrávanie náčrtov
Po vyskúšaní rôznych spôsobov, ako tento problém prekonať, autor prišiel s nasledujúcim. Zariadenie má 128 KB flash pamäť s rozhraním SPI - dáta prijímame cez káble (nezabudnite, že autor už má jedno zariadenie s konektorom na boku), túto pamäť používame ako vyrovnávaciu pamäť a dáta posielame cez rádio kanál do iného zariadenia. Pozdrav od Cybiko.
Po napísaní kódu na prácu s rádiovým kanálom, ako aj s písmom, bol nakladač dlhší ako 4 kilobajty. Preto sa hodnota HFUSE musela zmeniť z 0xDA na 0xD8. Teraz môže mať bootloader dĺžku až 8 kilobajtov a počiatočná adresa je teraz 0x1E000. To sa odráža v Makefile, ale malo by sa to zohľadniť aj pri vypĺňaní
Transceiver 802.15.4 v ATmega128RFA1 je pôvodne navrhnutý tak, aby fungoval pomocou protokolu
Ukázalo sa, že najmenej náchylné na rušenie z WiFi sú kanály 15 a 26. Autor si vybral druhý z nich. Upozornenie: prekladateľ nevie, či je dovolené zjednodušiť ZigBee týmto spôsobom. Možno by sme mali urobiť trochu viac programovania a implementovať ho úplne?
Na prvom zariadení je potrebné implementovať konečný automat, ktorý prenáša dáta cez protokol STK500. Z väčšej časti sú prenášané a prijímané správy sebestačné, ale niektoré sú viazané na tie, ktoré prešli kanálom skôr. Uvádza sa popis dialógu
Dôležitou súčasťou tohto dialógu je prenos paketov určených na zápis do flash pamäte cieľového zariadenia. Pre jednoduché mikrokontroléry rodiny AVR je veľkosť stránky 128 bajtov, no pre ATmega128RFA1 je to 256. A pre flash pamäť, ktorá je pripojená cez protokol SPI, je to rovnaké. Program v prvom zariadení pri nahrávaní náčrtu ho hneď neprenesie do druhého, ale zapíše ho do tejto pamäte. Keď Arduino IDE skontroluje správnosť zadania, odošle sa, čo tam bolo napísané. Teraz musíme preniesť prijaté dáta cez rádiový kanál do druhého zariadenia. Zároveň pomerne často dochádza k prepínaniu z prijímania na vysielanie a späť. Protokol STK500 je ľahostajný k oneskoreniam, ale netoleruje stratu údajov (čudné, ale vyššie bolo povedané, že oneskorenia ovplyvňujú aj prenos údajov). A straty počas bezdrôtového prenosu sú nevyhnutné. ATmega128RFA1 má zabudovanú hardvérovú implementáciu opakovaných požiadaviek pri pochybnostiach o správnosti prenosu, no autor sa rozhodol to isté softvérovo implementovať. Vyvinul protokol, v ktorom tečie oveľa viac údajov jedným smerom ako druhým.
Nie je to dokonalé, ale funguje to. 256-bajtová stránka je rozdelená na štyri segmenty, z ktorých každý sa prenáša vzduchom ako paket. Paket môže obsahovať až 125 bajtov dát plus jeden bajt pre dĺžku a dva bajty pre CRC. Takže tam sú umiestnené fragmenty dlhé 64 bajtov spolu s číslami stránok a segmentov (od 0 do 3). Prijímacie zariadenie má premennú, ktorá mu umožňuje sledovať, koľko segmentov bolo prijatých, a keď prídu všetky štyri, odosielacie zariadenie dostane potvrdenie, že bola prijatá celá stránka. Žiadne potvrdenie (CRC sa nezhoduje) - znova odošlite celú stránku. Rýchlosť je ešte väčšia ako pri prenose cez kábel. Pozri:
Vo všeobecnosti by však bolo potrebné poskytnúť pohodlný spôsob pripojenia kábla k zariadeniam na nahrávanie náčrtov a cez neho. Napríklad umiestnite do vnútra takéhoto prevodníka rozhrania na CP2102, ako je to na fotografii, a prilepte ho k doske tak, aby odolal sile pri pripájaní a odpájaní kábla Micro USB.
Má tiež 3,3-voltový stabilizátor (a ako ho použiť v zariadení so 6-voltovým napájaním - ak má iba rovnaký stabilizátor a môžete pridať dve diódy, aby ste automaticky vybrali, ktorá z nich bude napájať zariadenie) . Všetky tri LED diódy musia byť odspájkované z dosky prevodníka rozhrania, inak budú pri prevádzke na nich dodatočne zaťažovať batérie a prekážať aj pri dotazovaní klávesnice a práci s flash pamäťou s rozhraním SPI.
Sledovanie cieľa sa ukázalo byť ešte zaujímavejšie ako jeho dosiahnutie (a nepotrebujete ten vtip o autobuse). Autor sa veľa naučil o bootloaderoch AVR, flash pamäti SPI, protokole STK500 a štandarde 802.15.4.
Všetok ďalší kód okrem knižnice opísanej vyššie je −
Zdroj: hab.com