Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2014:ant-run

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
Následující verze
Předchozí verze
2014:ant-run [2015/01/17 15:57]
Tomáš Jankech [Software] ++ stav pause
2014:ant-run [2015/01/18 23:42] (aktuální)
Tomáš Jankech [Software] ++ obládanie blokovka
Řádek 65: Řádek 65:
  
 ,ktoré sú pri vysvecovaní panelu rozkódované a priradené jednotlivým výstupným pinom. Samotné vysvecovanie sa riadi algoritmom popísaným nasledujúcim vývojovým diagramom ([[http://​www.urel.feec.vutbr.cz/​MPOA/​_detail/​2014/​ant-run/​f_show_matrix.png?​id=2014%3Aant-run|Obr. 6]]). ,ktoré sú pri vysvecovaní panelu rozkódované a priradené jednotlivým výstupným pinom. Samotné vysvecovanie sa riadi algoritmom popísaným nasledujúcim vývojovým diagramom ([[http://​www.urel.feec.vutbr.cz/​MPOA/​_detail/​2014/​ant-run/​f_show_matrix.png?​id=2014%3Aant-run|Obr. 6]]).
-{{ :​2014:​ant-run:​f_show_matrix.png?250 |Obr. 6 - Vývojový diagram funkcie show_matrix}}+{{ :​2014:​ant-run:​f_show_matrix.png |Obr. 6 - Vývojový diagram funkcie show_matrix}}
  
 Zobrazovacia funkcia riadi jas panelu (použitým oneskorením) aj blikanie kurzoru. Zobrazovacia funkcia riadi jas panelu (použitým oneskorením) aj blikanie kurzoru.
Řádek 125: Řádek 125:
  
 **Popis** – Stav PAUSE je typická pauza hry. Hra v okamihu prechodu to tohto stavu „zamrzne“ (nebliká ani kurzor výberu bloku <​sup>​*popísaný v stave GAME</​sup>​) .  Zo stavu PAUSE môže užívateľ buď pokračovať v hre alebo začať novú hru vygenerovaním nového bludiska. **Popis** – Stav PAUSE je typická pauza hry. Hra v okamihu prechodu to tohto stavu „zamrzne“ (nebliká ani kurzor výberu bloku <​sup>​*popísaný v stave GAME</​sup>​) .  Zo stavu PAUSE môže užívateľ buď pokračovať v hre alebo začať novú hru vygenerovaním nového bludiska.
 +^Stav - GAME^
 +**Indikačná dióda** – ZELENÁ\\
 +**Funkcia ľavého tlačidla** – Prechod do stavu PAUSE\\
 +**Funkcia pravého tlačidla** – Otoč vybratý blok o 90º\\
 +**Ovládanie akcelerometrom** – Ovládanie kurzoru (výber bloku bludiska, ktorý je potrebné otočiť)\\
 +
 +**Popis** – Princípom hry je udržať mravca v pohybe. Mravec sa po bludisku pohybuje sám, úlohou hráča je tvorba priechodnej cesty bludiskom. Priechodná cesta bludiskom sa vytvára otáčaním jednotlivých blokov bludiska. ​ Hráč môže otáčať iba čisté bloky labyrintu. To znamená bloky, ktoré ešte neboli použité, alebo v nich už mravec nie je. Prechodom mravca sa blok zaradí medzi použité, a mravec po nich už nemôže viac ísť. Jediným spôsobom, ako bloky zreaktivovať je prechod „cez okraj labyrintu“. Po takomto prechode je mravec prenesený na protiľahlú stranu labyrintu (pokiaľ je protiľahlý blok správne natočený) a všetky použité bloky labyrintu sú opäť náhodne vygenerované.
 +
 +Hra začína vždy blokom „štart“ na rovnakom mieste (druhý blok zľava, druhý blok zhora) ​ rovnakým smerom pohybu mravca (nadol). Kurzor je vždy na začiatku hry umiestnený pod blok „štart“,​ hráč môže teda hneď správne nasmerovať prvý blok. (toto rozloženie je zabezpečené pri generovaní labyrintu v stave READY).
 +Hráč pohybuje doskou, čím ovláda pohyb kurzoru, ktorý predstavuje blikajúce políčko. Keď sa hráč premiestni kurzorom na políčko, ktoré potrebuje otočiť aby vytvoril správnu cestu labyrintom, použije pravé tlačidlo ovládania.  ​
 +
 +Hra končí narazením mravca na zle otočený alebo použitý blok. Po skončení hry sa zariadenie prechádza do stavu SCORE.
 +^Stav - SCORE^
 +**Indikačná dióda** – ČERVENÁ/​MODRÁ (preblikávanie)\\
 +**Funkcia ľavého tlačidla** – Prechod do stavu READY\\
 +**Funkcia pravého tlačidla** – Bez funkcie\\
 +**Ovládanie akcelerometrom** – Bez funkcie\\
 +
 +**Popis** – Stav SCORE nastáva po prehre v hre. Prehrá nastane ak
 +  * Mravec narazí na nesprávne otočený blok labyrintu do ktorého nemôže vojsť
 +  * Mravec narazí na použitý blok
 +V tomto stave je na LED panely vyobrazené skóre hráča. Na počítanie skóre je vyhradená premenná dátového **typu uint32_t**.
 +
 +| Handbook http://​developer.mbed.org/​handbook/​C-Data-Types |->| unsigned int | uint32_t | 0 .. 4,​294,​967,​295 |
 +
 +Vysvietiť celé takto dlhé číslo je na 8x8 LED matici nemožné (čitateľne pre normálneho bežného človeka). Preto skóre rotuje po zobrazovacom panely v smere zľava doprava. Pre lepšiu prehľadnosť a kompaktnejšie zobrazenie nie sú čísla oddelené medzerou, ale farbou. Farby sú tri, čo pomáha k oddeleniu tisícok, desať tisícok a miliónov (gratulujem hráčovi s takým skóre, ja som nahral max 88).
 +Každé číslo je definované v úvode kódu 24 bitovým kódom (3 stĺpce a 8 riadkov). Čísla sú vysvecované po stĺpcoch. Prevod čísla na znak zabezpečuje funkcia uint32_t translate(uint8_t number). Princíp vyobrazovania skóre je popísaný nasledujúcim vývojovým diagramom ([[http://​www.urel.feec.vutbr.cz/​MPOA/​_detail/​2014/​ant-run/​f_state_score.png?​id=2014%3Aant-run| Obr. 8]]).
 +
 +{{ :​2014:​ant-run:​f_state_score.png | Obr. 8 - Zobrazovanie skóre}}
 +
 +^Stav hry - LEARN^
 +<​sup>​*nejedná sa o stav stavového automatu ale o mód v ktorom zariadenie pracuje</​sup>​
 +
 +Popis – Hra Ant Run nie je veľmi známa. Vlastne asi vôbec. Preto je zložité novému hráčovi vysvetliť celý princíp hry, hlavne z dôvodu tak trochu obrátenej logiky hrania (mravec sa pohybuje sám, treba mu postaviť nekonečnú cestu bludiskom). Preto bol do hry zavedený výučbový mód. 
 +
 +Pre vstup do tohto módu je potrebné počas štartu mikroprocesoru držať naraz obe tlačidlá. Užívateľ je o vstupe do výučbového módu informovaný indikačnou LED, ktorá svieti na modro.
 +
 +Vo výučbovom móde funguje celé zariadenie rovnako ako v štandardnom stave, hru však nie je možné prehrať. Pokiaľ hráč zle zostaví labyrint, mravec príde na poslednú pozíciu ktorú mu cesta labyrintom umožní a čaká na správne natočenie ďalšieho bloku. V stave LEARN sa teda ani nepočíta skóre, ide o zoznámenie so základnými princípmi hry.
 +----
 +===Ovládanie===
 +Hra je ovládaná kombináciou tlačidiel a pohybov doskou. Pohyb doskou je periodicky snímaný akcelerometrom MMA8451Q z dosky KL25Z a prepočítaný na údaje o natočení dosky. ​
 +O periodické vyčítanie údajov sa stará prerušenie Ticker acc_scan. Perióda vyčítania bola určená ako 100 ms, čo zaručuje dostatočne citlivé ovládanie.
 +Pohyb je rozdelený do dvoch akcii. ​
 +  * V prvom kroku je to výber smeru otočením dosky o uhol viac ako 25º (od rovnovážnej polohy)
 +  * V druhom kroku je potrebné pohyb potvrdiť návratom dosky do rovnovážnej polohy
 +Užívateľ si môže zvoliť rovnovážnu polohu v stave TEST, ktorý je určený na oboznámenie s ovládaním po zapnutí dosky. ​
 +Smer pohybu je reprezentovaný premennou acc_dir typu
 +<code c>​typedef enum  {idle, left, up, right, down} direction_t;</​code>​
 +
 +Na obrázku [[http://​www.urel.feec.vutbr.cz/​MPOA/​_detail/​2014/​ant-run/​f_accelerometer.png?​id=2014%3Aant-run|Obr. 9]] je zobrazený princíp vyhodnocovania dát z akcelerometra.
 +
 +{{ :​2014:​ant-run:​f_accelerometer.png |Obr. 9 - Vyhodnocovanie dát z akcelerometra}}
 +
 +Funkcia confrim_dir potvrdzuje návrat do rovnovážnej polohy vykreslením zelenej šípky so správnym natočením alebo maže údaje vysvietené na panely v prípade, že užívateľ doskou nepohol.\\
 +
 +Funkcia move_cursor v hre pohybuje s Funkcia confrim_dir potvrdzuje návrat do rovnovážnej polohy vykreslením zelenej šípky so správnym natočením alebo maže údaje vysvietené na panely v prípade, že užívateľ doskou nepohol. ​ blokom (kurzorom => aktuálnym výberom). Pohyb kurzoru je nekonečný => ak prejde hráč "za okraj" kurzor sa objaví na protiľahlej strane.
 +
 +-----
 +===Generovanie labyrintu===
 +Generovanie labyrintu zaobstaráva funkcia reload_matrix ktorá je volaná v dvoch prípadoch. Generácia nového labyrintu na začiatku hry a generácia nových blokov namiesto použitých po prechode mravca „okrajom“ bludiska.
 +V rámci funkcie sa prejde každý blok labyrintu. Pokiaľ je blok označený ako použitý – všetky bloky matice sú označené ako led_used, vygeneruje sa za tento blok nový blok labyrintu. Ten je náhodne určený a náhodne otočený.
 +Bloky sú preddefinované v úvode kódu. Ich definícia v šestnástkovej sústave šetrí miesto a umožňuje jednoduché pretáčanie bloku pomocou bitového posunu. ​
 +<code c>
 +#define lab_turn_big ​   0x0D  /* 
 +                               ​* ​ x x
 +                               ​* ​ . x 
 +                               */
 +                               
 +#define lab_turn_small ​ 0x08   /​* ​
 +                               ​* ​ x .
 +                               ​* ​ . . 
 +                               */
 +                               
 +#define lab_straight ​   0x0A   /​* ​
 +                                *  x .
 +                                *  x . 
 +                                */
 +</​code>​
 +Funkcia reload_matrix obsahuje aj inkrementáciu skóre. Jeden vygenerovaný blok znamená zvýšenie počítadla skóre o jeden bod.
 +<code c>
 +void reload_matrix(void)
 +{
 +    // blocks horizontal
 +    for(uint8_t j = 0; j < 4;j++)
 +    {
 +        // blocks vertical
 +        for(uint8_t i = 0; i < 4;i++)
 +        {
 +            int8_t block; ​  // random block type
 +            int8_t shift; ​  // random block turn
 +            ​
 +            // if labyrint part == used => generate new part 
 +            if((matrix[j*2][i*2] == led_used) && (matrix[(j*2) + 1][i*2] == led_used) ​
 +            && (matrix[(j*2) + 1][(i*2) + 1] == led_used) && (matrix[j*2][(i*2) + 1] == led_used)) ​   ​
 +            {
 +                 // random block selection
 +                 ​switch( rand() % 3 )
 +                 {
 +                    case 0:
 +                        block = lab_turn_big;​
 +                        break; ​
 +                    case 1:
 +                        block = lab_turn_small;​
 +                        break;
 +                    case 2:
 +                        block = lab_straight;​
 +                        break; ​
 +                 }
 +                ​
 +                 // random shift 0-0st, 1-90st, 2-180-st, 3-270st
 +                 shift = rand() % 4;
 +                 ​matrix[2*j][2*i] ​        = led_lab * ( 1 & block >> ​ (shift % 4));       // ​ 0 
 +                 ​matrix[2*j][(2*i)+1] ​    = led_lab * ( 1 & (block >> (++shift % 4)));    //  1
 +                 ​matrix[(2*j)+1][2*i] ​    = led_lab * ( 1 & (block >> (++shift % 4)));    //  2
 +                 ​matrix[(2*j)+1][(2*i)+1] = led_lab * ( 1 & (block >> (++shift % 4)));    //  3
 +    ​
 +                // score counter, one block == one point
 +                if(game_state == game)
 +                    score_cnt++;​
 +            }
 +        }
 +    }
 +}
 +</​code>​
 +-----
 +===Beh mravca===
 +Najzložitejšia funkcia programu zabezpečuje beh mravca. Je volaná periodicky každých 1,2 s. Táto časová konštanta bola určená na základe testov. Dáva hráčovi dostatočný čas na tvorbu labyrintu, nie však toľko, aby hra nemala spád. Rýchlosť mravca je počas celej hry konštantná (na takto malom hracom priestore je to aj tak primerane obtiažne).
 +V prvom rade je potrebné uvedomiť si princíp pohybu. Bloky, ktoré hra obsahuje umožňujú obmedzené množstvo pohybov. Podľa polohy mravca v bloku je možné určiť, kam má ďalej pokračovať. Možnosti pohybu v závislosti na predchádzajúcom smere pohybu sú zobrazené na tomto obrázku ([[http://​www.urel.feec.vutbr.cz/​MPOA/​_detail/​2014/​ant-run/​ant_move.png?​id=2014%3Aant-run|Obr. 10]])
 +
 +{{ :​2014:​ant-run:​ant_move.png?​200 | Obr. 10 - Možnosti pohybu mravca}} ​
 +
 +Pohyb mravca teda definujú premenné, predstavujúce polohu (poradie stĺpca, poradie riadka) a smer pohybu (enum direction_t <​sup>​*rovnaký ako v ovládaní</​sup>​). Ich kombináciou sa dá zistiť presná poloha mravca.
 +
 +Vývojový diagram pohybu mravca v labyrinte je na obrázku [[http://​www.urel.feec.vutbr.cz/​MPOA/​_detail/​2014/​ant-run/​f_ant_run.png?​id=2014%3Aant-run|Obr.11]].\\
 +Pre prvé určenie smeru pohybu (vpravo/​vľavo alebo hore/dole) sa využíva vlastnosť dátového typu enum, v ktorom jednotlivé prvky predstavujú na čísla od 0 ďalej.
 +Vo vývojovom diagrame pokračuje vetvenie algoritmu testom na „1. typ pohybu“. Týmto pohybom sa myslí pohyb, keď mravec v predchádzajúcom kroku vošiel do tohto bloku (nezáleží pri tom z akej strany). V obrázku vyššie tento stav zobrazujú spodné dva bloky. ​
 +Prioritný pohyb je vždy v rámci bloku, ak takýto pohyb nie je možný, zisťuje sa, či je možný pohyb smerom von z bloku. ​
 +Pohyb von z bloku je možný iba v prípade, že je blok labyrintu, do ktorého mravec smeruje vhodne natočený. To sa zistí tak, že pixel kam mravec mieri je označený led_lab (blok labyrintu) a vedľajší pixel (na rozhraní aktuálneho a budúceho bloku) je označený ako led_free (voľný blok).
 +Ak mravec opúšťa blok (algoritmus mu to dovolil), môžu nastať dva prípady prechodu do vedľajšieho bloku
 +  * Štandardný prechod
 +    * Predošlý blok sa označí za použitý
 +  * Prechod cez okraj
 +    * Predošlý blok sa označí za použitý
 +    * Vygenerujú sa nové bloky labyrintu miesto použitých
 +V prípade, že nie je možný ani pohyb v bloku, ani pohyb mimo bloku, hra končí.
 +
 +{{ :​2014:​ant-run:​f_ant_run.png | Obr. 11 - Algoritmus hľadania cesty bludiskom pre pohyb mravca}}
 +=====Video=====
 +Hra Ant Run, v úvode je stav TEST a demonštrácia ovládania. ​
 +
 +{{ youtube>​Z3XV8pjQB0Y?​medium }}
 +
 +Hra je v móde LEARN ktorý slúži na predstavenie hry (nehrá sa na skóre)
 +
 +{{ youtube>​373jtcEcwK0?​medium }}
 +
 +Podsvietenie dosky
 +
 +{{ youtube>​ak3MDlOqz-E?​medium }}
 +
 +Sekanie obrazu je spôsobené automatickým zaostrovaním môjho telefónu.
 +=====Záver=====
 +Cieľom projektu bola realizácia hry Ant Run na určenom hardware-ovom vybavení.
 +Hra funguje v dvoch módoch - vo výučbovom móde a v móde s počítaním skóre. Oba sú odtestované a fungujú, čo dokazuje aj priložené video.\\
 +
 +Celý zdrojový kód je uverejnený na stránkach mbed [[http://​developer.mbed.org/​users/​tomas_dca/​code/​MPOA_ant_run/​| MPOA_ant_run ]].
2014/ant-run.1421506630.txt.gz · Poslední úprava: 2015/01/17 15:57 autor: Tomáš Jankech