Toto je starší verze dokumentu!
Ú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.
Pro projekt byla použita deska FRDM-KL25Z a grafický displej 128×64 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.
obr.1 Sestava s displejem
Zapojení I/O pinů procesoru bylo zvoleno dle datasheetu k displeji 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.
Aplikace byla vytvořena v prostředí 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í.
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í.
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 mbedu (nutností je být zde přihlášen).