151.02.AKRX

=//**Air of the Anthem**//=

**Grupo:**
Carlos Tonisso Jr. RA: 0040961323006 Fernando Nicoleti RA: 0040961323016 Leonardo Petrauskas RA: 0040961323025 Luiz Henrique Velloso RA: 0040961323030

**Dispositivo:**
Arduino Uno

**Projeto:**
Jogos 8 bits em matriz de led 8x8

**Resumo:**
O projeto consiste em uma matriz de led 8x8 usada como saída de dados de jogos 8 bits e um joystick para controle dos jogos (Snake e Pong).

**Software:**
Arduino 1.6.5

**Materiais:**

 * 1 Placa Arduino UNO
 * 1 Matriz led 8x8
 * 1 Joystick
 * Jumpers

**Metodologia:**

 * Definição de material
 * Definição do jogo a ser desenvolvido
 * Montagem das placas e configuração do controle
 * Desenvolvimento e teste do jogo em C
 * Desenvolvimento do jogo em Arduino

**Desenvolvimento:**
code // CÓDIGO DO SNAKE


 * 1) include "LedControl.h"

LedControl lc=LedControl(4,5,6,1); // Pins: DIN,CLK,CS, # of Display connected

int i, j; int controle = 0; int a = 0; int b = 0; int bolinhai, bolinhaj; boolean bolinhaon = false; int vivo = 1; int tamanho = 1; int velocidade = 400;

void setup { lc.shutdown(0,false); lc.setIntensity(0,0.5); Serial.begin(9600); randomSeed(analogRead(A0));

} typedef struct tabuleiro { boolean ligado = false; boolean bolinha = false; int nivel = 0; } tabuleiro;

tabuleiro tab[8][8];

void spawnBolinha { bolinhai = random(0, 7); bolinhaj = random(0, 7); if(tab[bolinhai][bolinhaj].ligado == true) spawnBolinha;

tab[bolinhai][bolinhaj].ligado = true; tab[bolinhai][bolinhaj].bolinha = true; bolinhaon = true; }

byte deadd[] = { B01111100, B01111110, B01100110, B01100110, B01100110, B01100110, B01111110, B01111100 }; byte deade[] = { B01111110, B01111110, B01100000, B01111110, B01111110, B01100000, B01111110, B01111110 }; byte deada[] = { B01111110, B01111110, B01100110, B01100110, B01111110, B01111110, B01100110, B01100110 };

