Toto je starší verze dokumentu!
Obsah
Řešení založené na mikrokontroleru ATTINY84
Níže popsané zapojení dovoluje vzdálené programování nejen ESP čipu přes připojenou WIFI, ale také programu mikrokontroleru ATTINY84. Ke změně programu čidla nebo reakčního prvku hry na stanovišti tedy není potřeba prvek demontovat, ale stačí v něm přes WIFI přehrát program libovolného z vestavěných čipů.
Je k tomu potřeba navíc pouze jeden pin od každého čipu.
Mikrokontroler ATTINY84 disponuje celkem 12 piny pro program, počítáme-li i RESET, který se dá použít v nouzi nejvyšší také jako vstupně/výstupní pin.
Mikrokontroler je napojen jedním pinem k ESP8266 (stačí v provedení ESP-01, pozor nikoliv ESP-01S). Tento pin má dvě funkce v závisloti na tom, v jakém režimu se systém nachází.
- Jednosměrné programování mikrokontroleru prostřednictvím OWL bootloaderu
- Obousměrná 1-wire komunikace s ESP pro komunikaci s řídící jednotkou stanoviště
Tip: Pokud nechcete sami nahrávat čipy podle návodu níže, můžete si od nás objednat za nákladovou cenu a poštovné už naprogramovanou dvojici ESP-01 a ATTINY84.
OWL bootloader
One way bootloader je geniálním řešením kombinující jednosměrné programování s šifrováním kódu. A to v pouhých 512 bytech flash paměti.
Kódu v ESP tedy stačí zresetovat mikrokontroler a přes svůj hardwarový seriový port nastavenou rychlostí poslat jednorázově do mikrokontroleru nový program. Ověřít, že je program správně nahraný lze následně po jeho spuštění přes připravenou 1-wire komunikaci.
1-wire komunikace pro program
Stejný programovací „drát“, kterým je propojen ESP s ATTINY84 se používá i v programu mikrokontroleru k obousměrné komunikaci. Laskavý čtenář může namítnout, že ATTINY84 má přece hardwarovou podporu sériové komunikace USI, s níž je komunikace rychlá a spolehlivá. Proč ji tedy nevyužít?
Důvodů je několik. Chtěli jsme ponechat piny PA6 a PA5, kde je tato hardwarová podpora komunikace pro použití uživateli v jeho programu k implementaci čidla nebo reakčního prvku, aby se např. mohl snadno připojit k nějaké I2C sběrnici nebo k SPI.
Druhým důvodem je podpora i velmi úsporného čipu ATTINY13A, který je malý, ale nemá podporu USI.
A konečně třetím důvodem je více pinu pro použití v programu čidla - komunikační vrstva s ESP zabírá jen jeden pin.
Z výše popsané implementace, ale vyplývají i některé nevýhody. Komunikace s ESP je velmi pomalá - řádově kolem 2000 baudů při vniřním taktu mikrokontroleru 1 MHz. Komunikace s ESP, ale nepředpokládá výměnu velkého množství dat.
Pokud bude z nějakého důvodu potřeba rychlejší komunikace, je možné připojit navíc k ESP i zatím volné piny podprující seriovou komunikaci na hardwarové úrovni a komunikovat přes ně.
Taktování a spotřeba
Aktuální implementace počítá s taktováním mikrokontroleru 1 MHz (tedy s aktivním interním dělením nativní hodinové frekvence 8 MHz osmi - fuse CKDIV8 je aktivní). Při této rychlosti je spotřeba při napětí 3.3 V kolem 0.5 mA. To umožní, aby mikrokontroler „sledoval“ celý průběh hry i v aktivním stavu (je-li to potřeba), aniž by příliš čerpal cenou energii z baterie.
Příprava mikrokontroleru ATTINY84
Mikrokontroler je třeba nejprve koupit. Doporučujeme využít běžné prodejce dostupné u nás a neobjednávat mikrokontroler v Číně. Cena je obdobná a čínské zboží může být padělek, který se navíc nemusí projevit hned a dorazí obvykle mnohem později.
Cena za tento mikrokontroler se pohybuje při kusovém odběru kolem 36 Kč včetně DPH.
Zapsání OWL bootloaderu
Prvním krokem je zapsání OWL bootloaderu. Do paměti čipu a zapsání vhodné konfigurace pojistek (fuses).
Bootloader nelze někde stáhnout a není to ani vhodné (připravíme se tím o bezpečné šifrování), ale je potřeba ho vygenerovat připraveným nástrojem od autora.
Stačí stáhnout a rozbalit archiv ze stránek autora a v rozbaleném adresáři spustit následující příkaz:
owl --device=tn84 --rxport=a6 --clock=1000 --targetname=iles84
Tím dojde k vygenerování bootloaderu pomocí něhož budeme dále nahrávat program do mikrokontroleru. Vygenerovaný soubor iles84.hex najdete v podadresáři targets. Tento soubor je nyní potřeba nahrát do mikrokontroleru.
Nahrání bootloaderu do mikrokontroleru proběhne pouze jednorázově a pak už je možné nahrávat programy přes WIFI prostřednictvím ESP. Bootloader také nemůže být běžným programem poškozen.
Máte tyto možnosti, jak nahrát bootloader a nastavit pojistky:
- Použít čip ESP8266 jako SPI programátor s knihovnou ESP8266AVRISP - podrobný popis, jak na to
- Použít k tomu jakékoliv Arduino, návod je např tady
- Jiná možnost, např pokud máte nějaky programátor na čipy Atmel
- Požádat někoho o již naprogramovaný čip i s bootloaderem
Vzdálené programování ATTINY84 přes WIFI
Máte-li v mikrokontroleru připraven bootloader, stačí připojit jeho pin PA6 na TX pin ESP8266 a můžete ho nyní programovat vzdáleně.
V programu ESP8266 je otevřen TCP/IP port 328, který naslouchá a když do něj pošlete předem připravený kód programu (pozor nestačí jen přeložený HEX soubor), tak ho ESP8266 zapíše na svůj seriový port a přes něj se dostane až k OWL bootloaderu. Pokud je program a jeho šifrování validní, bude ATTINY84 přeprogramován.
Aby mohl OWL bootloader pokus o programování ověřit (a umožnit) musí být přeložený HEX soubor pro mikrokontroler nejprve zakódován nástrojem owl, který jako parametr dostane soubor bootloaderu, který je aktivní v ATTINY.
Příkaz pro vytvoření zakódovaného programu pro přenos je:
./owl -tn=iles84 -ff=./mujprogram.hex -tf=mujprogram
Tento příkaz v adresáři transmissions vytvoří soubor mujprogram_iles84.hex, který už může být přenesen přes WIFI do mikrokontroleru. Jméno bootloaderu, který se používá pro náhrání každého programu do konkrétního čipu je iles84.
Stačí k tomu jakýkoliv program umožňující otevřít TCP/IP socket a poslat do něj soubor. Např. netcat:
nc -N 192.168.15.211 328 < transmissions/mujprogram_iles84.hex
kde 192.168.15.211 je IP adresa přidělená ESP.
Po zaslání programu do ESP, musí ESP ještě zresetovat ATTINY, aby se spustil bootloader. K tomu je využit pin GPIO2, který je připojen přímo k pinu RESET mikrokontroleru.
Alarm z centrály
Některé reakční prvky hry se potřebují dozvědět, že na stanovišti hry došlo ke změnám a logika řízení od nich vyžaduje reakci. Pokud by jedinou komunikací s centrální řídící jednotkou stanoviště bylo ESPNow, musel by každý reakční prvek pravidelně probouzet ESPNow, aby se dozvěděl, jestli se něco nestalo (polling). To je nepraktické kvůli zbytečnému plýtvání energie baterie a kvůli zpoždění, ke kterému by tím docházelo.
Řešením tohoto problému je přidat k reakčním prvkům přijímač RF 433 MHz. Jeho jedinou funkcí je přijmout alarm zprávu s určitým kódem konkrétního reakčního prvku nebo obecným kódem, který probouzí všechny. Po přijetí této zprávy od centrální jednotky si příjemce aktivuje ESP8266, kterým se už domluví s řídící jednotkou stanoviště na detailech, co je přesně potřeba udělat.
Většina čidel tento přijímač nebude v průběhu hry potřebovat. Přesto může mít smysl ho instalovat, pokud předpokládáme, že čidlu budeme potřebovat aktualizovat firmware, např. v průběhu vývoje. Potom je možné firmware čidla aktualizovat i bez nutnosti čidlo fyzicky aktivovat.
Rušení a konflikty na RF 433 MHz
Komunikace na frekvenci 433 MHz bývá zatížena rušením. Jedná se obvykle o velmi jednoduchou komunikaci, kdy se signál na frekvenci 433 MHz buď vysílá anebo nevysílá. Jednoduchým kódováním pomocí času a změn (vysílání a nevysílaní) signálu je možné poslat do okolí všesměrově data.
Problém nastává v případě, že se dva účastníci komunikace rozhodnou vysílat současně - „překřikují se“. Tomu obecně nelze zabránit a norma jen nedovoluje provozovat příliš silný vysílač. Tím ale bývá omezen dosah, který bývá v ideálních podmínkách okolo 100 m.
Na stanovišti hry, zvlášť pokud bude na odlehlém místě někde v lese, ale není předpoklad přiliš velkého rušení od cizích zařízení na této frekvenci. Tím spíše, že komunikace bude pouze jednocestná od řídicí jednotky směrem k jednotlivým prvkům hry a nehrozí tak, že bude docházet ke konfliktům.
Vývoj a debug log
K odesílaní logovacích dat z ATTINY během vývoje čidla nebo reakčního prvku se používá stejná 1-wire komunikace, po níž se komunikuje s ESP.
Pokud je ESP01 připojen k WIFI síti stačí si otevřít socket na portu 329 a na něm už bude přímo výstup z volání funkce log na ATTINY.
Přípojení k log socketu:
nc 192.168.15.211 329
Zajímavostí vývoje zařízení je tak jeho úplné oddělení od Vašeho počítače. Veškerá komunikace včetně programování obou čipů probíhá bezdrátově a vyvíjené zařízení je napájené přímo z baterie. I vlastní vývoj tak může probíhat přímo ve finálním umístění, což usnadní testování.
Schéma zapojení
Uspávání a probouzení ESP-01
Existují následující možnosti, jak deaktivovat ESP-01, které je velmi energeticky náročné.
- Uspávání funkcí ESP.deepsleep()
- Deaktivace ESP pomocí pinu CH_PD (chip powerdown)
- Připojení regulovaného napětí jen v případě potřeby (Mosfet + optočlen)
Při testování těchto možností je zatím funkční jen první varianta s Deep sleepem a následným resetem přes pin ATTINY.
Při konkrétní implementaci je nutné brát do úvahy následující možné stavy:
- Oba čipy mohou být deaktivovány. ATTINY „spí“ a ESP je také neaktivní
- ATTINY pracuje, ale ESP není aktivní
- Firmware ATTINY je programován, ESP je aktivní a ATTINY je v průběhu programování zresetován
- Oba čipy jsou aktivní
Co nefunguje
- ATTINY drží pin CH_PD ESP nahoře v době, kdy ho potřebuje. Tato konfigurace zneumožňuje propgramování ATTINY, protože po jeho resetu se shodí i ESP v roli programátora
- GPIO0 a GPIO2 jako reset ATTINY pro programování. Tyto piny jsou na krátkou dobu při bootu ESP shozeny dolů. Pokud se tedy použijí jako reset pro programování, zresetuje se ATTINY při probuzení (bootu) ESP
Pro reset ATTINY je tedy potřeba použít ping GPIO3 - ESP01. Ten zůstává i během bootu v modu vstupu a tedy neshodí ATTINY během probuzení. Tato vlastnost je potřeba k tomu, abychom při probuzení ESP nepřišli o nasbíraná data ze stanoviště.



