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);
}


