Criando Jogos com Arduino: Passo a Passo
4.Criando Jogos com Arduino
CRIANDO JOGOS COM ARDUINO
STOP – UM JOGO COM LEDS
O STOP é um jogo simples feito com LEDs. Neste jogo, os LEDs ligam
e desligam um após o outro e o jogador deve atingir o objetivo de pressionar o
botão no exato momento em que o LED do meio estiver aceso. À medida que
o jogador consegue atingir o objetivo ele passará de nível e os LEDs piscam
com maior velocidade.
MATERIAIS NECESSÁRIOS
1 x Placa UNO SMD R3 Atmega328 compatível com Arduino UNO ;
1 x Cabo USB ;
1 x Protoboard ;
11 x LEDs difusos de 5 mm ;
11 x Resistores de 220 Ω ;
1 x Resistores de 10 kΩ ;
1 x Botões do tipo push button ;
ESQUEMÁTICO DE LIGAÇÃO DOS COMPONENTES
Monte o circuito conforme a Figura 23 utilizando a protoboard, os
LEDS, o botão, os resistores e os fios.
Ao montar o circuito na protoboard preste atenção nos seguintes pontos:
Os terminais mais longos dos LEDs encontram-se conectados aos pinos
Digitais de 2 a 13. Estes terminais longos são os ânodos (positivos) dos
LEDs e devem ser conectados na alimentação de 5V, neste caso
representado pelos pinos digitais. Os terminais mais curtos são os
cátodos (negativos) e devem ser conectados ao terra (GND);
Vamos conectar o botão com um resistor de 10 k Ω pull-down (resistor
conectado no GND). Desta forma, quando o botão estiver pressionado a
placa UNO retornará nível lógico alto (HIGH) no pino digital 13.
Figura 23 - Circuito para STOP – Um Jogo com LEDs.
ELABORANDO O CÓDIGO
Com o circuito montado vamos a programação do jogo. Para melhor
compreensão o código será explicado passo-a-passo a seguir. Neste momento,
observe o código abaixo e aproveite para analisar sua estrutura.
int tempo = 600; //Tempo de acionamento do LED
int nivel = 0; // Variável para armazenar o nível do jogador
void setup ()
{
Serial . begin (9600); //Inicialização da comunicação serial pinMode (13, INPUT ); //Define o pino digital 13 (botão) como entrada
//Configura os pinos em que os LEDs estão conectados como saída
pinMode (12, OUTPUT );
pinMode (11, OUTPUT );
pinMode (10, OUTPUT );
pinMode (9, OUTPUT );
pinMode (8 , OUTPUT );
pinMode (7, OUTPUT );
pinMode (6, OUTPUT );
pinMode ( 5, OUTPUT );
pinMode (4, OUTPUT );
pinMode (3, OUTPUT );
pinMode (2, OUTPUT );
Serial . print ( "Nivel -> " ); //Imprime na serial "Nivel -> " Serial . println (nivel); //Imprime na serial o valor de nível
}
void loop ()
{
for ( int x = 2; x <= 12; x++) { //Inicializa x = 2, enquanto x for menor ou igual a 12, incrementa x
em 1
digitalWrite (x, HIGH ); //Coloca o LED x em nível alto delay (tempo); //Intervalo de 600 milissegundos (tempo)
if ( digitalRead (13) == 1) { //Se a leitura do pino 13 (botão) for igual a 1
while ( digitalRead (13)); //Enquanto o botão estiver pressionado o jogo fica travado if (x == 7) { //Se x for igual a 7 (pino do led azul)
nivel = nivel + 1; //Acrescenta nivel em 1 Serial . print ( "Nivel -> " ); //Imprime na serial "Nivel -> " Serial . println (nivel); //Imprime na serial o valor de nível tempo = tempo - 100; //Diminui tempo em 100 milissegundos
} else { //Senão
Serial . println ( "GAME OVER" ); //Imprime na serial "GAME OVER" game_over(); //Chama a função game_over() tempo = 600; //Retorna tempo = 600
x = 2; //Retorna x =2
nivel = 0; //Retorna nivel = 0
Serial . print ( "Nivel -> " ) ; //Imprime na serial "Nivel -> " Serial . println (nivel); //Imprime na serial o valor de nível
}
}
digitalWrite (x, LOW ); //Coloca o LED x em nível baixo
}
for ( int x = 12; x >= 2; x--) { //Inicializa x = 2, enquanto x for maior ou igual a 12, decrementa x
em 1
digitalWrite (x, HIGH ); //Coloca o LED x em nível alto delay (tempo); //Intervalo de 600 milissegundos (tempo) digitalWrite (x, LOW ); //Coloca o LED x em nível baixo
if ( digitalRead (13) == 1) { //Se a leitura do pino 13 (botão) for igual a 1
while ( digitalRead (13)); //Enquanto o botão estiver pressionado o jogo fica travado if (x == 7) { //Se x for igual a 7 (pino do led azul)
nivel = nivel + 1; //Acrescenta nivel em 1 Serial . print ( "Nivel -> " ); //Imprime na serial "Nivel -> " Serial . println (nivel); //Imprime na serial o valor de nível tempo = tempo - 100; //Diminui tempo em 100 milissegundos
} else { //Senão
Serial . println ( "GAME OVER" ); //Imprime na serial "GAME OVER" game_over(); //Imprime na serial "GAME OVER" tempo = 600; //Retorna tempo = 600
x = 12; //Retorna x = 12
nivel = 0; //Retorna nível = 0
Serial . print ( "Nivel -> " ); //Imprime na serial "Nivel -> " Serial . println (nivel); //Imprime na serial o valor de nível
}
}
digitalWrite (x, LOW ); //Coloca o LED x em nível baixo
}
}
//Função game_over()
void game_over()
{
for ( int j = 0; j < 4; j++) //Inicializa j = 0, enquanto j for menor que 4, decrementa j em 1
for ( int x = 2; x <= 12; x++) { //Inicializa x = 2, enquanto x for maior ou igual a 12, decrementa x
em 1
digitalWrite (x, HIGH ); //Coloca o LED x em nível alto digitalWrite (14 - x, HIGH ); //Coloca o LED 14 - x em nível alto delay (100); //Intervalo de 100 ms
digitalWrite (x, LOW ); //Coloca o LED x em nível baixo digitalWrite (14 - x, LOW ) ; //Coloca o LED 14 - x em nível baixo
}
}
Para melhor compreensão do código acompanhe os seguintes passos:
1- Declarar as variáveis
Neste código declaramos duas variáveis: temp o , inicializada em 600,
para determinar o tempo de acionamento dos LEDs; e nive l para armazenar o
nível que o jogador está.
2- Inicialização da comunicação serial e configuração das portas de
entrada e saída
A comunicação serial foi inicializada por meio da instrução: Serial .
begin (9600) ; .
O pino digital 13, em que o botão está conectado, foi configurado como
entrada ( INPU T ) e os demais (pinos de 2 a 12) foram configurados como
saída ( OUTPU T ).
3- Ligar e desligar os LEDs sequencialmente – Ordem crescente
Iniciamos o loop ( ) com a estrutura de repetição for para fazer o
acionamento sequencial dos LEDs, iniciando do LED da porta digital 2 e
finalizando no LED da porta digital 12.
4- Realizar a leitura do botão
Em seguida, realizamos a leitura do botão e verificamos se o valor lido
é igual a 7, porta digital em que o LED azul encontra-se conectado. Caso esta
condição seja verdadeira, o jogador conseguiu atingir o LED azul e o nível do
jogo será aumentado. Senão, o jogador não alcançou o LED azul, perdendo o
jogo.
5- Ligar e desligar os LEDs sequencialmente – Ordem decrescente
De forma semelhante à etapa 3, usaremos a estrutura de repetição for
para ligar e desligar os LEDs sequencialmente, iniciando do LED da porta 12
e finalizando no LED da porta 2.
6- Realizar a leitura do botão
Novamente realizamos a leitura do botão para verificar se o jogador
atingiu o LED 7.
7- Função Game Over
A função gameover( ) foi criada para criar um efeito nos LEDs quando
o jogador perde o jogo. Assim, quando o jogador não consegue alcançar o
LED azul está função é chamada.
TINKERCAD