Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| Následující verze | Předchozí verze | ||
|
2014:led-snake [2015/01/14 23:41] Miroslav Cupal vytvořeno - zakladni popis HW, SW, ukazky kodu |
2014:led-snake [2015/01/18 13:27] (aktuální) Jan Novotný [KOD] |
||
|---|---|---|---|
| Řádek 18: | Řádek 18: | ||
| {{ :2014:led-snake:matice.gif?200 |}} | {{ :2014:led-snake:matice.gif?200 |}} | ||
| - | {{ :2014:led-snake:matice.png?200 |}} | + | {{ :2014:led-snake:matice.png?200 |Prehled dvou mapovani disp.}} |
| ===== Hardware ===== | ===== Hardware ===== | ||
| Řádek 31: | Řádek 31: | ||
| * Poslední využitou periferií je kapacitní slider, který slouží pro nastavení rychlosti hada. Tu lze proti základní rychlosti zpomalit, ale i zrychlit. | * Poslední využitou periferií je kapacitní slider, který slouží pro nastavení rychlosti hada. Tu lze proti základní rychlosti zpomalit, ale i zrychlit. | ||
| - | {{ :2014:led-snake:diagram1.png?300 |}} | + | {{ :2014:led-snake:diagram1.png?300 |Blokové schéma}} |
| + | |||
| + | Vývojová deska je s displejem propojena pomocí redukčního přípravku, který má možnost připojení dvou tlačítek a rozhraní UART. Jelikož je had ovládán pomocí 4 tlačítek byla tlačítka vyvedena mimo na nepájivé kontaktní pole. Uspořádání tlačítek bylo zvoleno jako uspořádání kurzorových šipek na PC klávesnici.\\ | ||
| + | {{ :2014:led-snake:schema_redukce.png?300 |Redukce KL25Z na disp.}}{{ :2014:led-snake:schema_tlacitka.png?200 |Schéma zapojení tlačítek}} | ||
| + | {{ :2014:led-snake:deska_redukce.png?200 |}} | ||
| - | Vývojová deska je s displejem propojena pomocí redukčního přípravku, který má možnost připojení dvou tlačítek a vývodu pro I2C. Jelikož je had ovládán pomocí 4 tlačítek byla tlačítka vyvedena mimo na nepájivé kontaktní pole. Uspořádání tlačítek bylo zvoleno jako uspořádání kurzorových šipek na PC klávesnici. | ||
| Vzhledem k umístění kapacitního slideru na desce a jeho překrytí redukční deskou byly piny na tuto desku napájené v maximální délce. Ovládání rychlosti je tedy možné, ale špatně dosažitelné. | Vzhledem k umístění kapacitního slideru na desce a jeho překrytí redukční deskou byly piny na tuto desku napájené v maximální délce. Ovládání rychlosti je tedy možné, ale špatně dosažitelné. | ||
| + | |||
| + | {{:2014:led-snake:sam_0996.jpg?200|}} {{:2014:led-snake:sam_0998.jpg?200|}} {{:2014:led-snake:sam_10092.jpg?200|}} | ||
| + | |||
| ===== Software ===== | ===== Software ===== | ||
| Řádek 53: | Řádek 59: | ||
| ==== KOD ==== | ==== KOD ==== | ||
| - | Program je tvořen několika funkcemi jejich zaměření lze rozdělit na funkce starající se o zobrazení, generování dat a řízení hada. Do programu byly importovány knihovny TSI (kapacitní slider) a knihovna mbed. | + | Program je tvořen několika funkcemi jejich zaměření lze rozdělit na funkce starající se o zobrazení, generování dat a řízení hada. Do programu byly importovány knihovny TSI (kapacitní slider) a knihovna mbed. Kompletní program, binárka a soubory pro kompilaci jsou v archivu {{:2014:led-snake:snake.zip|}}. |
| Řízení hada probíhá pomocí pole o rozměru 64 bodů. Pole s názvem h[64] o definovaném rozměru je naplněno číslem 65. Toto číslo nemůže nikdy nastat a složí jako informace o nepřítomnosti hada. Jednotlivé segmenty pole představují pořadové číslo článku hada a jejich hodnota udává pozici tohoto článku. Platí tedy že hlava bude vždy v h[0] a bude se lišit číselná hodnota. | Řízení hada probíhá pomocí pole o rozměru 64 bodů. Pole s názvem h[64] o definovaném rozměru je naplněno číslem 65. Toto číslo nemůže nikdy nastat a složí jako informace o nepřítomnosti hada. Jednotlivé segmenty pole představují pořadové číslo článku hada a jejich hodnota udává pozici tohoto článku. Platí tedy že hlava bude vždy v h[0] a bude se lišit číselná hodnota. | ||
| Pohyb hada je řešeny vytvořením nové hlavy na příslušné pozici podle zvoleného směru pohybu a vymazáním posledního článku ocasu hada. | Pohyb hada je řešeny vytvořením nové hlavy na příslušné pozici podle zvoleného směru pohybu a vymazáním posledního článku ocasu hada. | ||
| <code c> | <code c> | ||
| - | int pohyb() //pohyb hada v pracovnich souradnicich h[] | + | void pohyb() //pohyb hada v pracovnich souradnicich h[] |
| { | { | ||
| - | char i; | + | unsigned char i; |
| switch (posun){ //na zaklade velikosti posunu rozhodne o smeru, funkce v case jsou temer totozne | switch (posun){ //na zaklade velikosti posunu rozhodne o smeru, funkce v case jsou temer totozne | ||
| case 0: | case 0: | ||
| Řádek 148: | Řádek 154: | ||
| } | } | ||
| nuldisp(); //volani vynulovani displeje | nuldisp(); //volani vynulovani displeje | ||
| - | return 0; | ||
| } | } | ||
| </code> | </code> | ||
| Řádek 154: | Řádek 159: | ||
| Další zajímavou částí programu je generování pozice jablka. To probíhá pomocí srand a rand. Pro zajištění maximální náhodné hodnoty je vstupem funkce srand 1000 násobek hodnoty na pinu PTB3, který je nastaven jako analogový vstup a součet času od spuštění desky. | Další zajímavou částí programu je generování pozice jablka. To probíhá pomocí srand a rand. Pro zajištění maximální náhodné hodnoty je vstupem funkce srand 1000 násobek hodnoty na pinu PTB3, který je nastaven jako analogový vstup a součet času od spuštění desky. | ||
| <code c> | <code c> | ||
| - | int genj() // funkce generujici pozici jablka | + | void genj() // funkce generujici pozici jablka |
| { | { | ||
| char i; // pomocna | char i; // pomocna | ||
| Řádek 166: | Řádek 171: | ||
| } | } | ||
| s++; // pricteni jablka do skore - o jedno spozdeno | s++; // pricteni jablka do skore - o jedno spozdeno | ||
| - | return 0; | ||
| } | } | ||
| </code> | </code> | ||
| Řádek 174: | Řádek 178: | ||
| void dejmat() // prepocet pracovnich souradnic na souradnice na dipleji | void dejmat() // prepocet pracovnich souradnic na souradnice na dipleji | ||
| { | { | ||
| - | char i,t1,t2; | + | unsigned char i,t1,t2; |
| for(i = 0; i <= 65; i++){ | for(i = 0; i <= 65; i++){ | ||
| if(h[i] != 65){ | if(h[i] != 65){ | ||
| Řádek 248: | Řádek 252: | ||
| </code> | </code> | ||
| + | Funkce main probíhá celá v nekonečné smyčce, pro zajištění opakování hry. Následuje plnění pracovních polí příznakem o nepřítomnosti hada, nulování displeje a definice hada do výchozí polohy. Následuje smyčka hry která trvá tak dlouho dokud funkce konec nevrátí 0. Následují funkce pro zablikání hada po zakousnutí, výpočet a zobrazení skóre. Poslední smyčka while probíhá dokud není stisknuté tlačítko UP. | ||
| + | |||
| + | <code c> | ||
| + | int main() | ||
| + | { | ||
| + | while(1){ | ||
| + | int i,k=0,kk=40,t1,t2; | ||
| + | | ||
| + | srand (time(NULL)+ran*1000); //pro skoronahodnou posloupnost | ||
| + | | ||
| + | for(i=0;i<65;i++){ //nulovani pracovnich poli | ||
| + | h[i] = 65; | ||
| + | hh[i] = 65; | ||
| + | } | ||
| + | |||
| + | nuldisp(); //na zacatku vynuluj displej | ||
| + | |||
| + | for (i = 0; i < size; i++){ //pocatecni delka hada v zobrazovaci matici | ||
| + | had[0][i] = 0; | ||
| + | } | ||
| + | | ||
| + | h[0]=2;h[1]=1;h[2]=0; // pocatecni had v pracovnim poli | ||
| + | genj(); //generovani jablka | ||
| + | while(konec()){ //smycka vlastni hry | ||
| + | tlac(); //obsluha tlacitek | ||
| + | dejmat(); //prevod z prac do matic | ||
| + | ukaz(); //zobrazeni matice | ||
| + | |||
| + | if(100*tsi.readPercentage() > 10){ // ovladani rychlosti hada, pokud se dotknu slideru ulozi se aktualni hodnota do promene | ||
| + | kk = 110-100*tsi.readPercentage(); // doleva pomalejsi doprava rychlejsi | ||
| + | } | ||
| + | | ||
| + | if(k >= kk ){ // zajisteni pohybu hada danou rychlosti | ||
| + | pohyb(); | ||
| + | chlamst(); | ||
| + | k = 0; | ||
| + | } | ||
| + | k++; | ||
| + | } | ||
| + | // zablikani hada pokud se zakousne | ||
| + | nuldisp(); | ||
| + | cekej(); | ||
| + | dejmat(); | ||
| + | cekej(); | ||
| + | nuldisp(); | ||
| + | cekej(); | ||
| + | dejmat(); | ||
| + | cekej(); | ||
| + | nuldisp(); | ||
| + | cekej(); | ||
| + | nuldisp(); | ||
| + | | ||
| + | score(s); // prepocet skore | ||
| + | for(i = 0; i <= 65; i++){ // prevedeni do maticove podoby | ||
| + | if(h[i] == 66){ | ||
| + | t1 = i % 8; | ||
| + | t2 = i / 8; | ||
| + | had[t2][t1] = 0; | ||
| + | } | ||
| + | } | ||
| + | while(1){ //smycka zobrazujici skore az do stisku reset nebo sipky nahoru | ||
| + | ukaz(); | ||
| + | if(up ==0){ | ||
| + | size = 3;s=2;posun = 0; | ||
| + | wait(0.5); | ||
| + | break; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | |||
| + | |||
| + | ===== Videoukázka ===== | ||
| + | Na videu jsou ukázané všechny funkce. Je ukázána krátká hra s hadem pohybujícím se všemi směry, sežrání jablka, zakousnutí hada a zobrazení skóre. Následuje restart hry a ukázka změny rychlosti. | ||
| + | {{ youtube>XWr7cuOYZPU?medium }} | ||
| + | ===== Zhodnocení ===== | ||
| + | V programu jsou implementovány všechny důležité funkce a hra je plně funkční. Program je připraven pro možnost implementování dalších funkcí jako výpočet skóre s ohledem na rychlost hada nebo náhodné generování překážek případně zrychlování hada po sežrání jablka. Tato vylepšení hry by vyžadovala implementaci jednoduchého menu které by umožnilo zapnout různé funkce. | ||