Arduino a výstup na TV přijímač (1)

Pořídit si z Arduina výstup na TV přijímač nebo videomonitor není jen pro ty, kdo chtějí zkoušet psát jednoduché hry, ale je to praktický a kupodivu velmi levný prostředek, který poslouží při psaní programů a odlaďování funkce zařízení. Podívejme se, jak na to.

Kdy použít videovýstup a proč

Jednočipové mikrokontroléry, a Arduino není ve své podstatě nic jiného, než jednočipový mikrokontrolér ATMega, jsou určeny především k obsluze jednodušších technických zařízení. Snímají povelová tlačítka i údaje z čidel a podle toho řídí motory, spínají ventily, signalizují obsluze stav a podobně. Mohou toho umět mnohem víc a dnes často slouží víceméně pro zábavu a radost z toho, že „něco dokážu naprogramovat“, ale spolupráce a ovládání jednodušších zařízení je jejich základní poslání. Pokusme se soustředit právě na tento cíl.

Mezi časté činnosti patří zobrazení nezbytných údajů. Jde-li o jednoduchou indikaci ve smyslu chybového hlášení nebo potvrzení o tom, že akce skončila, je odpovídající použít LED nebo zvukový výstup a piezoměnič. Když  dojde na číslo, třeba i dvou nebo čtyřmístné, asi to bude práce pro LED displej, při jednoduchých slovních výpisech a více číslech sáhneme po LCD znakovém displeji. Grafický displej nasadíme, když je nutná grafika nebo více řádek textu, takový displej už ale není úplně levný. Jde-li o to vytvořit zařízení, které následně musí být mobilní a grafiku bude využívat stále, je grafický displej na správném místě. Co když ale dočasně potřebujeme vyzkoušet, co vlastně „vidí“ IR nebo ultrazvukový dálkoměr, a podle toho upravit program? Když nás zajímá, jak dobrý je generátor náhodného signálu nebo zkrátka jen pro účely ladění chceme výpis mnoha hodnot současně? Když chceme prezentovat výsledky tak, aby se daly ukázat najednou velkému počtu lidí? Co když chceme z mobilního zařízení přijímat rozsáhlou telemetrii? Pak nastal čas pro generování videosignálu a zobrazení na televizi nebo videomonitoru.

Minimum o videosignálu

Budeme se zabývat pouze evropskou normou videosignálu PAL, i když Arduino na umí velmi jednoduše přepnout na americké NTSC. Standardní černobílý videosignál vznikl dávno v „době analogové“ a přesně odpovídá tomu, jak pracovaly původní obrazovky fungující jako elektronky. Při vykreslování jednoho obrazu musíme začít v přesně daném okamžiku, k tomu slouží snímkový synchronizační pulz. Paprsek pak začne nahoře vlevo, jede po obrazovce vpravo a podle úrovně signálu vykresluje odstíny šedi od černé (nejnižší úroveň jasu) po bílou (nejvyšší úroveň jasu). Když se dokreslí jeden řádek, čeká se na řádkový synchronizační pulz, aby se mohl začít kreslit další řádek. Tak se pokračuje řádek po řádku až dolů. Celých snímků se vykresluje 25 za sekundu, ale protože by bylo ještě zřetelné blikání obrazovky, rozděluje se obraz na dva půlsnímky. Jeden půlsnímek kreslí liché řádky, druhý sudé řádky. Frekvence půlsnímků je tedy 2x vyšší, 50 Hz.

Řádkové i snímkové synchronizační pulzy mají nejnižší (nulovou) úroveň, jsou tedy v obraze „černější než černá“. Když nepoužíváme různé úrovně jasu ale jen černou a bílou, vystačíme se třemi úrovněmi signálu, na to musí být dva bity čili dva digitální výstupy Arduina. Amplituda celého videosignálu by měla být 1V. Synchronizační pulzy mají úroveň 0V, úroveň černé je asi 0,3V, úroveň bílé 1V. Víc nepotřebujeme, i když je to hodně zjednodušené.

„Videoadaptér“

Prodává se řada různých shieldů, které vytvářejí více či méně dokonalý televizní obraz. My se soustředíme na čistě programovou syntézu obrazu, která nevyžaduje téměř žádné náklady, stačí dva rezistory a konektor typu CINCH, který se standardně pro videosignál používá. Celkové náklady na materiál se určitě vejdou do 10 Kč. Kompletní schéma pro Arduino UNO je na následujícím obrázku.

adapter

