Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

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

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

  1. Conectar el circuito exactamente como en el diagrama (color cables irrelevante).
  2. Copiar código al IDE Arduino y subir a la placa.
  3. ¡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

Construye un Juego de Memoria (Clon Simon) con Arduino – Tutorial Paso a Paso

Archivo Fritzing: simonsays_siKds3Jmk2.fzz

Proceso de manufactura

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