Začátkem roku 2016 jsem pomáhal realizovat interaktivní vědomostní hru pro děti nazvanou Evropa. O co jde, jak jsme celý projekt uskutečnili, co se povedlo a co se nepovedlo sepíšu v následujícím textu.
O pomoc s realizací hry Evropa mě požádal Michal Valoušek už někdy v roce 2015, ale z nejrůznějších důvodů jsme se k samotné realizaci dostali až o rok později v březnu. Celý koncept hry a práci se dřevem mají na svědomí Ivo Skoček a Jiří Palát z Červotoče. Michal Valoušek připravil počítač a napsal software; grafiku, fotografie a zvuky připravil Ladislav Krajča, Honza Bednařík pomáhal s 3D tiskem a já jsem vyrobil hardware a napsal do něj firmware.
Princip hry je prostý: k pevné noze je přes pružinu připevněna velká hrací deska s držadly pro hráče. Na horní straně desky je fólie s politickou mapou Evropy, na které je barevně vyznačeno celkem 48 států. Na každém státu je půlkulatá brána velká tak akorát pro dřevěnou kuličku. Ke hře patří velký televizor, na kterém je herní menu, zobrazují se zde otázky a později i skóre. Úkolem hráčů je přesným a rychlým naklopením herní desky dostat kuličku do brány toho státu, který je v tom okamžiku zobrazen na televizi. Forma otázek může být různá a záleží na obtížnosti a typu hry, který hráči na začátku zvolí.
Ve zbytku textu popíšu pouze hardware a firmware, který jsem pro Evropu realizoval.
Krátká ukázka hry. Jakmile se hráčům podaří nasměrovat kuličku do správné brány, software zabliká zelenou LED u daného státu.
Technické zadání
- Na herní desce je celkem 48 bran, které musí samostatně detekovat průchod dřevěné kuličky.
- Instalace brány musí být co nejjednodušší a provádí se ze spodní strany desky.
- Tloušťka herní desky je cca 4 cm. Veškerá elektronika musí být umístěna v drážkách, které se budou ručně frézovat do překližky.
- Po obvodu desky budou RBG LED, které reprezentují jednotlivé státy. Software jimi bude podle potřeby blikat a signalizovat tak hráčům stav.
- Herní deska bude uprostřed místnosti. Kabel od počítače k elektronice bude cca 3 až 5 metrů dlouhý a musí být pod kobercem nebo v liště.
- Pod ani nad deskou nesmí trčet žádné vodiče.
- Všechno musí být pevně připevněno k herní desce, nic se nesmí uvolnit, pozdější přístup k elektronice bude obtížný.
Použití Arduina a jiných vývojových desek jsem okamžitě zavrhnul. Obsahují totiž spoustu konektorů a různého hardware navíc, který zbytečně přidává na velikosti (hlavně výšce, zvláště pokud bych měl například na Arduino připojit nějaký shield).
Chvíli jsem přemýšlel, že bude každá brána obsahovat IR LED s fototranzistorem a mikrokontrolér. Ten měl být levný a relativně malý (ATTiny10, ATTiny13, …). Všechny brány by byly zapojeny za sebe (daisy chain, chovalo by se to jako posuvný registr) nebo na nějakou jednoduchou sběrnici (OneWire). Master na sběrnici by pravidelně kontroloval jednotlivé brány, jestli u nich nedošlo k aktivaci.
Toto řešení jsem nakonec zavrhnul. Kvůli pevně stanovenému deadline se mi nechtělo experimentovat s pro mě neznámou architekturou (např. MSP; PIC znám a vyhýbám se mu kdykoliv to jde), a proto jsem se díval jen po AVR. ATTiny10 neměla dostatek GPIO pinů a ATTiny13 byla zase drahá (v TME.eu ji tehdy nacenili na 25kč bez DPH, to je přes 1400 Kč jen za MCU). Další nevýhodou je nemožnost aktualizovat v jednotlivých procesorech firmware bez fyzického přístupu k DPS.
Nakonec jsem se rozhodl použít ATMega88, což je MCU ze stejné rodiny jako je v Arduino Uno, jen má méně paměti flash i RAM. Jeho cena v TME byla 35 Kč bez DPH. K obsluze 48 bran stačí jen 10 kusů desek (každá DPS zvládne obsluhovat až 6 bran), tedy cena necelých 450 Kč za mikrokontroléry. To už je cenově přijatelnější a navíc ATMega88 má ve flash paměti sekci pro bootloader – bude možné všechny desky kdykoliv aktualizovat.
Jelikož jsou brány po hrací ploše rozprostřeny „nahodile“, bylo potřeba kromě hlavních DPS s mikroprocesorem navrhnout i menší plošný spoj s IR LED a fototranzistorem, které se budou instalovat pod bránu a krátkým vodičem budou spojeny s hlavní deskou.
Vzhledem ke vzdálenosti mezi počítačem a hrací plochou (až 5 metrů) a mezi jednotlivými deskami (cca 20 až 50 cm mezi každou z nich) bylo potřeba zvolit vhodnou sběrnici. I²C i SPI nejdou na tak velké vzdálenosti použít, ty jsou vhodné pro komunikaci mezi komponentami na jednom plošném spoji. Samotný UART by mohl mít také potíže, hlavně u vyšších přenosových rychlostí.
Nakonec jsem se inspiroval standardem RS485, který k přenosu dat používá diferenční pár vodičů. Mezi počítačem a elektronikou v herní desce tak stačí použít celkem čtyřžilový vodič. Dvě žíly pro datové vodiče, GND a napájecí napětí (tady jsem udělal první chybu, plánoval jsem použít datový vodič i k napájení celé elektroniky, viz text dále).
Komunikace na sběrnici je tzv. half-duplex. To znamená, že v jednom okamžiku může zařízení buď data vysílat nebo přijímat. Pokud by bylo potřeba komunikovat oběma směry zároveň, vyžádalo by si to další přijímač/vysílač SN75176 a jeden pár vodičů navíc. Na takto navržené sběrnici lze použít libovolný komunikační protokol. Já jsem nakonec zvolil standardní Modbus – jednoduchý binární protokol z konce 70. let. Poslední dobou se z něj stává můj oblíbenec :) Na jedné sběrnici může být právě jeden master a jeden nebo více slave zařízení.
Mikrokontrolér pomocí signálu DE/RE řídí, jestli je obvod SN75176 v režimu vysílače nebo přijímače (mimochodem, použití obvodu SN75176 byla chyba číslo dvě). Signály TXD a RXD jsou připojeny k UART pinům na mikrokontroléru. Rezistory R3, R4 a R5 se neosazují. Rezistor R3 slouží k tzv. přizpůsobení vedení a je potřeba pouze na začátku (u prvku master) a na konci (u posledního slave) sběrnice.
Komunikace na RS485 s Modbus funguje následovně: v klidu jsou všechny prvky sběrnice v režimu přijímače. Pokud chce master prvek komunikovat, přepne se do režimu vysílače a vyšle první paket s požadavkem o čtení nebo zápis registru (jeden registr je 16 bitů). Paket obsahuje unikátní adresu slave (8 bitů), číslo funkce (8 bitů, 0x03 pro čtení nebo 0x10 pro zápis, jsou i další funkce), počet registrů k čtení/zápisu (16 bitů), adresu ze které se má číst/zapisovat (16 bitů), v případě zápisu samotná data (n×16 bitů) a nakonec kontrolní součet (tzv. CRC, 16 bitů). Jakmile slave přijme paket určený pro něj (pozná podle adresy), zkontroluje jeho kontrolní součet a pokud je v pořádku, provede operaci, přepne se do režimu vysílače a odešle paket s odpovědí. Master odpověď přijme a celá sběrnice přejde do klidového režimu.
V případě Evropy má firmware v hlavní desce jeden registr obsahující poslední stav všech připojených opto bran, registr s typem hardware a verzi firmware a registr pro reset. Slave adresa se volí pomocí čtyř pájecích plošek, které jsou připojeny ke GPIO pinům mikrokontroléru.
K propojení jednotlivých desek mezi sebou jsem použil běžný ethernetový kabel Cat5e se čtyřmi páry vodičů, tedy celkem osm žil. Jeden pár zůstal nezapojen a tři páry se nakrimpovaly na konektor RJ12 (6p6c). Jak je vidět ze schématu, jeden vodič slouží pro napájecí napětí 5V, druhý pro GND, dva pro RS485 komunikaci a dva (označené jako 12V a OW) jsou navíc, pro budoucí použití.
Již zmiňované RGB LED jsou LED čipy WS2812, známější pod označením NeoPixel. K řízení těchto diod slouží jedna hlavní DPS a LED jsou připojeny k pinu PWM0A na konektoru J4. Blikání a efekty řídí počítač opět přes Modbus sběrnici. Každou LED z celkového počtu 48 kusů reprezentuje jeden registr. Zápisem správné hodnoty na konkrétní Modbus adresu se zapne jedna konkrétní LED s nastavenou barvou a intenzitou.
Master celé sběrnice je počítač s Linuxovým OS a kód napsaný v Pythonu. Převodník USB-RS485 jsem koupil již hotový.
Zdrojové kódy, Eagle soubory i BOM jsou dostupné v Git repozitáři projektu na Gihubu, adresář hardware.
Realizace
Oba plošné spoje jsem nechal vyrobit ve firmě PCB Mesit. Minimální výrobní množství je v jejich případě jeden přířez. To vyšlo na 15 kusů hlavní DPS (eu-gate) a 60 kusů desek s IR LED a fototranzistorem (eu-ir). Takže mi ještě pár kusů zbylo pro další projekty :)
Do herní plochy se nakonec instalovalo 11 kusů eu-gate (10 pro snímání bran a 1 pro řízení RGB LED) a 48 kusů eu-ir. Ty obsahují IR LED a fotorezistor v jednom pouzdře, které má obdelníkový půdorys. Kvůli snadnější instalaci jsme si na 3D tiskárně nechali zhotovit plastové redukce, do kterých se obdelníkový senzor jednoduše zacvaknul.
Na obrázku výše jsou osazené oba typy DPS. Vlevo je menší eu-ir DPS, která obsahuje IR foto bránu a pár nezbytných součástek okolo. Ve spodní části fotografie je vidět tvar použité optobrány, na kterou se tiskla kulatá redukce pro jednodušší instalaci.
V pravé části obázku jsou vidět osazené hlavní DPS eu-gate. Na bílé plošce pod RJ konektorem je slave adresa každé desky. Ta se volí pomocí 4 pájecích propojek pod mikrokontrolérem (označené jako SJ1 až SJ4). Díky tomu je možné zvolit až 15 různých adres (1-15, adresa 0 je rezervovaná) a tedy mít 15 různých DPS na jedné sběrnici.
Samotná instalace do herní desky probíhala ve Valašském Meziříčí během několika dnů. Na obrázku níže je vidět jak se elektronika instalovala. Nejdříve se podle pozic jednotlivých státu vyvrtaly díry pro brány a IR senzor. Poté se v těchto místech vyfrézovala díra pro menší DPS a ty se připevnily pomocí dlouhých šroubů.
Díry pro hlavní DPS se vyfrézovaly podle potřeby a volného místa až na závěr. Jednotlivé desky jsou propojené třížilovým plochým vodičem a ethernetovým kabelem. Vše se upravovalo a krimpovalo až na místě.
Hra se ovládá pomocí klávesnice se třemi tlačítky. Ty jsou připojené k jedné eu-gate, která je pod televizí, mimo herní desku. V dřevěné bedně s tlačítky je skrytý také počítač, který všechno řídí.
Co se nepovedlo
Takový velký projekt se holt neobejde bez problémů a komplikací.
První (školáckou) chybu jsem udělal hned na začátku, když jsem si řekl že se celá elektronika bude napájet přes jeden vodič ethernetového kabelu z 5V zdroje. Bez většího přemýšlení jsem si řekl, že na tomto typu kabelu přece funguje PoE (Power over Ethernet), tak proč by to nemohlo fungovat i v tomto případě. Ale… kvůli ceně jsem na hlavních eu-gate DPS nenavrhnul žádný stabilizátor ani DC/DC měnič. Počítal jsem, že na vstup přivedu přesně 5 V DC a hotovo.
K odhalení chyby stačil jednoduchý výpočet: jedna hlavní DPS má v nejhorším případě odběr 60 mA (50 mA obvod SN75176 a až 10 mA ATMega88). Jedna IR DPS má v klidu odběr až 18 mA. To nám dává celkem 10 × (60 + 6 × 18) = 1680 mA na celou herní desku. Ethernetový kabel má na jeden metr rezistivitu až 0,188 Ω. To je ztráta 0,315 V na jeden metr. Mezi počítačem a herní deskou má být podle potřeby 3 až 5 metrů, to je 4,052 až 3,425 V na první desce. Konec sběrnice by měl ještě méně a to nepočítám odběr 48 kusů RBG LED, který může být až 2,880 A (všechny LED trvale svítí).
Při pohledu do datasheetu SN75176 zjistíte, že minimální pracovní napětí je 4,75 V. Pod touto hodnotou obvodu nemusí pracovat spolehlivě nebo nemusí pracovat vůbec.
Řešení této chyby bylo naštěstí jednoduché – zdroj posunout co nejblíže k herní desce. V kovové noze s pružinou bylo dost místa, takže jsem 5 A spínaný zdroj instaloval spolu s malou plastovou krabičkou přímo do nohy herní desky. Plastová krabička obsahuje na vstupu napájecí jack a jeden RJ12, na výstupu jsou 3 konektory RJ12. Vše je připojeno na jeden zdroj a propojeno do jedné sběrnice. Bohužel jsem si zapojení této krabičky nevyfotil ani nezapsal.
S tím souvisí druhá chyba, kterou jsem při návrhu elektroniky udělal. Vybral jsem nejlevnější RS485 obvod, který jsem našel – SN75176. Sice je jeho cena jen 6 Kč bez DPH, ale ke správné funkci potřebuje 4,75 až 5,25 V napájecí napětí a jeho proudový odběr je 26 až 50 mA (podle aktivního režimu). Možná náhrada za tento obvod je ST485. Stojí sice o 10 Kč více, ale odběr je pod 1 mA (300 až 900 μA). Typ pouzdra a pořadí pinů je identické s SN75176. No jo, tak příště už si dám pozor :)
Další problémy, které se během instalace vyskytly souvisely s LED. Použité WS2812 (v 5 mm THT pouzdru) jsou dost náchylné na napájecí napětí (během komunikace nesmí kolísat). Pokud se ale rychle mění barva většiny LED, pak napájecí napětí kolísat bude. To se dá vyřešit zapojením keramických kondenzátorů poblíž každé LED. Jelikož jsem ale pro tyto LED nenavrhnul žádnou DPS, bylo nutné pájet diody, vodiče i kondenzátory až na místě, když už bylo vše nainstalované v herní desce. Byla to zdlouhavá a nepříjemná práce. Příště bych použil SMD variantu těchto diod a hlavně bych pro ně navrhnul samostatnou DPS s konektory a kondenzátorem.
Další drobnost týkající se návrhu hardware: použité konektory KK254 s roztečí 2,54 mm jsou příliš vysoké. Na hlavní DPS to byla nejvyšší součástka, o pár milimetrů převyšovala i zásuvku pro RJ12. Kvůli nim se musely díry v překližce frézovat více do hloubky. Nijak to naštěstí nevadilo, ale byla to zbytečná práce. Stačilo použít menší konektor, například PH-JST s roztečí 2.0 mm. Jsou menší a nižší.
Takže abych to shrnul. Kdybych měl Evropu dělat znovu, změnil bych:
- Step-down DC/DC měnič na každou eu-gate DPS, ať je možné napájet elektroniku z 24 V zdroje.
- Obvod SN75176 vyměnit za ST485, kvůli spotřebě.
- Pro WS2812 LED vyrobit vlastní plošný spoj s konektory, ať se nemusí nic pájet na místě.
- Místo vysokých konektorů KK254 použít menší PN-JST.
Kromě designových problémů se objevily i problémy s funkčností během hraní. Použitý IR senzor obsahuje fotorezistor, který reaguje na širší spektrum, než vysílá IR LED. Občas se během hraní stalo, že brána zaregistrovala falešný průchod kuličkou. To bylo způsobeno žárovkami nad herní deskou a výbojkou blesku ve fotoaparátech návštěvníků.
Pár dnů po slavnostním zveřejnění hry jsme museli dvě eu-gate desky vyměnit za nové kusy. Po určité době provozu se totiž tyto vadné kusy restartovaly a nějakou dobu s nima nebylo možné komunikovat přes Modbus. Mám podezření na problémy s kondenzátory u 16 MHz krystalu.
Co se povedlo
Oba typy DPS fungovaly hned v první verzi, osazení i oživení se povedlo u všech kusů bez problému. Kromě DC/DC měniče a jiných konektorů bych v DPS žádné další změny nedělal.
Kombinace RS485 a Modbus se ukázala jako velmi spolehlivá. S komunikací nejsou problémy a věřím, že nebudou ani při výrazně delší sběrnici. S ethernetovým kabelem se pracuje výborně a dá se lehce sehnat. Použil jsem UTP Cat 5e, lanko.
Udělal jsem dobře, že jsem zvolil rodinu ATMega s podporou bootloaderu. Modbus bootloader se osvědčil a během ladění a oživování celé hry, kdy jsem firmware několikrát aktualizoval, s ním nebyl nejmenší problém.
Volba Modbus slave adresy pomocí 4 pájecích pinů je pohodlná a přehledná. Stačí jediný pohled na DPS a víte jakou má adresu. Navíc je možné mít předem připravené a naprogramované desky a adresu zvolit až během instalace podle potřeby. Kdyby byla adresa například v EEPROM, musel bych mít po ruce programátor, nebo nějak složitě adresu nastavit přes Modbus.
Dva piny navíc na RJ konektoru (označené jako 12V a OW) se nakonec hodily. Po dokončení Evropy mi zbylo pár neosazených DPS, které jsem použil v jednom svém soukromém projektu na logování teploty z OneWire teplotních čidel.
Firmware
V již zmiňovaném Git repozitáři projektu je v adresáři hardware kompletní firmware včetně příkladů jak s eu-gate komunikovat přes Modbus. Firmware je napsaný v jazyce C a příklady v Pythonu.
Adresář src obsahuje standardní firmware pro detekci bran a klávesnici, adresář neopixel je varianta pro ovládání WS2812 LED a adresář bootloader obsahuje Modbus bootloader, pomocí kterého je možné jednotlivé eu-gate aktualizovat přes RS485. Bootloader se dá použít v AVR ATMega88, ATMega168 a ATMega328 a zabírá méně jak 1 kB (v případě ATMega88 je to 968B flash a 328B RAM).
Závěr
Slavnostní otevření výstavy s hrou Evropa proběhlo 22. dubna 2016 v klubu Vrtule ve Valašském Meziříčí. Během několika hodin si hru zahráli děti i dospělí různých věkových kategorií. Já osobně jsem byl spokojen, jelikož celou dobu vše fungovalo a nemuseli jsme rychle řešit žádné problémy.
A na závěr ještě několik fotografií: