
Všetko sa začalo zakúpením zaujímavého zariadenia na sekundárnom trhu — Smart Response XE (). Je určené pre školy: každý žiak v triede dostane zariadenie, podobné elektronickej zápisnej knižke alebo prekladaču z deväťdesiatych rokov, učiteľ položí otázku a žiaci na klávesniciach zariadení zadajú odpovede, ktoré prichádzajú prostredníctvom rádiového kanála (802.15.4) do prijímača pripojeného k učiteľskému PC.
Podpora týchto zariadení bola zrušená pred niekoľkými rokmi a to, čo školy nakupovali za 100-200 dolárov za kus, sa teraz objavuje na eBay za 10 dolárov a menej. 'Hardvér' je veľmi vhodný na geekovské experimenty:
- klávesnica s 60 klávesmi
- displej s rozlíšením 384×136, 2 bity na pixel — podobné ako BK, CGA, ale 4 ne farby, ale odtiene jasu
- mikrokontrolér ATmega128RFA1 (128 kB flash pamäte, 4 kB EEPROM, 16 kB RAM, prijímač-vysielač štandardu 802.15.4)
- externá (vo vzťahu k mikrokontroléru, nie celému zariadeniu) flash pamäť s kapacitou 1 megabit (128 kilobajtov) s rozhraním SPI
- oddelenie pre 4 AAA články.
Z názvu mikrokontroléra je jasné, že patrí do rodiny AVR, a preto urobiť zariadenie kompatibilné s Arduino je úloha viac než triviálna...
Z novinky na autor zistil, že to (zdá sa, že odkaz, kde pripojiť), a získal možnosť spúšťať hry pre Arduboy:

Ale autora viac zaujíma možnosť nie si zahrať na zariadení, ale preskúmať:
- flash pamäť s sériovým rozhraním SPI
- bootloadery pre AVR
- štandard 802.15.4
Autor začal písaním (GPL v3), umožňujúcej inicializovať displej, zobrazovať text a obdĺžniky, ako aj pristupovať k flash pamäti s rozhraním SPI. Potom začal rozmýšľať nad myšlienkami praktického využitia zariadenia: prenosný terminál kompatibilný s VT-100, multiplayerové hry. Po prestavaní troch zariadení sa rozhodol "naučiť" ich prijímať sketche "vzduchom". Čo by bolo nielen zaujímavé, ale aj veľmi pohodlné: skrinku zariadenia je ťažké otvárať zakaždým a pod krytom batériového oddelenia sú len otvory umožňujúce pripojiť JTAG programátor k doske.

To load the Arduino bootloader, this is enough, but not for the sketch — the serial port is not exposed; you still have to open the casing. Additionally, the TX0 and RX0 lines of the first serial port are combined with the lines used to poll the keyboard matrix, specifically those used to query the function keys on the sides of the display. But what can be done — the author constructed the following:

He connected the JTAG lines there, and now it's no longer necessary to open the battery compartment. To enable sketch uploads, he also connected both serial ports to this same connector, adding a switch, since it is otherwise physically impossible to turn off the device with the batteries installed.
It took quite a while to work with a soldering iron, a utility knife, and a glue gun. In general, uploading sketches 'over the air' is significantly more convenient; we urgently need to invent something for this.
The Arduino IDE uses the program . It communicates with the microcontroller using the protocol , which allows files to be transferred in both directions. It is poorly compatible with channels where variable delays, distortion, and data loss may occur. If something goes wrong or crackles in the serial channel, you can go crazy trying to find the cause. Once, the author struggled for half a day before realizing that the issue was a bad cable, as well as a temperamental CP2102 interface converter. Even a microcontroller with a built-in interface converter, like the ATmega32u4, can sometimes act up. Every Arduino user has noticed that errors during sketch uploads are not that rare. Sometimes writing goes smoothly, but during a verification read, an error is discovered. This does not mean there was an error during writing — the failure occurred during reading. Now imagine that when working 'over the air', the same will happen, but much more often.
After trying various ways to overcome this problem, the author came up with the following. The device has a 128-kilobyte flash memory with an SPI interface — receiving data over wires (let's remember that the author already has one device with a connector on the side), using this memory as a buffer, and sending data to another device over the radio channel. A shout-out from Cybiko.
Po napísaní kódu pre prácu s rádiovým kanálom, ako aj písma, sa bootloader predĺžil na viac ako 4 kilobajty. Preto sa hodnota HFUSE musela zmeniť z 0xDA na 0xD8. Teraz môže byť bootloader dlhý až 8 kilobajtov, pričom počiatočná adresa sa stala 0x1E000. To je uvedené v Makefile, ale malo by sa to zohľadniť aj pri nahrávaní. s pomocou avrdude.
Vysielač a prijímač štandardu 802.15.4 v ATmega128RFA1 je pôvodne navrhnutý na prácu podľa protokolu , ktorý je dosť zložitý, preto sa autor rozhodol namiesto toho jednoducho prenášať pakety. To je hardvérovo implementované v ATmega128RFA1, takže kód bude potrebný len málo. Na zjednodušenie sa autor rozhodol použiť pevný kanál, bez možnosti jeho manuálneho výberu. Štandard 802.15.4 podporuje 16 kanálov s číslami od 11 do 26. Tieto kanály sú dosť preplnené, niektoré tiež prekrývajú kanály WiFi (červenou sú znázornené kanály ZigBee, modrou, zelenou a žltou — WiFi).

Ukázalo sa, že najmenej ovplyvnené rušením od WiFi sú kanály 15 a 26. Druhý z nich autor vybral. Disklaimer: prekladateľ nevie, či je povolené takto zjednodušovať ZigBee. Možno by sa malo ešte trošku naprogramovať a implementovať ho úplne?
Na prvom z zariadení je potrebné implementovať konečný automat, ktorý prenáša údaje podľa protokolu STK500. Väčšina prenášaných a prijímaných správ je samostatná, ale niektoré súviazane s tými, ktoré prešli kanálom skôr. Opis dialógu je uvedený. .
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. U jednoduchých mikrokontrolérov rodiny AVR je veľkosť stránky 128 bajtov, ale u ATmega128RFA1 je to 256. A u flash pamäte, ktorá sa pripája prostredníctvom protokolu SPI, je to rovnaké. Program v prvom zariadení pri nahrávaní sketcha ho okamžite nepreposiela do druhého zariadenia, ale najprv ho zapisuje do tejto pamäte. Keď Arduino IDE kontroluje správnosť zápisu, pošlú mu to, čo sa tam zapísalo. Teraz je potrebné preniesť získané údaje cez rádiový kanál do druhého zariadenia. Pri tom prechod z príjmu na prenos a naopak nastáva pomerne často. Protokol STK500 je nedbalý ohľadom oneskorení, ale netoleruje stratu údajov (zvláštne, veď vyššie je napísané, že oneskorenia pri prenose údajov majú tiež vplyv). A straty pri bezdrôtovom prenose sú nevyhnutné. V ATmega128RFA1 je zabudovaná hardvérová implementácia opakovaných požiadaviek pri pochybnostiach o správnosti prenosu, ale autor sa rozhodol, že to realizuje programovo sám. Vyvinul protokol, pri ktorom jedným smerom prechádza oveľa viac údajov ako opačne.
Nie je dokonalý, ale všetko funguje. 256-bajtová stránka je rozdelená na štyri segmenty, z ktorých každý je prenášaný cez rádiový kanál vo forme paketu. Paket obsahuje až 125 bajtov údajov plus jeden bajt — dĺžka a dva — CRC. Takže fragmenty s veľkosťou 64 bajtov spolu s číslami strán a segmentov (od 0 do 3) sú tam umiestnené. V prijímajúcom zariadení je predpokladaná premenná, ktorá umožňuje sledovať, koľko segmentov bolo prijatých, a keď prídu všetky štyri, na odosielajúce zariadenie ide potvrdenie, že celá stránka bola prijatá. Ak nie je potvrdenie (CRC sa nezhoduje) — posielame celú stránku znovu. Rýchlosť pri tom je dokonca vyššia ako pri prenose cez kábel. Pozrite:

Ale vlastne by sa mal predpokladať pohodlný spôsob pripojenia k zariadeniam kábla na nahrávanie sketchoch aj cez tento spôsob. Napríklad umiestniť dovnútra taký prevodník rozhraní CP2102, ako na obrázku, a prilepiť ho na dosku tak, aby odolával sile pri pripojení a odpojení kábla Micro USB.

Obsahuje tiež 3,3-voltový regulátor (a ako ho aplikovať v zariadení s 6-voltovým napájaním — ak tam existuje takýto regulátor, je možné pridať dva diódy, aby sa automaticky vybralo, z ktorého sa zariadenie napája). Z dosky rozhrania je potrebné odstrániť všetky tri svetelné diódy, inak budú dodatočne zaťažovať batérie pri prevádzke z nich, a tiež budú zasahovať do ankety klávesnice a práce s flash pamäťou s rozhraním SPI.
Prenasledovanie cieľa sa ukázalo byť dokonca zaujímavejšie ako jeho dosiahnutie (a netreba ten vtip o autobuse). Autor sa dozvedel veľa nového o bootloaderoch pre AVR, flash pamäťach s rozhraním SPI, protokole STK500 a štandarde 802.15.4.
Celý zvyšok kódu na doplnenie k vyššie opísanej knižnici — , a ten je tiež pod GPL v3. Autorov Twitter — .
Zdroj: habr.com
