====== Hra DRIVING ====== ===== Zadání ===== Úkolem bylo vytvořit jednoduchou hru, ve které by uživatel ovládal pomocí desky FRDM-KL25Z automobil a náklonem této desky by realizoval pohyb. Následný postup ve hře by byl podmíněn průjezdem mezi překážkami. ===== Použitá zařízení ===== Pro projekt byla použita deska **FRDM-KL25Z** a grafický displej 128x64 **ATM12864D**. Propojení mezi deskou s procesorem a samotným displejem je realizována přímo s pomocí propojovací desky vytvořené na ústavu UREL, která obsahuje navíc nastavení jasu. Zapojení je velice jednoduché a tedy není nutné jej zde ukazovat. Na obrázku níže je fotografie sestaveného kompletu. {{ :2014:img_20141201_192603.jpg?500 | Sestava s displejem}} obr.1 Sestava s displejem Zapojení I/O pinů procesoru bylo zvoleno dle datasheetu k displeji [[http://www.hebeiltd.com.cn/lcm.datasheet/ATM12864D.pdf|ATM12864D]] následně: ^ ATM12864D ^ FRDM-KL25Z ^ | K | PTD7 | | RW | PTA16 | | E | PTD6 | | DI | PTC17 | | CS1 | PTC12 | | CS2 | PTC13 | | DB0 | PTD11 | | DB1 | PTD10 | | DB2 | PTD6 | | DB3 | PTD5 | | DB4 | PTD4 | | DB5 | PTD3 | | DB6 | PTD0 | | DB7 | PTD7 | Displej obsahuje dva řadiče, každý obsluhuje polovinu displeje. Pro komunikaci se používají dva druhy příkazů. V jednom případě jsou displeji posílány instrukce a v druhém případě jsou mu posílány data. Zápis do displeje se provede po přivedení logické úrovně HIGH na pin E(Enable). Již ze začátku projektu nebyla jistota, zda displej bude mít dostatečnou rychlost vykreslování pro realizaci hry. ===== Software ===== Aplikace byla vytvořena v prostředí [[https://mbed.org/|mbed.org]]. Pro řadiče **KS0108**, které jsou použité v displeji ATM12864D byla nalezena knihovna KS0108.h a pro akcelerometr **MMA8154Q** byla použita stejnojmenná knihovna. V průběhu vývoje byla snaha o co nejjednodušší systém celé aplikace. Budou vytvořené okraje cesty, automobil bude jednoduchým čtvercem a snahou uživatele bude projet překážku, kterou bude představovat zeď s místem pro projetí. ===== Realizace ===== Při zapnutí jednotky je provedena inicializace displeje. Protože dle datasheetu nelze posílat ihned požadavky na displej, je nutné počkat na jeho nastartování. Zde se čeká cca 2 vteřiny. Následně je vygenerována úvodní obrazovka, jejíž průběh zobrazuje video níže. Již při tomto vykreslování bylo evidentní, že složitější objekty displej zobrazuje s viditelným zpožděním. Pro pozdější vizualizaci pohybu to bylo zásadní. {{youtube>njTT77WgNNY?medium}} Pro vykreslení úvodní obrazovky byla vytvořena funkce InitScreen(): void InitScreen() { int count = 0; int distance = 0; int dimensionX = 127; int dimensionY = 63; display.ClearScreen(); display.SelectFont(System5x7,BLACK,ReadData); display.GotoXY(0,0); display.GotoXY(22,32); display.PrintString("RedOut PRESENTS"); wait(2); display.ClearScreen(); display.GotoXY(0,0); display.GotoXY(52,32); display.PrintString("GAME"); for(count = 0;count<12;count++) { distance = count*2; display.RoundRectangle(distance,distance,dimensionX,dimensionY,3,BLACK); dimensionX = dimensionX - 4; dimensionY = dimensionY - 4; } wait(2); display.ClearScreen(); drawCar(32,13); wait_ms(500); display.GotoXY(0,0); display.GotoXY(45,0); display.PrintString("DRIVING"); wait_ms(800); display.GotoXY(0,0); display.GotoXY(18,48); display.PrintString("MOVE TO CONTINUE"); } Tato funkce obsahuje i funkci pro vykreslení graficky detailnějšího obrázku automobilu. Při tomto vykreslování již byla evidentní doba zobrazování, která může být pravděpodobně 100ms. Dále byly vytvořeny funkce pro vytvoření cesty, objektu a auta. Jsou to funkce initRoad(), initCar() a initObstackle(). Dále bylo nutné rozlišovat v jakém stavu se hra nachází, pro toto byla vytvořena globální proměnná startFlag. Pro pohyb auta je použita funkce moveCar(): void moveCar(int flag) { int speed = 4; switch(flag) { case 1: display.FullRectangle(carPositionX,carPositionY,carPositionX+11,carPositionY+5, WHITE); carPositionY = carPositionY+speed; display.FullRectangle(carPositionX,carPositionY,carPositionX+11,carPositionY+5, BLACK); break; case 2: display.FullRectangle(carPositionX,carPositionY,carPositionX+11,carPositionY+5, WHITE); carPositionY = carPositionY-speed; display.FullRectangle(carPositionX,carPositionY,carPositionX+11,carPositionY+5, BLACK); break; case 3: display.FullRectangle(carPositionX,carPositionY,carPositionX+11,carPositionY+5, WHITE); carPositionX = carPositionX+speed; display.FullRectangle(carPositionX,carPositionY,carPositionX+11,carPositionY+5, BLACK); break; case 4: display.FullRectangle(carPositionX,carPositionY,carPositionX+11,carPositionY+5, WHITE); carPositionX = carPositionX-speed; display.FullRectangle(carPositionX,carPositionY,carPositionX+11,carPositionY+5, BLACK); break; } } Celý kód je obsáhlejší, z tohoto důvodu jej lze celý vidět na stránkách [[http://developer.mbed.org/users/standabassman/code/Driving_game/|mbedu]] (nutností je být zde přihlášen). Pro aktivaci hry stačí pouze pohnout s deskou FRDM-KL25Z, objeví se startovní obrazovka a hra je spuštěna. Ovládání automobilu bylo provedeno, stejně jako pohyb překážky a ošetření kolize. Pokud se pohyboval pouze automobil, bylo vykreslování relativně v pořádku, ale jakmile byla přidána překážka, pohyb byl mnohem více trhaný a nepřehledný. Z tohoto důvodu nebyly doplněny další funkce jako zrychlování pohybu, náhodné překážky a podobně. Důvodem trhaného pohybu objektů byla vykreslovací rychlost a také různé rychlosti překážek a automobilu. Z tohoto důvodu bylo upuštěno od dalšího vývoje. Byly vyzkoušeny různé možnosti mazání a vykreslování objektů, ale nebylo dosaženo lepších výsledků. Níže je video zobrazující pohyb automobilu a překážky. {{youtube>hs9kAkX7peg?high}} ===== Závěr ===== Ovládání displeje ATM12864D bylo umožněno ve spolupráci s deskou FRDM-KL25Z. Zobrazovací rychlost byla ale příliš malá a navrhovaná hra Driving nebyla kompletně dotvořena. Na videu lze vidět umožnění ovládání pomocí akcelerometru. Je zde také vidět kolize automobilu s překážkou a následný konec hry. Zdrojové kódy jsou k dispozici na serveru mbed.org. Samotná kolize automobilu má nedokonalosti, je vytvářen pouze jedna překážka, která se objevuje po zmizení první znovu. Vykreslování displeje a tedy samotné pohyby objektů jsou viditelně trhané, což u automobilu není příliš velký problém, ale v případě překážky nelze úplně přesně odhadnout pozice. K podobné aplikaci by bylo výhodnější použít jiný displej, který se hodí spíše pro zobrazování informací a ne k zobrazování a ovládání herních aplikací.