Construye un Juego de Memoria (Clon Simon) con Arduino – Tutorial Paso a Paso
Componentes y materiales
| Componente | Cantidad | Notas |
|---|---|---|
| Arduino UNO | 1 | |
| Resistencias 330 Ω | 4 | Para LEDs |
| Resistencias 10k Ω | 4 | Pull-down botones |
| LEDs colores surtidos | 4 | 4 colores diferentes |
| Mini altavoz | 1 | Opcional (sonido) |
| Protoboard (tamaño completo) | 1 | |
| Cables jumper | 1 set |
Aplicaciones y servicios
- Arduino IDE
Sobre el proyecto
¿Recuerdas el juego "Simon"? Quienes nacimos en los 70 perdimos horas jugándolo. 4 botones de colores se iluminaban en secuencia y había que repetirla. Cada acierto añadía un color más.
Tuve uno en Navidad pero se perdió en mudanzas. Como "adulto", descubrí Arduino y reviví a mi viejo amigo. Este tutorial muestra cómo hacer un clon con Arduino Uno, LEDs, resistencias y un circuito simple.
El código puede parecer complejo para principiantes, pero está comentado explicando cada parte.
Pasos rápidos
- Conectar el circuito exactamente como en el diagrama (color cables irrelevante).
- Copiar código al IDE Arduino y subir a la placa.
- ¡Jugar!
El juego empieza tras ~3 segundos con 5 destellos lentos de todos los LEDs. Si alguno no parpadea, revisa cableado. Los botones pequeños a veces no hacen buen contacto.
Tras los 5 destellos, se enciende un LED aleatorio. Pulsa su botón. Ese LED se repite seguido de otro nuevo. Pulsa la secuencia correcta... y así sucesivamente.
Cuando fallas: destellos rápidos de todos los LEDs. Se muestra tu última secuencia para contar puntos (mi récord: 22), luego 5 destellos lentos = nueva partida.
Tienes 2 segundos por botón (constante PLAYER_WAIT_TIME).
¿Quieres más dificultad?
Cambia #define PLAYER_WAIT_TIME 2000 a menor valor. O añade más LEDs: replica la porción de circuito por LED (evita pines 0 y 1). Modifica en código:
byte noPins = 4;
byte pins[] = {2, 13, 10, 8};
Si añades LED en pin 6:
byte noPins = 5;
byte pins[] = {2, 13, 10, 8, 6};
Consejo para código Arduino
Pon delay(3000); al inicio de setup(). Da tiempo a respirar tras conectar y permite resetear/subir sketch en blanco si el Arduino se bloquea en bucle infinito.
Llevé la idea a versión portátil... Para versión avanzada con interfaz a coche Lego: Lego Mini Memory Game de Peter Kent. ¡Impresionante!
Código completo
Copia y pega en tu IDE y sube a Arduino.
#define PLAYER_WAIT_TIME 2000 // Tiempo entre pulsaciones - 2s
byte sequence[100]; // Almacena secuencia de luces
byte curLen = 0; // Longitud actual secuencia
byte inputCount = 0; // Pulsaciones correctas en turno
byte lastInput = 0; // Última entrada jugador
byte expRd = 0; // LED que debe pulsar jugador
bool btnDwn = false; // Control pulsación
bool wait = false; // Turno jugador?
bool resetFlag = false; // Flag pérdida
byte soundPin = 5; // Pin altavoz
byte noPins = 4; // Número botones/LEDs
byte pins[] = {2, 13, 10, 8}; // Pines botones/LEDs (cambiar si usas otros)
long inputTime = 0; // Temporizador respuesta
void setup() {
delay(3000);
Serial.begin(9600);
Reset();
}
void setPinDirection(byte dir) {
for (byte i = 0; i < noPins; i++) pinMode(pins[i], dir);
}
void writeAllPins(byte val) {
for (byte i = 0; i < noPins; i++) digitalWrite(pins[i], val);
}
void beep(byte freq) {
analogWrite(soundPin, 2);
delay(freq);
analogWrite(soundPin, 0);
delay(freq);
}
void flash(short freq) {
setPinDirection(OUTPUT);
for (int i = 0; i < 5; i++) {
writeAllPins(HIGH); beep(50); delay(freq);
writeAllPins(LOW); delay(freq);
}
}
void Reset() {
flash(500);
curLen = 0; inputCount = 0; lastInput = 0;
expRd = 0; btnDwn = false; wait = false; resetFlag = false;
}
void Lose() { flash(50); }
void playSequence() {
for (int i = 0; i < curLen; i++) {
Serial.print("Seq: "); Serial.print(i); Serial.print(" Pin: "); Serial.println(sequence[i]);
digitalWrite(sequence[i], HIGH); delay(500);
digitalWrite(sequence[i], LOW); delay(250);
}
}
void DoLoseProcess() {
Lose(); delay(1000);
playSequence(); // Muestra última secuencia (para contar puntos)
delay(1000);
Reset();
}
void loop() {
if (!wait) {
// TURNO ARDUINO
setPinDirection(OUTPUT);
randomSeed(analogRead(A0));
sequence[curLen] = pins[random(0, noPins)];
curLen++;
playSequence();
beep(50);
wait = true;
inputTime = millis();
} else {
// TURNO JUGADOR
setPinDirection(INPUT);
if (millis() - inputTime > PLAYER_WAIT_TIME) {
DoLoseProcess(); return;
}
if (!btnDwn) {
expRd = sequence[inputCount];
Serial.print("Esperado: "); Serial.println(expRd);
for (int i = 0; i < noPins; i++) {
if (pins[i] == expRd) continue;
if (digitalRead(pins[i]) == HIGH) {
lastInput = pins[i];
resetFlag = true;
btnDwn = true;
Serial.print("Leído (err): "); Serial.println(lastInput);
}
}
}
if (digitalRead(expRd) == HIGH && !btnDwn) {
inputTime = millis();
inputCount++;
btnDwn = true;
Serial.print("Leído (ok): "); Serial.println(expRd);
} else {
if (btnDwn && digitalRead(lastInput) == LOW) {
btnDwn = false;
delay(20);
if (resetFlag) DoLoseProcess();
else {
if (inputCount == curLen) {
wait = false; // Turno Arduino
inputCount = 0;
delay(1500);
}
}
}
}
}
}
Esquemático

Archivo Fritzing: simonsays_siKds3Jmk2.fzz
Proceso de manufactura
- Crea un Impresionante Sistema Ambilight para Monitor con Arduino
- Construye un Juego Giroscópico en Tiempo Real con Arduino Nano y Sensor MPU-6050
- Pantalla LED Interactiva con Giroscopio, Anillo NeoPixel y Arduino
- Construya el clásico juego Pong en Arduino UNO con pantalla OLED: Tutorial paso a paso
- Mando USB para juegos DIY con Arduino – Construye tu propio gamepad de alto rendimiento
- Juego Breakout táctil Arduino: Arcade clásico en pantalla TFT 2,4″
- Pixie: Reloj de pulsera NeoPixel basado en Arduino – Elegante reloj LED DIY
- Pixel Chaser: Juego LED Interactivo de Un Toque con Arduino Nano
- Automatiza el Juego del Dinosaurio de Chrome con Arduino y Python
- Sistema Portátil de Vigilancia Remota con Cámara y Robot Móvil
- Guante Inteligente de Gestos a Texto para Lenguaje de Signos