Operácie

Piškvorky (Tic-Tac-Toe): Rozdiel medzi revíziami

Z SensorWiki

(Vytvorená stránka „Záverečný projekt predmetu MIPS / LS2024 - '''Meno Priezvisko''' == Zadanie == Sem príde text zadania, ak bolo len voľne formulované, rozpíšte ho podrobnejši…“)
 
(2 medziľahlé úpravy od rovnakého používateľa nie sú zobrazené.)
Riadok 1: Riadok 1:
Záverečný projekt predmetu MIPS / LS2024 - '''Meno Priezvisko'''
+
Záverečný projekt predmetu MIPS / LS2024 - '''Peter Guľak'''
  
  
== Zadanie ==
+
==== Zadanie ====
  
Sem príde text zadania, ak bolo len voľne formulované, rozpíšte ho podrobnejšie
+
Vytvoriť program pre piškovorky (tictactoe) na maticovom displaji.
  
 
[[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]]
 
[[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]]
Riadok 10: Riadok 10:
 
'''Literatúra:'''  
 
'''Literatúra:'''  
 
* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]
 
* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]
* [http://www.humanbenchmark.com/tests/reactiontime/index.php Vyskúšajte si zmerať reakciu on-line]
+
* [https://github.com/cpldcpu/light_ws2812/tree/master/light_ws2812_AVR/Light_WS2812 Knižnice k ws2812 displeji]
 
+
* [https://handsontec.com/dataspecs/display/WS2812%20Neopixel%204x4%20Matrix.pdf Dokumentacia k displaju]
  
 
__TOC__
 
__TOC__
Riadok 17: Riadok 17:
 
== Analýza  a opis riešenia ==
 
== Analýza  a opis riešenia ==
  
Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...
+
Tento program umožnuje hráčom pohybovať sa po 4x4 displaji cez sériovú linku pomocou kláves '+' a '-'. Pri pohybe sa momentálna pozícia zobrazuje zasvietením ledky na zeleno. Jednotlivé ťahy hráčou sa zaznamenávajú pomocou kláves '*' a '/'. Je na hráčoch aby si zvolili kto pôjde ako prvý. Premazanie hracieho poľa je uskutočné stlačením klavesi 'x'.
 +
 
  
[[Súbor:ledRGB.jpg|400px|thumb|center|RGB LED.]]
+
[[Súbor:WS2812B.jpg|600px|thumb|center|TM1637 displej]]
  
Nezabudnite doplniť schému zapojenia!
 
  
[[Súbor:schd.png|400px|thumb|center|Schéma zapojenia LCD displeja.]]
+
[[Súbor:Schematictactoe.jpg|800px|thumb|center|Schéma zapojenia ws2812b 4x4 maticového displeja]]
  
  
 
=== Algoritmus a program ===
 
=== Algoritmus a program ===
 +
Princípom tohto programu je vytvorenie jednoduchého herného zariadenia na hru piškovorky na 4x4 maticovom led displaji.Program riadi logiku hry, umožňuje pohybovať sa hráčom po hracom poly a vykonávať ťahy.Ako prvé sme si pridali knižnice pre fungovanie displeja.
  
Algoritmus programu je....
+
Premenná 'pos' slúži na sledovanie aktuálnej pozície na LED páse. Ďalej sme definovali pin na ktorý sme pripojili 4x4 displej. Ovládanie sa realizuje v slučke while v ktorej sa čaká na prijatý znak a pomocou switchu sa uskutočnujú jednotlivé prípady. Počas fungovania programu sa na serial monitor vypisuje prijatý znak a aktuálna pozícia.
  
  
 
<tabs>
 
<tabs>
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">
+
<tab name="tictactoe"><source lang="c++" style="background: LightYellow;">
 +
//Knižnice
 +
#include <util/delay.h>
 
#include <avr/io.h>
 
#include <avr/io.h>
 +
#include <avr/interrupt.h>
 +
#include "light_ws2812.h"
 +
#include "uart.h"
 +
 +
 +
volatile int pos = 16;
 +
struct cRGB led[16];
 +
 +
#define ws2812 PB0
 +
#define ws2812_port B    // Data port
 +
#define ws2812_pin  0    // Data out pin
 +
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);
 +
  
 
int main(void)
 
int main(void)
 
{
 
{
  unsigned int measuredValue;
+
uart_init();
 +
stdout = &mystdout;
 +
char ReceivedChar;
 +
 
 +
 
 +
UBRR0 = 103;                        // Set baud rate: Load the UBRR register
 +
 
 +
UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);  // Set format: 8data, 1stop bit
 +
 
 +
UCSR0B = (1 << RXEN0) | (1 << TXEN0); 
 +
 
 +
// Uvítací obrázok :)
 +
 
 +
led[0].r=0;led[0].g=0;led[0].b=50;
 +
led[5].r=0;led[5].g=0;led[5].b=50;
 +
led[10].r=0;led[10].g=0;led[10].b=50;
 +
led[15].r=0;led[15].g=0;led[15].b=50;
 +
led[3].r=0;led[3].g=0;led[3].b=50;
 +
led[6].r=0;led[6].g=0;led[6].b=50;
 +
led[9].r=0;led[9].g=0;led[9].b=50;
 +
led[12].r=0;led[12].g=0;led[12].b=50;
 +
 
 +
ws2812_setleds(led,0);
 +
ws2812_setleds(led,5);
 +
ws2812_setleds(led,10);
 +
ws2812_setleds_rgbw(led,15);
 +
ws2812_setleds(led,3);
 +
ws2812_setleds(led,6);
 +
ws2812_setleds(led,9);
 +
ws2812_setleds(led,12);
 +
 
 +
 
 +
_delay_ms(1500);
 +
 
 +
//Vypnúť všetky led
 +
uint8_t i;
 +
    for(i=16; i>0; i--)
 +
    {   
 +
        led[i-1].r=0;led[i-1].g=0;led[i-1].b=0;
 +
ws2812_setleds(led,i);
 +
    }
 +
 
 +
while(1)
 +
    {
  
  while (1)
+
        ReceivedChar = uart_getc();
  {
 
    /*  relax  */ 
 
  }
 
  
  return(0);
+
        switch (ReceivedChar)
 +
        {
 +
                case '+': //Pohyb hore
 +
                          led[pos].g-=50;               
 +
                      pos++; if (pos >15) pos = 0;   
 +
                  led[pos].g+=50;               
 +
                                  break;
 +
                case '-': //Pohyb dole
 +
                          led[pos].g-=50;
 +
                      pos--; if (pos <0) pos = 15;
 +
                  led[pos].g+=50;
 +
                                  break;
 +
                case '*': //Hráč1 - červená farba
 +
                          led[pos].r=50;led[pos].b= 0;   
 +
                                  break;
 +
                case '/': //Hráč2 - modrá farba
 +
                          led[pos].r= 0;led[pos].b=50;   
 +
                                  break;
 +
case 'x': //Premazanie poľa
 +
for(i=16; i>0; i--)
 +
{   
 +
led[i-1].r=0;led[i-1].g=0;led[i-1].b=0;
 +
}   break;
 +
                default:
 +
                          break;
 +
        }
 +
 
 +
    ws2812_setleds(led,16);
 +
 
 +
        _delay_ms(50);                        // wait for 500ms.
 +
 
 +
        printf("Rec: %c  pos: %d \n",ReceivedChar,pos); // Výpis prijatého znaku a aktualnej pozície
 +
 
 +
    }
 
}
 
}
  
</source></tab>
 
<tab name="filename.h"><source lang="c++" style="background: LightYellow;">
 
#include <avr/io.h>
 
 
void adc_init(void);                                  // A/D converter initialization
 
  
unsigned int adc_read(char a_pin);
 
 
</source></tab>
 
</source></tab>
 
</tabs>
 
</tabs>
  
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x ''zdrojaky.zip'':
+
Zdrojový kód: [[Médiá:TicTacToe-Guľak.zip|Zdrojový kód a knižnice.zip]]
 
 
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]
 
  
 +
