Hlavní navigace

Gameduino: pekelná grafická karta pro Arduino

23. 6. 2011
Doba čtení: 5 minut

Sdílet

Arduino už ze stránek Roota znáte poměrně důvěrně. Ukázali jsme si, jak si s ním hrát, jak jeho prostřednictvím dělat i některé serióznější aplikace, nebo naopak hračičky. Dnešní článek potěší spíš ty hračičky – i když jsem osobně přesvědčen o tom, že nadšení budou i milovníci šikovného hardware.

V jednom z minulých článků jsme si představovali způsob, jak lze s Arduinem vygenerovat černobílý televizní signál v normě PAL. Přiznejme si – představený způsob byl už téměř na hraně možností čistě softwarového generování obrazu s 16MHz jednočipem ATMega328 v Arduinu.

Pokud chceme z Arduina získat lepší obrazový výstup, musíme sáhnout po rozšiřujících kartách – shieldech. V nabídkách prodejců jsou běžně k vidění například shieldy s textovými displeji (LCD moduly) či s barevnými displeji z mobilních telefonů (např. Color LCD shield).

Displeje z mobilních telefonů jsou v domácích elektronických konstrukcích poměrně populární – umožňují zobrazit jemnou barevnou grafiku a jejich připojení je snadné – většinou stačí napájení a 2–4 datové signály pro sériovou komunikaci s procesorem. Displeje pak mají definovaný protokol (proprietární, liší se podle výrobců / modelu / použitého řadiče), který nabízí možnost jak zobrazit bod s určitou barvou na určité souřadnici a další funkce.

Takové displeje jsou stále většinou prosté „zobrazovací jednotky“ s minimem vlastní „inteligence“. Zobrazí body, ale veškerou další práci musí odvést samotný procesor.

Spartanský design

Pokud chceme s Arduinem dělat složitější věci, nevyhneme se nutnosti jej podepřít externími obvody. Jednou z možností je použít třeba FPGA.

Programovatelná logická pole (FPGA) dovolují realizovat v jednom čipu komplexní funkce a celé složité obvody. Lze si v nich navrhnout vlastní mikroprocesor nebo použít např. existující jádra osmibitových procesorů, vytvořit periferie, navzájem je propojit atd.

A tím se dostáváme ke shieldu Gameduino. Tento rozšiřující modul usnadňuje vytváření realtime videa a zvuku a funguje jako svého druhu grafická karta.

Srdcem Gameduina je FPGA Xilinx Spartan XC3S200A, tedy poměrně trpaslík v rodině moderních FPGA, ale přesto velmi schopný. Obsahuje 200 tisíc hradel, což odpovídá více než  čtyřem tisícovkám logických bloků. Informace o konfiguraci je v externí sériové EEPROM, takže lze funkci celého Gameduina od základu změnit (pod podmínkou respektování obsazených vývodů). Pro HW hackery je vhodné dodat, že Gameduino má vyvedené signály pro Xilinx JTAG.

Gameduino v plné kráse. Uprostřed FPGA Spartan, vpravo dole konfigurační EEPROM, vlevo konektor pro VGA a audio.

Co Gameduino umí?

Začněme suchým výčtem schopností: Umí zobrazit 400×300 pixelů na SVGA monitoru (používá rozlišení 800×600 @ 72Hz). Interně pracuje s grafikou v rozlišení 512×512 bodů – lze určit výřez, který bude zobrazen, snadno tak můžeme obraz scrollovat. Umí zobrazit 512 barev (interně se pracuje s paletou AR5G5B5 – tedy pět bitů pro každou složku + průhlednost).

Zobrazuje grafiku nikoli jako čistou bitmapu, ale jako pozadí + sprity. Pozadí obrazu je kresleno jako matice znaků. Tyto znaky (8×8, lze jich použít až 256) mají každý vlastní čtyřbarevnou paletu. Na virtuální kreslicí plochu se tedy vejde 64×64 těchto znaků (ale zobrazuje se jen výřez, viz výše).

