Como criar um Genius

Neste tutorial será mostrando como criar um jogo da memória no formato Genius através da placa Intel Galileo na plataforma Arduino. Para esse projeto serão necessários:

  • 4 botões
  • 4 leds (vermelho, amarelo, verder e azul)
  • Speaker
  • Intel Galileo ou podendo ser também com uma placa – Arduino Uno
  • protoboard
  • 8 resistores de 220ohms

genius1

Conexão dos botões
O circuito necessário para ligar os botões da protoboard à placa é composto por um resistor ligado à perna direita do botão (lardo esquerdo do resistor) com ligação direta à porta da placa e, no lardo direito no resistor, ao circuito que será ligado à porta GND (ground/terra). Já na perna esquerda do botão haverá uma ligação para um circuito que, por sua vez, será ligado na entrada 5V, como ilustrado na figura abaixo:
genius2

Conexão dos LEDS
Já o circuito necessário para os leds é composto por um resistor, ligado na parte positiva do led (ânodo), que possui uma superfície circular:
genius3

Já a superfície plana será ligada a um circuito que será conectado ao GND, como mostrado na figura abaixo:
genius4

Conexão do Speaker
A conexão do speaker é a mais simples. Trata-se apenas de uma conexão direta com uma entrada livre na placa e uma no circuito que será ligado no GND.
genius5

Lógica de Programação
O funcionamento básico de um genius consiste em uma estrutura de memória (vetor, array ou lista) que guarde uma sequência de sinais de som e luz (um dos LEDs é acesso) geradas aleatoriamente. A cada rodada o programa espera o jogador digitar um numero de botões. Se ele acertar, na rodada seguinte serão adicionados novos sinais de som e luz à sequência. Se ele errar, o jogo voltará ao início.

//Inicialmente definimos um valor inteiro 
//como intensidade de cada som relacionando-o a uma cor
//Após isso, agrupamo-os em um array de 4 elementos
//Por fim, definimos um novo array com 100 elementos 
//que servirá como uma lista que conterá a sequência 
//de notas geradas
//O tamanho da array da sequência é livre, 
//de preferência ponha um valor alto que seja difícil de alcançar

#define NOTA_AZUL  200
#define NOTA_AMARELA 300
#define NOTA_VERMELHA  400
#define NOTA_VERDE  500

#define BOTAO_AZUL 4
#define BOTAO_AMARELO 2
#define BOTAO_VERMELHO 3
#define BOTAO_VERDE 5

#define PINO_AUDIO 7

#define LED_AZUL 10
#define LED_AMARELO 8
#define LED_VERMELHO 9
#define LED_VERDE 11


int listaSons[4]={NOTA_AZUL,NOTA_AMARELA,NOTA_VERMELHA,NOTA_VERDE};
int sequencia[100] = {};
 
//A variavel rodada atual sera utilizada pelas funções do programa
//para diversos fins, inclusive saber quantos cliques serão 
//necessários em cada rodada.
//O passo atual na sequencia define qual a posição do item na
//lista de sequencia correspondente ao clique no momento
//resultadoJogada indica se voce perdeu ou venceu a rodada anterior
int rodada_atual = 0;
int posicaoSequencia = 0;
int resultadoJogada = 0;

//As variaveis a seguir indicam quais as posicoes em que os 
//pinos de botoes, leds e audio estao conectados a placa 
int pinoAudio = 7;
int pinosLeds[4] = { 8, 9, 10, 11 };
int pinosBotoes[4] = { 2, 3, 4, 5 }; 


void setup() {
  
   Serial.begin(9600);

  //Este loop define que todos os leds/audio são outputs e
  // todos os botoes são inputs
  for (int i = 0; i <= 3; i++) {

    pinMode(pinosLeds[i], OUTPUT);
    pinMode(pinosBotoes[i], INPUT);

  } 
  pinMode(pinoAudio, OUTPUT);   
  tocarSomDeInicio(500);

}
 
void loop() {

  //Se perdeu o jogo reinicializamos todas as variáveis.
  //Será sempre emitido um som pra indicar o início da rodada,
  //o parametro dessa função é o tempo de delay dado entre 
  //os toques e o inicio da partida

  if (resultadoJogada == 0) {

    int sequencia[100] = {};

    rodada_atual = 0;
    posicaoSequencia = 0;
    resultadoJogada = 0;
    
    tocarSomDeInicio(200);
  }

  // Chama a função que inicializa a próxima rodada.

  iniciarRodada();
  delay(1000);
  
  
}

