Juego Whack-a-Mole con LEDs y Arduino Uno: Proyecto interactivo con joystick
Componentes y materiales
| Arduino UNO | × | 1 |
| LEDs | × | 7 |
| Resistencia 221 ohm | × | 7 |
| Joystick analógico (genérico) | × | 1 |
| Cables jumper (genéricos) | × | 8 |
| Cables jumper Macho/Hembra | × | 4 |
Sobre este proyecto
Este fue mi primer proyecto con Arduino, lo construí basándome en lo que aprendí de los primeros tutoriales sobre LEDs y controles básicos.
Este juego "Whack-a-Mole" (Golpea al topo) utiliza 7 LEDs y un joystick. Hay 4 "topos", representados por el 2º, 3º, 4º y 5º LED desde la izquierda en mi placa. Uno de los cuatro LEDs se enciende aleatoriamente y da un tiempo determinado para pulsar la dirección correspondiente en el joystick. He dispuesto mis LEDs de forma que, de izquierda a derecha, las selecciones del joystick son: izquierda, arriba, abajo, derecha. Esta es solo la convención que elegí, ¡así que sean creativos y prueben otras!
Los dos LEDs de la izquierda son rojo y verde, que indican elección incorrecta o correcta. El LED amarillo del extremo derecho parpadea la cuenta del récord actual (high score) y lo indica cada vez que termina una partida (cuando se hace una elección incorrecta). Naturalmente, un nuevo récord reemplaza al anterior.
Quizás la parte más complicada es el joystick analógico. Para ambas direcciones del joystick, hay valores máximos de 0 y 1024 (en el mío tuve que usar 1023, así que si no obtienen las selecciones correctas, pueden probar eso). Creo que estos valores pueden medirse también usando el monitor serial. Simplifiqué estos valores de entrada usando sentencias switch para ambas entradas X e Y. No estoy seguro si es la mejor forma, pero como solo necesitaba los valores máximos de cada dirección (4 opciones, 4 LEDs topos) asigné valores enteros a cada posibilidad: 1, 2, 3, 4 correspondientes a Izquierda, Derecha, Arriba, Abajo.

Los niveles de dificultad que he escrito en el código como constantes son el tiempo en milisegundos que la persona tiene para hacer una selección. Pueden jugar con estos tiempos para cambiar la dificultad a su preferencia. Pensé en integrar una elección usando botones o tal vez el joystick al inicio de cada turno, pero no valía la pena el trabajo ya que sería bastante complicado y no muy amigable para el usuario.
¡Por todos los medios, hágameme saber qué modificaciones y mejoras se pueden hacer! :)
Código
WhackALED (Arduino)
// Whack a LED - Juego Whack-a-Mole con LEDs y joystick
// Variables del joystick
int sX = A0; // eje X joystick, entrada analógica
int sY = A1; // eje Y joystick, entrada analógica
int sSX; // estado de X, lectura de sX
int sSY; // estado de Y, lectura de sY
int sS; // estado convertido
// Variables del juego
int rNum; // número aleatorio para elegir LED
int wins = 0; // contador de aciertos consecutivos
int highScore = 0; // mejor puntuación
// Constantes de dificultad (tiempo de reacción en ms)
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}; // pines de los LEDs
int pinCount = 7; // número de pines
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); // elección aleatoria 0-3
delay(1000);
digitalWrite(ledPins[rNum], HIGH); // enciende LED aleatorio
delay(stupid); // dificultad (cambiar por easy/medium/hard)
// Lectura del joystick
sSX = analogRead(sX);
delay(100);
sSY = analogRead(sY);
// Convertir entradas X e Y a 4 posibilidades (0 y 1023 son valores máximos)
sS = 0;
switch (sSX) {
case 0: sS = 1; break; // Izquierda
case 1023: sS = 2; break; // Derecha
}
switch (sSY) {
case 0: sS = 3; break; // Arriba
case 1023: sS = 4; break; // Abajo
}
digitalWrite(ledPins[rNum], LOW); // apaga LED tras la elección
if (sS - 1 == rNum) { // ¿elección correcta?
wins++;
for (int k = 0; k <= 3; k++) { // parpadeo verde (acierto)
digitalWrite(ledPins[4], HIGH);
delay(50);
digitalWrite(ledPins[4], LOW);
delay(50);
}
} else { // elección incorrecta
if (wins > highScore) {
highScore = wins; // nuevo récord
}
wins = 0;
for (int i = 0; i <= 3; i++) { // parpadeo rojo (fallo)
digitalWrite(ledPins[5], HIGH);
delay(50);
digitalWrite(ledPins[5], LOW);
delay(50);
}
for (int w = 0; w < highScore; w++) { // muestra récord en LED amarillo
digitalWrite(ledPins[6], HIGH);
delay(200);
digitalWrite(ledPins[6], LOW);
delay(200);
}
}
}
Esquemático
Todo debe coincidir con la foto real del proyecto excepto el joystick. Mi joystick tiene 5 pines, 4 de los cuales he usado: de arriba a abajo "GND", "+5V", "VRx" y "VRy". "GND" y "+5V" conectados a GND y 5V del Arduino, "VRx" y "VRy" a A0 y A1.


Proceso de manufactura
- Faroles de Gas: Evolución, Diseño y Fabricación Moderna
- Puntero Láser: Diseño, Fabricación y Resumen de Seguridad
- Linterna: de su invención a la innovación moderna
- El Caleidoscopio: De la Ciencia de Brewster al Diseño Moderno
- Láseres de Semiconductor: Generación Precisa de Luz para Tecnología Moderna
- El arte y la ciencia de los procesos fotográficos: del daguerrotipo al film moderno
- Semáforos: Ingeniería, Historia e Innovaciones Futuras
- Diodos Emisores de Luz (LED): Desde sus Inicios a Vidas de 100 Años
- Descifrando el Cuadro de Mandos de tu Coche: Luces, Testigos y Qué Significan
- Accesorios para Tiras LED: Conecta, Controla y Personaliza tu Iluminación
- Análisis técnico de una bombilla LED inteligente Sengled: despiece y revisión de conectividad Zigbee