Vše začalo tím, že si autor koupil na sekundárním trhu zajímavé zařízení – Smart Response XE (
Tato zařízení byla ukončena před několika lety a to, co školy nakoupily za 100 až 200 USD, se nyní objevuje na eBay za 10 USD nebo méně. Hardware je velmi vhodný pro geeky experimenty:
- 60 klávesová klávesnice
- displej s rozlišením 384×136, 2 bity na pixel - podobně jako BC, CGA, ale 4 ne barvy, ale gradace jasu
- mikrokontrolér ATmega128RFA1 (128 kB flash paměť, 4 kB ROM, 16 kB RAM, 802.15.4 transceiver)
- externí (ve vztahu k mikrokontroléru, ne k celému zařízení) 1 megabit (128 kilobajtů) flash paměť s rozhraním SPI
- přihrádka na 4 AAA prvky.
Již z názvu mikrokontroléru je zřejmé, že patří do rodiny AVR, což znamená, že udělat zařízení kompatibilní s Arduino je více než triviální úkol...
Od zpráv dál
Autora ale více zajímá možnost na zařízení nehrát, ale studovat:
- flash paměť se sériovým rozhraním SPI
- bootloadery pro AVR
- standard 802.15.4
Autor začal psaním
To stačí k nahrání bootloaderu Arduino, ale ne skici - sériový port tam není připojen, takže se bez otevření pouzdra stále neobejdete. Také linky TX0 a RX0 prvního sériového portu jsou kombinovány s pollingovými linkami matice klávesnice, konkrétně těmi, které se dotazují na funkční klávesy po stranách displeje. Ale co se dá dělat - autor postavil toto:
Přivedl tam linky JTAG a teď není potřeba otevírat přihrádku na baterie. A aby se daly nahrát náčrtky, připojil jsem oba sériové porty na stejný konektor a přidal jsem i přepínač, protože s nainstalovanými bateriemi je fyzicky nemožné zařízení vypnout jiným způsobem.
Práce s páječkou, užitkovým nožem a lepicí pistolí zabrala poměrně dlouho. Obecně platí, že nahrávání náčrtů „vzduchem“ je mnohem pohodlnější, musíme pro to naléhavě něco vymyslet.
Arduino IDE používá program k nahrávání náčrtů
Poté, co autor vyzkoušel různé způsoby, jak tento problém překonat, přišel s následujícím. Zařízení má 128 KB flash paměť s rozhraním SPI - data přijímáme po drátech (nezapomeňte, že autor již má jedno zařízení s konektorem na straně), tuto paměť používáme jako vyrovnávací paměť a data posíláme rádiem kanál do jiného zařízení. Zdravím z Cybiko.
Po napsání kódu pro práci s rádiovým kanálem a fontem byl loader delší než 4 kilobajty. Proto musela být hodnota HFUSE změněna z 0xDA na 0xD8. Nyní může mít bootloader až 8 kilobajtů a počáteční adresa je nyní 0x1E000. To se odráží v Makefile, ale mělo by to být také zohledněno při vyplňování
Transceiver 802.15.4 v ATmega128RFA1 je původně navržen pro provoz pomocí protokolu
Ukázalo se, že nejméně náchylné na rušení WiFi jsou kanály 15 a 26. Autor zvolil druhý z nich. Upozornění: překladatel neví, zda je povoleno zjednodušit ZigBee tímto způsobem. Možná bychom měli udělat trochu více programování a implementovat to úplně?
Na prvním zařízení je nutné implementovat konečný automat, který přenáší data protokolem STK500. Z velké části jsou přenášené a přijímané zprávy soběstačné, ale některé jsou svázány s těmi, které prošly kanálem dříve. Je uveden popis dialogu
Důležitou součástí tohoto dialogu je přenos paketů určených k zápisu do flash paměti cílového zařízení. U jednoduchých mikrokontrolérů rodiny AVR je velikost stránky 128 bajtů, ale u ATmega128RFA1 je to 256. A u flash paměti, která je připojena přes protokol SPI, je to stejné. Program v prvním zařízení při nahrání skici ji hned nepřenese do druhého, ale zapíše ji do této paměti. Když Arduino IDE zkontroluje správnost zadání, odešle se, co tam bylo napsáno. Nyní potřebujeme přenést přijatá data rádiovým kanálem do druhého zařízení. K přepínání z příjmu na vysílání a zpět přitom dochází poměrně často. Protokol STK500 je lhostejný ke zpožděním, ale netoleruje ztrátu dat (zvláštní, ale výše bylo řečeno, že zpoždění ovlivňuje i přenos dat). A ztráty při bezdrátovém přenosu jsou nevyhnutelné. ATmega128RFA1 má vestavěnou hardwarovou implementaci opakovaných požadavků při pochybnostech o správnosti přenosu, ale autor se rozhodl to samé implementovat softwarově. Vyvinul protokol, ve kterém proudí mnohem více dat jedním směrem než druhým.
Není to dokonalé, ale funguje to. 256bajtová stránka je rozdělena do čtyř segmentů, z nichž každý je přenášen vzduchem jako paket. Paket může obsahovat až 125 bajtů dat plus jeden bajt pro délku a dva bajty pro CRC. Jsou tam tedy umístěny fragmenty dlouhé 64 bajtů spolu s čísly stránek a segmentů (od 0 do 3). Přijímací zařízení má proměnnou, která mu umožňuje sledovat, kolik segmentů bylo přijato, a když dorazí všechny čtyři, odesílající zařízení obdrží potvrzení, že byla přijata celá stránka. Žádné potvrzení (CRC se neshodovalo) – znovu odeslat celou stránku. Rychlost je ještě větší než při přenosu přes kabel. Vidět:
Obecně by ale bylo nutné zajistit pohodlný způsob připojení kabelu k zařízením pro nahrávání náčrtů a přes něj. Například umístěte dovnitř takový převodník rozhraní na CP2102, jako na fotografii, a přilepte jej k desce tak, aby vydržel sílu při připojování a odpojování Micro USB kabelu.
Má také 3,3V stabilizátor (a jak jej použít v zařízení s 6V napájením - pokud má pouze stejný stabilizátor a můžete přidat dvě diody, abyste automaticky vybrali, která z nich bude zařízení napájet) . Všechny tři LED musí být odpájeny z desky převodníku rozhraní, jinak budou při provozu na nich navíc zatěžovat baterie a také překážet při dotazování klávesnice a práci s flash pamětí s rozhraním SPI.
Sledování cíle se ukázalo být ještě zajímavější než jeho dosažení (a nepotřebujete ten vtip o autobusu). Autor se hodně dozvěděl o bootloaderech AVR, SPI flash paměti, protokolu STK500 a standardu 802.15.4.
Veškerý další kód kromě výše popsané knihovny je −
Zdroj: www.habr.com