Pro Arduino NG, Decimila a UNO platí, že výstup synchronizačních pulzů je na pinu 9, výstup videa na pinu 7, případně výstup zvuku na pinu 11, ale ke zvuku se dostaneme až časem. Pro Arduino Mega je synchro na pinu 11, video na A7 a zvuk na 10, pro sanguino je synchro na 13, video na A7 a zvuk na 8.

Výstup obrazu není nic jiného než jednoduchý dvoubitový DA převodník a můžeme jej sestavit i na kontaktním poli vedle svého zapojení nebo si předem připravit konektor CINCH se třemi kablíky (zem, synchro, video) a rezistory jsou ukryty v těle konektoru. Danými piny ale „hýbat“ nejde, takže pokud uvažujeme o využití videovýstupu, je NUTNÉ si pro něj vyhradit (pro UNO) piny 7 a 9, zvuk asi bude možné oželet. Při letmém pohledu na schéma možná napadne, že takto se z digitálního signálu s úrovněmi 5V požadovaný signál udělat přece nedá, jenže vstup videa má standardní impedanci 75Ω a tento „odpor“ mezi naším výstupem a zemí dotvoří dělič napětí jaký potřebujeme.

Zobrazení je plně grafické a má rozlišení 128×96 bodů. Není to moc, ale je to srovnatelné s běžnými grafickými LCD displeji. Každý grafický bod zabírá na výšku dva řádky obrazu.

Takto vypadají signály řádkové synchronizace (spodní stopa) a videa (horní stopa) na výstupech Arduina  při celé pracovní ploše televizní obrazovky poseté bílými body .

hantek447_1

Další snímek je sloučený videosignál stejného obrazu. Vlevo jeden grafický řádek s body (mezi synchropulzy je signál 2x za sebou pro 2 videořádky), pak jeden grafický řádek černý (dva videořádky bez signálu).

hantek447_2

Omezení použitelnosti

Generování videosignálu velmi silně vytěžuju mikrokontrolér Arduina a protože musí být naprosto pravidelné, běží přes přerušení a odstavuje jinou činnost. Jestliže ve svém programu budeme generovat tón smyčkou programu, pak místo něj uslyšíme jen chrčení, budeme-li programově (ne časovačem) generovat PWM, bude úroveň drasticky kolísat. Zkrátka, generování obrazu je náročnou úlohou v reálném čase a jinou podobnou Arduino už dělat nemůže. Reakcí na běžné podněty jako je stisk tlačítka, kontrola klávesnice nebo rozsvícení LED se toto netýká, tam případné zpoždění na úrovni setin sekundy není poznat, může ale už být drobně poznat na třeba na kolísání jasu multiplexovaného LED displeje.

Ukážeme si problém na příkladu triviálního programu, který by měl  dělat na výstupu 5 naprosto pravidelné pulzy.

void loop(){
digitalWrite(5,HIGH);
digitalWrite(5,LOW);  }

Jak to ve skutečnosti dopadne při současném generování obrazu dopadne je na následujícím obrázku.

hantek447_4

Když toto omezení vadí, nemusíme se hned vzdát výstupu na televizi, ale nejde to řešit takhle jednoduše. Musíme použít koupený shield s vlastním mikrokontrolérem a do něj pak už můžeme posílat data sériovou linkou bez ohledu na přesné časování nebo můžeme použít dvě Arduina, jedno pro běh svého programu, druhé pro generování obrazu.

Ještě na jeden problém narazíme, a tím je blikání obrazu při rychlých změnách (vykreslování) motivu nebo pohybu motivu po obrazovce. To lze zvládnout a naučíme se to, ale až později.

Knihovna TVout

Na adrese https://code.google.com/p/arduino-tvout/downloads/list je přehled verzí knihoven pro generování videosignálu v normě PAL nebo NTSC, vybereme a stáhneme si soubor TVoutBeta1 (je i zde pod odkazem). Otevřeme v počítači složku Dokumenty – Arduino a do této složky stažený soubor rozbalíme, vytvoří se tři složky: pollserial, TVout a Tvoutfonts. V obslužném programu Arduina menu – Sketch – Import Library pak už najdeme pod seznamem standardních knihoven tyto nové knihovny. Uvedený postup je v podstatě „ruční instalací“ externích knihoven.

Nebudeme podrobně probírat všechny dostupné příkazy knihovny TVout, jejich přehled najdete na adrese https://code.google.com/p/arduino-tvout/wiki/FDcomplete, jen ty důležitější.

Příště se pustíme do jednotlivých příkazů a příkladů použití.