Criando Jogos com Arduino: Passo a Passo

Carol Correia Viana · Capítulo 12 de 16

Páginas do PDF

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