Nad tímto pozadím se pohybuje až 256 nezávislých spritů. Jejich velikost je 16×16 pixelů (s možností nastavit pro každý pixel individuálně průhlednost. Každý sprite může používat paletu 4, 16 nebo 256 barev, může být otočen (0°, 90°, 180°, 270°) či překlopen. Pro všechny tyto sprity funguje pixel-perfect detekce kolizí. Aby šlo snáze rozpoznat, jestli se „hráč“ střetl s „nepřítelem“ nebo s „neškodným spritem“, lze detekci kolizí přepnout do JK módu, kdy jsou sprity rozděleny do dvou kategorií J, K a kolize se hlásí pouze v případě, že se potkají dva sprity s různými kategoriemi.

Gameduino nabízí i zvukový stereofonní výstup. Obsahuje dvanáctibitový syntezátor, který dokáže hrát až 64 hlasů (10–8000 Hz), každý z nich může přehrávat sinusovku nebo šum a mohou se vzájemně modulovat.Kromě toho má i kanál pro přehrávání samplů.

A aby toho nebylo málo, tak je v Gameduinu, resp. v jeho FPGA, vytvořen i speciální 16bitový zásobníkový koprocesor, založený na jádru J1. Tento jednoduchý FORTHovský procesor (viz seriál o FORTHu od Pavla Tišnovského) běží nezávisle na řídicím procesoru a může manipulovat s obrazovými i zvukovými daty za nás. Je omezený prostorem 256 bajtů, takže program může obsahovat pouhých 128 šestnáctibitových instrukcí, což ale pro jednoduché operace postačí.

Dole Arduino UNO, nad ním Gameduino, nad ním Joystick Shield. Bohužel Gameduino moc „nesedí“, protože mu překáží napájecí konektor a USB konektor u samotného Arduina. Pomohly by delší konektory nebo o dva milimetry kratší shield.

Co chudák programátor?

Z hlediska programátora se Gameduino jeví jako 32kB adresního prostoru, v němž je namapována obrazová paměť, informace o spritech a řídící registry. Přistupuje se k němu pomocí sériové komunikace po sběrnici SPI (hodiny, data in, data out, chip select). Protokol i podrobný popis paměti je součástí dokumentace, nic vám tedy nebrání připojit Gameduino k jinému procesoru, dokonce si z něj udělat úplně jiné zařízení.

Součástí Gameduino SDK je jednak vlastní knihovna pro Arduino, která nabízí základní funkce pro komunikaci s Gameduinem, jednak utility v Pythonu pro převod obrázků na matici znaků, pro tvoření spritů či pro překlad programu ve FORTHu do bytekódu pro koprocesor J1. Obsahuje i simulátor Gameduina pro PC a utilitu pro vzdálený přístup k paměti Gameduina (přes USB a připojené Arduino).

Úkol „namaluj kruh a oblouk“ s Gameduinem není zrovna triviální, nezapomínejme, že se nejedná o čistě bitmapový displej, kde bychom měli přístup ke každému pixelu (pro 512×512 pixelů s 15bitovou barvou by bylo potřeba půlmega paměti, což už je mimo možnosti použitého FPGA). Gameduino je vhodné pro textový výstup (použijeme pouze znaky na pozadí), nebo pro grafiku typu „pozadí + sprity“.

Souhrn

Gameduino představuje zajímavou možnost jak rozšířit Arduino (UNO, Mega256 a další) o VGA a audio výstup, a jak už název naznačuje, je vhodné především na psaní her. Nemusíte ho ale používat jen s Arduinem, můžete ho připojit ke svému oblíbenému kitu; můžete si jej dokonce kompletně přeprogramovat a vytvořit si z něj vlastní konstrukci. Tedy eldorádo pro kutily.

Gameduino lze zakoupit přímo u autora (e-shop) nebo u distributorů. Čeští distributoři jej v nabídce zatím nemají, ale věřím, že pokud bude zájem, tak by jej do nabídky mohli zařadit a byli schopni dodávat.

S distribucí souvisí ještě jedna zajímavost: autor Gameduina James Bowman si vytvořil Gameduino jako prototyp. Pak oslovil zájemce přes server Kickstarter (o principu Kickstarteru jsme psali na Zdrojáku). Zájemci měli možnost přislíbit finanční podporu, s tím, že sejde-li se příslib alespoň 3333 USD, pustí se autor do výroby a přispěvatele „odmění Gameduinem“. Nakonec bylo přislíbeno přes 38 tisíc USD (byli jsme jedni z přispěvatelů) a výroba se od prvního dubna rozjela.

Desky Arduino Uno a Arduino Mega 2560 redakci zapůjčil obchod HW Kitchen, Arduino a Ethernet Shield obchod Czechduino. Děkujeme za laskavé zapůjčení.

Byl pro vás článek přínosný?

Autor článku

Martin Malý je autorem serveru Bloguje, mikroblogu Teidu či služby pro zkracování odkazů Jdem.cz. Vedl také magazín Zdroják.