Piškvorky (Tic-Tac-Toe): Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
Bez shrnutí editace |
||
(5 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
Riadok 2: | Riadok 2: | ||
== Zadanie == | ==== Zadanie ==== | ||
Vytvoriť program pre piškovorky (tictactoe) na maticovom | Vytvoriť program pre piškovorky (tictactoe) na maticovom displeji. | ||
[[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]] | [[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]] | ||
Riadok 12: | Riadok 12: | ||
* [https://github.com/cpldcpu/light_ws2812/tree/master/light_ws2812_AVR/Light_WS2812 Knižnice k ws2812 displeji] | * [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] | * [https://handsontec.com/dataspecs/display/WS2812%20Neopixel%204x4%20Matrix.pdf Dokumentacia k displaju] | ||
__TOC__ | |||
== Analýza a opis riešenia == | == Analýza a opis riešenia == | ||
Tento program umožnuje hráčom pohybovať sa po 4x4 displeji 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:WS2812B.jpg|600px|thumb|center|ws2812b displej]] | |||
[[Súbor: | |||
[[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 displeji.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 displeji. Ď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=" | <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) | ||
{ | { | ||
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 | |||
} | |||
} | |||
</source></tab> | |||
</tabs> | |||
Zdrojový kód: [[Médiá:TicTacToe-Guľak.zip|Zdrojový kód a knižnice.zip]] | |||
==== Zapojenie ==== | |||
[[Súbor:Zapojenienadoske.jpg|800px|thumb|center|Zapojenie displeja ws2812b na doske]] | |||
'''Video: Overenie funkčnosti''' | |||
<center><youtube>NEEPqV2sxMM?feature=share</youtube></center> | |||
[[Category:AVR]] [[Category:MIPS]] | [[Category:AVR]] [[Category:MIPS]] |
Aktuálna revízia z 17:57, 11. máj 2024
Záverečný projekt predmetu MIPS / LS2024 - Peter Guľak
Zadanie
Vytvoriť program pre piškovorky (tictactoe) na maticovom displeji.
Literatúra:
Analýza a opis riešenia
Tento program umožnuje hráčom pohybovať sa po 4x4 displeji 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'.
Algoritmus a program
Princípom tohto programu je vytvorenie jednoduchého herného zariadenia na hru piškovorky na 4x4 maticovom led displeji.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 displeji. Ď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
Zapojenie
Video: Overenie funkčnosti