//Sorteia uma nota e adicionar na lista de sequencias
//o resultado da rodada e posicao na sequencia das notas são zerados
//A variável rodada_atual aumentará 1 posicao
//O programa entra em loop esperando que o resultado "Perdeu" 
//ou "Acertou" apareçam

void iniciarRodada() {
	
	resultadoJogada = 2;	
	posicaoSequencia = 0;
	rodada_atual +=1;
	int numeroSorteado = random(0, 4);
	sequencia[rodada_atual] = numeroSorteado;
	  
	reproduzirSequencia();
	  
	while(resultadoJogada == 2){
	   aguardarJogada();
	}  

} 

// Reproduz a sequência para ser memorizada.

void reproduzirSequencia() {
  for (int i = 0; i < rodada_atual; i++) {

    tone(pinoAudio, listaSons[sequencia[i]]);

    digitalWrite(pinosLeds[sequencia[i]], HIGH);
    delay(500);

    noTone(pinoAudio);

    digitalWrite(pinosLeds[sequencia[i]], LOW);
    delay(100);

  }

  noTone(pinoAudio);

}

//toca o audio e acende o led selecionados pelo tempo correspondente
void tocarLed(int som, int led,int time){
    tone(pinoAudio, som);
    digitalWrite(led, HIGH);
    delay(time);
    digitalWrite(led, LOW);
    noTone(pinoAudio);
	
}


//Verifica a cada instante se algum botao foi pressionado
//Se foi, ele tocará o som e acenderá o led correspondente
//ao clique realizado. Depois disso, verificará se
//a jogada está correta
void aguardarJogada() {    

    if (digitalRead(BOTAO_AZUL) == HIGH) {
		
	tocarLed(NOTA_AZUL,LED_AZUL,200);
        verificarJogada(2);

	}
      
    else if (digitalRead(BOTAO_AMARELO) == HIGH) {
		
	tocarLed(NOTA_AMARELA,LED_AMARELO,300);
        verificarJogada(0);

    }

    else if (digitalRead(BOTAO_VERDE) == HIGH) {
		
	tocarLed(NOTA_VERDE,LED_VERDE,400);
        verificarJogada(3);

    }
    
    else if (digitalRead(BOTAO_VERMELHO) == HIGH) {
		
	tocarLed(NOTA_VERMELHA,LED_VERMELHO,500);
        verificarJogada(1);

    }
    
    delay(10);
}

//Verifica se o botaoPressionado corresponde ao som que está 
//presente na array sequencia
//Se não for, tocará o som de game over e trocará o valor 
//de "resultadoJogada" pra "Perdeu" (encerrando o loop 
//níveis acima)
//Se for, aumentará em 1 o valor da variavel posicaoSequencia. 
//Caso seja a ultima rodada ele alterará o valor 
//de "resultadoJogada" para "Acertou" (encerrando o loop 
//níveis acima)
void verificarJogada(int botaoPressionado){
  
  Serial.println("verificacao");
  if (sequencia[posicaoSequencia] != botaoPressionado) {
    	
	TocarsomGameOver(200); 
	resultadoJogada = 0;
  }
  
  else{
  	
  	posicaoSequencia +=1;
  	
  	if (posicaoSequencia == rodada_atual){
  		
  	    resultadoJogada = 1;
  		
	}

  delay(100);
  }

}
 
void tocarSomDeInicio(int time) {

  tone(pinoAudio, listaSons[0]);
  
  for (int i = 0; i <= 3; i++) {
      digitalWrite(pinosLeds[i], HIGH);
      
  }

  delay(time);

  for (int i = 0; i <= 3; i++) {
      digitalWrite(pinosLeds[i], LOW);
      
  }
  delay(time);
  noTone(pinoAudio);
}


void TocarsomGameOver(int time){
   for (int i = 0; i <= 3; i++) {
      tone(pinoAudio, listaSons[i]);
      digitalWrite(pinosLeds[i], HIGH);

      delay(time);

      digitalWrite(pinosLeds[i], LOW);
      noTone(pinoAudio);
    }

    tone(pinoAudio, listaSons[3]);

    for (int i = 0; i <= 3; i++) {

      digitalWrite(pinosLeds[0], HIGH);
      digitalWrite(pinosLeds[1], HIGH);
      digitalWrite(pinosLeds[2], HIGH);
      digitalWrite(pinosLeds[3], HIGH);

      delay(time/2);
      digitalWrite(pinosLeds[0], LOW);
      digitalWrite(pinosLeds[1], LOW);
      digitalWrite(pinosLeds[2], LOW);
      digitalWrite(pinosLeds[3], LOW);

      delay(time/2);

    }

    noTone(pinoAudio);
}

No final, seu projeto terá mais ou menos essa cara:
genius6

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s