Jogo Whack-a-Mole com LEDs e Arduino Uno – Projeto Interativo com Joystick
Componentes e Materiais
- Arduino UNO – 1 unidade
- LEDs – 7 unidades
- Resistor 221 ohm – 7 unidades
- Joystick Analógico (Genérico) – 1 unidade
- Jumpers (genéricos) – 8 unidades
- Jumpers Macho/Fêmea – 4 unidades
Sobre o Projeto
Este foi meu primeiro projeto com Arduino, construído com base no que aprendi nos tutoriais iniciais sobre LEDs e controles básicos.
Este jogo "Whack-a-Mole" usa 7 LEDs e um joystick. Existem 4 "toupeiras", representadas pelo 2º, 3º, 4º e 5º LEDs da esquerda na minha placa. Um dos quatro LEDs acende aleatoriamente e dá um tempo definido para acertar a direção correspondente no joystick. Organizei meus LEDs de forma que, da esquerda para a direita, as seleções no joystick são: esquerda, cima, baixo, direita. Esta é apenas a convenção que escolhi; seja criativo e experimente outras!
Os dois LEDs à esquerda são vermelho e verde, indicando escolha incorreta ou correta. O LED amarelo à extrema direita pisca a contagem do recorde atual e indica a pontuação sempre que uma rodada termina (quando uma escolha errada é feita). Naturalmente, um novo recorde substitui o antigo.
Talvez a parte mais complicada seja o joystick analógico. Para ambas as direções, os valores máximos são 0 e 1024 (no meu caso, usei 1023; se não estiver obtendo as seleções corretas, tente esse valor). Acredito que esses valores podem ser medidos usando o monitor serial. Simplifiquei esses valores de entrada usando switch para os eixos X e Y. Não sei se é a melhor forma, mas como só precisava dos valores máximos de cada direção (ou seja, apenas 4 opções, 4 LEDs toupeira), atribui valores inteiros a cada possibilidade: 1, 2, 3, 4 correspondendo a Esquerda, Direita, Cima, Baixo.

Os níveis de dificuldade que escrevi no código como constantes são o tempo em milissegundos que a pessoa tem para fazer a seleção. Você pode alterar esses tempos para mudar a dificuldade. Pensei em integrar uma escolha usando botões ou talvez o joystick no início de uma rodada, mas não valeu o trabalho, pois seria complicado e não muito amigável.
Por favor, avise quais modificações e melhorias podem ser feitas! :)
Código
WhackALED Arduino
// Whack a LED
// Variáveis do Joystick
int sX = A0; // eixo x do joystick, entrada analógica
int sY = A1; // eixo y do joystick, entrada analógica
int sSX; // estado de x, leitura de sX
int sSY; // estado de y, leitura de sY
int sS; // estado convertido (pode não ser o mais eficiente)
// Variáveis do Jogo
int rNum; // int aleatório escolhendo o LED a acender
int wins = 0; // contagem de vitórias consecutivas
int highScore = 0; // maior pontuação de vitórias consecutivas
// Constantes de dificuldade, tempo para reagir
const int easy = 1000;
const int medium = 500;
const int hard = 325;
const int stupid = 250;
int ledPins[] = {5, 2, 4, 3, 6, 7, 8}; // pinos dos LEDs
int pinCount = 7; // número de pinos de LED
void setup() {
Serial.begin(9600);
pinMode(sX, INPUT);
pinMode(sY, INPUT);
for (int thisPin = 0; thisPin < pinCount; thisPin++) {
pinMode(ledPins[thisPin], OUTPUT);
}
}
void loop() {
rNum = random(4); // gerando escolha aleatória
delay(1000);
digitalWrite(ledPins[rNum], HIGH); // acende o LED escolhido
delay(stupid); // dificuldade
// Leitura do joystick
sSX = analogRead(sX); // leitura eixo x
delay(100);
sSY = analogRead(sY); // leitura eixo y
// Convertendo entradas x e y para 4 possibilidades. 0 e 1023 são os valores máximos em cada eixo do joystick, conforme medido.
sS = 0;
switch (sSX) {
case 0: sS = 1; // Esquerda break;
case 1023: sS = 2; // Direita break;
}
switch (sSY) {
case 0: sS = 3; // Cima break;
case 1023: sS = 4; // Baixo break;
}
digitalWrite(ledPins[rNum], LOW); // apaga o LED selecionado após a escolha do joystick
if (sS - 1 == rNum) { // verifica se o usuário inseriu a direção correta do LED aceso
wins++;
for (int k = 0; k <= 3; k++) { // pisca LED verde indicando acerto
digitalWrite(ledPins[4], HIGH); delay(50);
digitalWrite(ledPins[4], LOW); delay(50);
}
} else {
if (wins > highScore) { // se vitórias consecutivas > recorde anterior, novo recorde
highScore = wins;
wins = 0;
}
for (int i = 0; i <= 3; i++) { // pisca LED vermelho indicando erro
digitalWrite(ledPins[5], HIGH); delay(50);
digitalWrite(ledPins[5], LOW); delay(50);
}
for (int w = 0; w < highScore; w++) { // exibe recorde piscando LED amarelo
digitalWrite(ledPins[6], HIGH); delay(200);
digitalWrite(ledPins[6], LOW); delay(200);
}
}
}
Esquemático
Tudo deve corresponder à foto real do projeto, exceto o joystick. Meu joystick tem 5 pinos, 4 dos quais usei: nomeados de cima para baixo "GND", "+5V", "VRx" e "VRy". "GND" e "+5V" conectados a GND e 5V no Arduino, "VRx" e "VRy" conectados a A0 e A1.


Processo de manufatura
- Lanternas a Gás: Evolução, Design e Fabricação Moderna
- Ponteiro Laser: Design, Fabricação e Visão Geral de Segurança
- Lanterna: Da Invenção à Inovação Moderna
- O Caleidoscópio: Da Ciência de Brewster ao Design Moderno
- Lasers de Semicondutor: Geração de Luz de Precisão para Tecnologia Moderna
- A Arte e Ciência dos Processos Fotográficos: Dos Daguerreótipos ao Filme Moderno
- Semáforos: Engenharia, História e Inovações Futuras
- Diodos Emissores de Luz: Da Incepção a Vida Útil de 100 Anos
- Dominando Acessórios para Fitas LED: Conecte, Controle e Personalize Sua Iluminação
- Painel do Carro: Luzes, Indicadores e Seus Significados