Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2014:driving-game

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 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.

 Sestava s displejem

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.

Software

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í.

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í.

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).

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.

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í.

2014/driving-game.txt · Poslední úprava: 2015/01/18 14:45 autor: Stanislav Horký