Juego Ruleta LED DIY: Crea un Arcade para Una Persona con Arduino Nano
Componentes y suministros
| LED (genérico) - 6 rojos, 2 amarillos, 1 verde | × | 9 |
| Pulsador SparkFun 12mm | × | 1 |
| Arduino Nano R3 | × | 1 |
| Conector hembra 8 posiciones 1 fila (0.1") | × | 1 |
| Conector jack DC | × | 1 |
Herramientas y máquinas necesarias
- Router CNC
Aplicaciones y servicios online
- Arduino IDE
Sobre este proyecto
Video
(Video no disponible en texto)
Resumen
Llevaba tiempo queriendo crear un juego simple y divertido que solo requiriera una persona. Es extremadamente simple, solo necesita un Arduino Nano. Es ruleta LED. El objetivo: detenerse en el LED verde, evitando rojos y amarillos. Parece fácil de jugar y hacer, y lo es.
Paso 1
Primero diseñé el dispositivo en Fusion 360. Diseñé la placa frontal con 9 LEDs (6 rojos, 2 amarillos, 1 verde) y hueco para pulsador táctil abajo. Usé mi router CNC Millright para cortar las piezas diseñadas.
Paso 2
Mecánica del juego: Una luz "se mueve" de un lado a otro entre los dos bordes y se detiene al pulsar el botón. Para reacción inmediata usé una interrupción. Cada LED corresponde a un índice en array que se recorre. El índice del LED actual tiene su propia variable. Hay un retraso entre cada paso, correspondiente a la dificultad. Al encender, el usuario selecciona dificultad pulsando botón para reducir retraso entre cambios de LED. Tras encender LED correcto, el usuario puede doble clic para confirmarlo.
Paso 3
Usé lija para dar buen acabado y redondear piezas de contrachapado. Luego usé pegamento caliente para unir las piezas.
Conclusiones
Ahora, cuando tengo ganas de jugar un juego simple, ya sea de viaje o para desconectar de pantallas, este dispositivo me da un respiro maravilloso. También puedo hacerlo multijugador asignando puntos a cada LED lejos del verde: quien tenga menos puntos al final gana.
Código
Código C/C++
/* Usa pines 2-10
Puedes conseguir la librería TTBOUNCE aquí: https://github.com/TOLDOTECHNIK/TTBOUNCE */
#include <TTBOUNCE.h>
int delay_time = 0;
const uint8_t led_array[9] = {4,3,5,6,7,8,9,10,11};
const uint8_t button = 2;
uint8_t difficulty = 0;
uint8_t current_led = 0;
bool dir_flag = true; // true = derecha, false = izquierda
bool game_ended = false;
bool is_win = false;
bool is_finished_selecting = false;
TTBOUNCE b = TTBOUNCE(button);
void doubleClick(){
Serial.println("double click");
is_finished_selecting = true;
delay_time = floor(500/(difficulty+1));
// Fórmula: delay (ms) = 500 / (difficulty + 1)
Serial.println("difficulty: " + String(delay_time));
sweep();
}
void click(){
Serial.print("Click | ");
digitalWrite(led_array[difficulty], LOW);
difficulty++;
if(difficulty>8){ difficulty = 0; }
digitalWrite(led_array[difficulty], HIGH);
Serial.println("Difficulty is: "+String(difficulty));
delay(100);
}
void setup() {
Serial.begin(9600);
b.attachDoubleClick(doubleClick);
b.attachClick(click);
b.setActiveLow();
b.enablePullup();
for(int i=0;i<9;i++){
pinMode(led_array[i], OUTPUT);
}
sweep();
pulse();
difficulty = 0;
digitalWrite(led_array[difficulty], HIGH);
while(!is_finished_selecting){
b.update();
}
b.update();
pinMode(button, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(button), button_pressed, FALLING);
delay(1000);
}
void loop() {
if(game_ended==false){
move_led();
delay(delay_time);
} else if(game_ended){
Serial.println(game_ended);
Serial.println("Game over");
if(is_win){
Serial.println("you won");
for(int i=0; i<5;i++){
pulse();
delay(100);
}
}
sweep();
game_ended = false;
is_win = false;
delay(2000);
}
}
void move_led() {
digitalWrite(led_array[current_led], LOW);
if(current_led == 8){
dir_flag = false;
current_led -= 1;
} else if(current_led == 0){
dir_flag = true;
current_led += 1;
} else if(dir_flag){
current_led += 1;
} else if(!dir_flag){
current_led -= 1;
}
digitalWrite(led_array[current_led], HIGH);
}
void pulse(){
for(int i=0; i<9;i++){
digitalWrite(led_array[i], HIGH);
}
delay(100);
for(int i=0; i<9;i++){
digitalWrite(led_array[i], LOW);
}
}
void sweep(){
for(int i=0; i<9;i++){
digitalWrite(led_array[i], HIGH);
delay(50);
digitalWrite(led_array[i], LOW);
}
for(int i=8; i>=0;i--){
digitalWrite(led_array[i], HIGH);
delay(50);
digitalWrite(led_array[i], LOW);
}
}
void button_pressed(){
Serial.println("Button pressed on LED: "+String(current_led));
game_ended = true;
if(current_led==4){
is_win = true;
} else if(current_led != 4){
is_win = false;
}
current_led = 0;
delay(500);
}
Esquemáticos

Proceso de manufactura
- Construye un Juego Giroscópico en Tiempo Real con Arduino Nano y Sensor MPU-6050
- Proyecto Dados Digitales Arduino: Construye tu Propio Generador de Números Aleatorios con LCD
- Construye tu Propio Juego de Ruleta de 37 LEDs con Arduino Nano
- Mando USB para juegos DIY con Arduino – Construye tu propio gamepad de alto rendimiento
- Construye un juego Tetris con Arduino Nano en matriz LED 16x8 DIY
- Controla un LED por Bluetooth con Arduino – Guía DIY paso a paso
- Construye un Robot Cuadrúpedo Inteligente con Arduino: Guía Paso a Paso
- Pixel Chaser: Juego LED Interactivo de Un Toque con Arduino Nano
- Control de brillo LED sin interrupciones con Bolt IoT y Arduino UNO
- Reloj flip Arduino con matriz LED 8×8: proyecto DIY de reloj en tiempo real
- Mezclador de Colores RGB con Arduino – Proyecto DIY para Principiantes