==== Overenie ====
  
=== Overenie ===
+
Na
  
Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia.
+
[[Súbor:Zapojenienadoske.jpg|800px|thumb|center|Zapojenie displeja ws2812b na doske]]
Na konci uvádzame fotku záverečnej obrazovky pred resetom. Vypísaný je tu priemerný čas a najlepší čas.
 
 
 
[[Súbor:fotka.jpg|400px|thumb|center|Aplikácia.]]
 
  
 
'''Video:'''
 
'''Video:'''
 
<center><youtube>_l02MBu41n0</youtube></center>
 
<center><youtube>_l02MBu41n0</youtube></center>
 
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.
 
  
 
[[Category:AVR]] [[Category:MIPS]]
 
[[Category:AVR]] [[Category:MIPS]]

Verzia zo dňa a času 16:59, 10. máj 2024

Záverečný projekt predmetu MIPS / LS2024 - Peter Guľak


Zadanie

Vytvoriť program pre piškovorky (tictactoe) na maticovom displaji.

Vývojová doska ACROB.

Literatúra:

Analýza a opis riešenia

Tento program umožnuje hráčom pohybovať sa po 4x4 displaji cez sériovú linku pomocou kláves '+' a '-'. Pri pohybe sa momentálna pozícia zobrazuje zasvietením ledky na zeleno. Jednotlivé ťahy hráčou sa zaznamenávajú pomocou kláves '*' a '/'. Je na hráčoch aby si zvolili kto pôjde ako prvý. Premazanie hracieho poľa je uskutočné stlačením klavesi 'x'.


