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
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:
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:
Já a superfície plana será ligada a um circuito que será conectado ao GND, como mostrado na figura abaixo:
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.
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); }