void movimento(int controle) {   if(controle == 8){ b = b -1;//esquerda }else if(controle == 9){ a = a - 1; //cima }else if(controle == 10){ b = b + 1;//direita }else if(controle == 11){ a = a + 1; //baixo } } void recebeComando {   if(digitalRead(8) == HIGH){ controle = 8; }else if(digitalRead(9) == HIGH){ controle = 9; }else if(digitalRead(10) == HIGH){ controle = 10; }else if(digitalRead(11) == HIGH){ controle = 11; } }

void morto { for (i = 0; i < 8; i++) { lc.setRow(0,i,deadd[i]); } delay(500); for (i = 0; i < 8; i++) { lc.setRow(0,i,deade[i]); } delay(500); for (i = 0; i < 8; i++) { lc.setRow(0,i,deada[i]); } delay(500); for (i = 0; i < 8; i++) { lc.setRow(0,i,deadd[i]); } delay(500); for (i = 0; i < 8; i++) { lc.setRow(0,i,B000000); } delay(500); }

byte saida; void jogo {

movimento(controle); if ((a < 0 || a > 7) || (b < 0 || b > 7)) {   vivo = 0; } else { if (bolinhaon == false) spawnBolinha;

tab[a][b].ligado = true; if (a == bolinhai && b == bolinhaj) {   if ((tamanho % 5) == 0) velocidade = velocidade - 30; // aumenta velocidade da cobra a cada 5 bolinhas tamanho++; tab[a][b].bolinha = false; bolinhaon = false; for (i = 0; i < 8; i++) {       for (j = 0; j < 8; j++) {         if (tab[i][j].nivel > 0) tab[i][j].nivel++; }     }  }  if (tab[a][b].nivel > 0){ vivo = 0; } else { tab[a][b].nivel = tamanho;

for (i = 0; i < 8; i++) {   for(j = 0; j < 8; j++) {     if (tab[i][j].ligado == true && tab[i][j].bolinha == 0) tab[i][j].nivel--; if (tab[i][j].nivel < 0) tab[i][j].ligado = false; if(tab[i][j].ligado == true || tab[i][j].bolinha == true) {        lc.setLed(0,i,j,true); }        else {          lc.setLed(0,i,j,false); }   }  }  delay(velocidade); } } } void loop {

recebeComando; if (vivo != 0){ jogo; } else { morto; if(digitalRead(10) == HIGH){ // se segurar botão para direita, reseta o jogo. vivo = 1; tamanho = 1; bolinhaon = false; for (i = 0; i < 8; i++) {       for (j = 0; j < 8; j++) {         tab[i][i].ligado = false; tab[i][j].bolinha = false; tab[i][j].nivel = 0;

//lc.setLed(0,i,j,false); }     }      a = 1; b = 2; velocidade = 400; }

}

}

code

Foi criada uma matriz de structs com três valores distintos: um indicador de ligado/desligado para o led, um indicador para definir se tratava-se da bolinha e um valor de nível para controlar o tamanho da cobra.

Na montagem, foi utilizado uma placa de Arduino Uno, um controle concedido pelo professor e uma matriz de leds 8x8. Nas portas 8, 9, 10 e 11 é realizada a leitura dos botões que controlam o movimento da cobra. Nas portas 4, 5 e 6 está ligada a matriz 8x8.

code //CÓDIGO DO PONG


 * 1) include "LedControl.h"

LedControl lc=LedControl(4,5,6,1);

void setup { lc.shutdown(0,false); lc.setIntensity(0,0.5); Serial.begin(9600); randomSeed(analogRead(0));

}

int a = random(0,7); int b = random(1,3); int i, j, x = 1, y = 1; boolean ini = false, vivo = true; int tab[8][8];

byte deadd[] = { B01111100, B01111110, B01100110, B01100110, B01100110, B01100110, B01111110, B01111100 }; byte deade[] = { B01111110, B01111110, B01100000, B01111110, B01111110, B01100000, B01111110, B01111110 }; byte deada[] = { B01111110, B01111110, B01100110, B01100110, B01111110, B01111110, B01100110, B01100110 };

void morto { for (i = 0; i < 8; i++) { lc.setRow(0,i,deadd[i]); } delay(500); for (i = 0; i < 8; i++) { lc.setRow(0,i,deade[i]); } delay(500); for (i = 0; i < 8; i++) { lc.setRow(0,i,deada[i]); } delay(500); for (i = 0; i < 8; i++) { lc.setRow(0,i,deadd[i]); } delay(500); for (i = 0; i < 8; i++) { lc.setRow(0,i,B000000); } delay(500); }

void inicializar { for (i = 0; i < 8; i++) {   for (j = 0; j < 8; j++) {    /* if (j < 7) {*/     tab[i][j] = 0; /* } else {       tab[i][j] = 1; }*/   }  }  ini = true; } int p10 = 3; int p11 = 4; int p12 = 5; int p20 = 3; int p21 = 4; int p22 = 5;

void recebeComando1 { if (digitalRead(2) == HIGH && p10 > 0 ) {   tab[p10][0] = 0; tab[p11][0] = 0; tab[p12][0] = 0; p10--; p11--; p12--; } else if (digitalRead(3) == HIGH && p12 < 7) {   tab[p10][0] = 0; tab[p11][0] = 0; tab[p12][0] = 0; p10++; p11++; p12++; } }

void recebeComando2 { if (digitalRead(9) == HIGH && p20 > 0 ) {   tab[p20][7] = 0; tab[p21][7] = 0; tab[p22][7] = 0; p20--; p21--; p22--; } else if (digitalRead(11) == HIGH && p22 < 7) {   tab[p20][7] = 0; tab[p21][7] = 0; tab[p22][7] = 0; p20++; p21++; p22++; } }

void loop { // put your main code here, to run repeatedly:

if (ini == false) inicializar;

recebeComando1; tab[p10][0] = 1; tab[p11][0] = 1; tab[p12][0] = 1;

recebeComando2; tab[p20][7] = 1; tab[p21][7] = 1; tab[p22][7] = 1;

a = a + x; if (a < 0 || a > 7) {   x = -1 * x;    a = a + 2*x; }

b = b + y; if ((b < 1   || b > 6) && (tab[a][b] == 1 || tab[a-x][b] == 1)) {

y = -y; b = b + 2*y;

} else if (b == 0 || b == 7 ) {  vivo = false; while (!(vivo)) {    morto; } } tab[a][b] = 1;

for (i = 0; i < 8; i++) {   for (j = 0; j < 8; j++) {     if (tab[i][j] == 1) {      lc.setLed(0,i,j,true); } else {       lc.setLed(0,i,j,false); }   }  }  tab[a][b] = 0;

delay(100); }

code

**Resultados:**

 * SNAKE:**



=Snake:= media type="youtube" key="mea35Pcgnx8" width="560" height="315"

=Pong:= media type="youtube" key="Mj5HB_zQAMU" width="560" height="315"

**Conclusão:**
Com os conhecimentos adquiridos na aula de laboratório de programação, implementamos através do uso de um Arduino, jogos de 8 bits ( Snake e Pong) com a saída em uma matriz de leds 8x8. Com o auxílio de um joystick criado por outro grupo do semestre passado, é possível a interação com o jogo, permitindo que o usuário mova a cobra ou a plataforma conforme o desejado, realizando assim o objetivo do jogo. O jogo Pong não esta completamente funcional devido ao tempo curto em que o desenvolvemos, visto que foi necessário mudar completamente de projeto faltando cerca de um mês para o término das aulas. No entanto, no jogo Snake, todos os ajustes necessários foram feitos e está completamente funcional.

#include "LedControl.h"

LedControl lc=LedControl(4,5,6,1); //Pins: DIN,CLK,CS, # of Display connected//

//bool inicio = false;// //int i, j;// //int controle = 0;// //int a = 0;// //int b = 0;// //int bolinhai, bolinhaj;// //boolean bolinhaon = false;// //int vivo = 1;// //int tamanho = 1;// //int velocidade = 400;// //byte vixe;// //void setup {// //lc.shutdown(0,false);// //lc.setIntensity(0,0.5);// //Serial.begin(9600);// //randomSeed(analogRead(A0));//

//}// //typedef struct tabuleiro {// //boolean ligado = false;// //boolean bolinha = false;// //int nivel = 0;// //} tabuleiro;//

//tabuleiro tab[8][8];//

//void spawnBolinha// //{// //bolinhai = random(0, 7);// //bolinhaj = random(0, 7);// //if(tab[bolinhai][bolinhaj].ligado == true)// //spawnBolinha;// //tab[bolinhai][bolinhaj].ligado = true;// //tab[bolinhai][bolinhaj].bolinha = true;// //bolinhaon = true;// //}//

//byte deadd[] = { B01111100,// //B01111110,// //B01100110,// //B01100110,// //B01100110,// //B01100110,// //B01111110,// //B01111100// //};// //byte deade[] = { B01111110,// //B01111110,// //B01100000,// //B01111110,// //B01111110,// //B01100000,// //B01111110,// //B01111110// //};// //byte deada[] = { B01111110,// //B01111110,// //B01100110,// //B01100110,// //B01111110,// //B01111110,// //B01100110,// //B01100110// //};//

//void movimento(int controle)// //{// //if(controle == 8){// //b = b -1;//esquerda inicio = true; }else if(controle == 9){ a = a - 1; //cima// //inicio = true;// //}else if(controle == 10){// //b = b + 1;//direita inicio = true; }else if(controle == 11){ a = a + 1; //baixo// //inicio = true;// //}// //}// //void recebeComando// //{// //if(digitalRead(8) == HIGH){// //controle = 8;// //inicio = true;// //}else if(digitalRead(9) == HIGH){// //controle = 9;// //inicio = true;// //}else if(digitalRead(10) == HIGH){// //controle = 10;// //inicio = true;// //}else if(digitalRead(11) == HIGH){// //controle = 11;// //inicio = true;// //}// //}//

//void morto// //{// //for (i = 0; i < 8; i++)// //{// //lc.setRow(0,i,deadd[i]);// //}// //delay(500);// //for (i = 0; i < 8; i++)// //{// //lc.setRow(0,i,deade[i]);// //}// //delay(500);// //for (i = 0; i < 8; i++)// //{// //lc.setRow(0,i,deada[i]);// //}// //delay(500);// //for (i = 0; i < 8; i++)// //{// //lc.setRow(0,i,deadd[i]);// //}// //delay(500);// //for (i = 0; i < 8; i++)// //{// //lc.setRow(0,i,B000000);// //}// //delay(500);// //}//

//byte saida;// //void jogo// //{//

//movimento(controle);// //if ((a < 0 || a > 7) || (b < 0 || b > 7))// //{// //vivo = 0;// //} else {// //if (bolinhaon == false)// //spawnBolinha;// //tab[a][b].ligado = true;// //if (a == bolinhai && b == bolinhaj)// //{// //if ((tamanho % 5) == 0)// //velocidade = velocidade - 30;// aumenta velocidade da cobra a cada 5 bolinhas tamanho++; tab[a][b].bolinha = false; bolinhaon = false; for (i = 0; i < 8; i++) { for (j = 0; j < 8; j++) { if (tab[i][j].nivel > 0) tab[i][j].nivel++; } } } if (tab[a][b].nivel > 0){ vivo = 0; } else { tab[a][b].nivel = tamanho;

for (i = 0; i < 8; i++) { for(j = 0; j < 8; j++) { if (tab[i][j].ligado == true && tab[i][j].bolinha == 0) tab[i][j].nivel--; if (tab[i][j].nivel < 0) tab[i][j].ligado = false; if(tab[i][j].ligado == true || tab[i][j].bolinha == true) { lc.setLed(0,i,j,true); } else { lc.setLed(0,i,j,false); } } } delay(velocidade); } } } void loop {

recebeComando; if (vivo != 0){ jogo; } else { morto; if(digitalRead(10) == HIGH){ //se segurar botão para direita, reseta o jogo.// //vivo = 1;// //tamanho = 1;// //bolinhaon = false;// //for (i = 0; i < 8; i++)// //{// //for (j = 0; j < 8; j++)// //{// //tab[i][i].ligado = false;// //tab[i][j].bolinha = false;// //tab[i][j].nivel = 0;//

lc.setLed(0,i,j,false); } } a = 1; b = 2; velocidade = 400; }

}

}