TM1637 displej


Schéma zapojenia ws2812b 4x4 maticového displeja


Algoritmus a program

Princípom tohto programu je vytvorenie jednoduchého herného zariadenia na hru piškovorky na 4x4 maticovom led displaji.Program riadi logiku hry, umožňuje pohybovať sa hráčom po hracom poly a vykonávať ťahy.Ako prvé sme si pridali knižnice pre fungovanie displeja.

Premenná 'pos' slúži na sledovanie aktuálnej pozície na LED páse. Ďalej sme definovali pin na ktorý sme pripojili 4x4 displej. Ovládanie sa realizuje v slučke while v ktorej sa čaká na prijatý znak a pomocou switchu sa uskutočnujú jednotlivé prípady. Počas fungovania programu sa na serial monitor vypisuje prijatý znak a aktuálna pozícia.


//Knižnice
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include "light_ws2812.h"
#include "uart.h"


volatile int pos = 16;
struct cRGB led[16];

#define ws2812 PB0
#define ws2812_port B     // Data port
#define ws2812_pin  0     // Data out pin
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);


int main(void)
{
uart_init();
stdout = &mystdout;
char ReceivedChar;
   

UBRR0 = 103;                        // Set baud rate: Load the UBRR register

UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);  // Set format: 8data, 1stop bit

UCSR0B = (1 << RXEN0) | (1 << TXEN0);  

// Uvítací obrázok :)

led[0].r=0;led[0].g=0;led[0].b=50;
led[5].r=0;led[5].g=0;led[5].b=50;
led[10].r=0;led[10].g=0;led[10].b=50;
led[15].r=0;led[15].g=0;led[15].b=50;
led[3].r=0;led[3].g=0;led[3].b=50;
led[6].r=0;led[6].g=0;led[6].b=50;
led[9].r=0;led[9].g=0;led[9].b=50;
led[12].r=0;led[12].g=0;led[12].b=50;

ws2812_setleds(led,0);
ws2812_setleds(led,5);
ws2812_setleds(led,10);
ws2812_setleds_rgbw(led,15);
ws2812_setleds(led,3);
ws2812_setleds(led,6);
ws2812_setleds(led,9);
ws2812_setleds(led,12);


_delay_ms(1500);

//Vypnúť všetky led
uint8_t i;
    for(i=16; i>0; i--)
    {    
        led[i-1].r=0;led[i-1].g=0;led[i-1].b=0;
ws2812_setleds(led,i);
    }

	while(1)
     {

        ReceivedChar = uart_getc();

        switch (ReceivedChar)
        {
                case '+':				//Pohyb hore
                          led[pos].g-=50;                 
                      pos++; if (pos >15) pos = 0;    
                   led[pos].g+=50;                 
                                  break;
                case '-':				//Pohyb dole
                          led[pos].g-=50;
                      pos--; if (pos <0) pos = 15;
                   led[pos].g+=50;
                                  break;
                case '*':				//Hráč1 - červená farba
                          led[pos].r=50;led[pos].b= 0;    
                                  break;
                case '/':				//Hráč2 - modrá farba
                          led[pos].r= 0;led[pos].b=50;    
                                  break;
		case 'x':				//Premazanie poľa
			for(i=16; i>0; i--)
			{    
				led[i-1].r=0;led[i-1].g=0;led[i-1].b=0;
	 		} 	  break;
                default:
                         	  break;
        }

     	ws2812_setleds(led,16);

        _delay_ms(50);                         // wait for 500ms.

        printf("Rec: %c  pos: %d \n",ReceivedChar,pos); // Výpis prijatého znaku a aktualnej pozície

     }
}

Zdrojový kód: Zdrojový kód a knižnice.zip

Overenie

Na

Zapojenie displeja ws2812b na doske

Video: