Juego de Reflejos ESP32

Ocho barras cuelgan frente al jugador, sostenidas por un pestillo de resorte. El ESP32 las libera una por una, en momentos aleatorios — el reto es atraparlas todas antes de que caigan al piso.

Dificultad: media Electrónica + mecánica ESP32
Canales
8
MCU
ESP32 DevKit V1
Rev
A

Demostración en video

Cómo funciona

Cada barra descansa en un pestillo mecánico con resorte, similar a una chapa de puerta: al empujar la barra hacia adentro, el pestillo la atrapa solo. Un actuador universal de seguro eléctrico (de los que se usan en los seguros centralizados de auto) está acoplado a ese pestillo. Al recibir un pulso breve de corriente, el actuador mueve el pestillo y libera la barra; el resorte regresa el mecanismo a su posición de "listo para atrapar" sin ayuda eléctrica — por eso recargar el juego es tan simple como empujar los tubos de nuevo, sin ningún botón de reset.

Un ESP32 controla los 8 actuadores a través de dos tarjetas de relevadores de 4 canales. Al presionar START, una cuenta regresiva breve da paso a la secuencia: las 8 barras se sueltan una por una, en orden aleatorio y con intervalos de tiempo también aleatorios entre cada una. Un potenciómetro ajusta ese rango de intervalos — girado a un extremo, las sueltas vienen muy seguidas (difícil); al otro extremo, más espaciadas (fácil).

Ver diagrama de conexión → Descargar código (.ino) ☕ Invítame un café

Lista de materiales

Cant.ComponenteNotas
1ESP32 DevKit V1controlador principal
2Tarjeta de relevadores, 4 canales, 5V optoacoplada10A/250V·30VDC, terminales NA/NC/COM
8Actuador universal de seguro eléctrico2 cables, reversible — solo se usa un sentido
8Mecanismo de pestillo + resorte de retornofabricación propia, uno por canal
8Barra / tuboligero, sin bordes filosos
8Diodo flyback (1N4007 o similar)uno en paralelo por actuador
1Potenciómetro (10kΩ lineal típico)ajuste de dificultad
1Botón pulsador momentáneoSTART
1Fuente de alimentación 5V (≥1A)VCC de ambas tarjetas de relé
1Fuente de alimentación 12Vdimensionada según los actuadores, con margen
Cable, borneras, estructura/rieles de soportesegún tu montaje

Diagrama de Cableado y Fuentes de Voltaje

Recorrido de señal lógica (3.3V) desde el ESP32 hacia las tarjetas de relé y potencia conmutada (12V para actuadores y 5V para relés), compartiendo tierra común (GND):

FUENTE 5V bobinas + lógica relé FUENTE 12V actuadores POTENCIÓMETRO dificultad · 3.3V–GND ESP32 DEVKIT V1 BOTÓN START pull-up interno TARJETA RELÉ 1 canales 1–4 TARJETA RELÉ 2 canales 5–8 ACTUADORES 1–4 seguro eléctrico + resorte ACTUADORES 5–8 seguro eléctrico + resorte GPIO 34 GPIO 27 4 5 18 19 21 22 23 25 VCC 5V (ambas tarjetas) 12V → COM NA · 12V conmutado ×4 NA · 12V conmutado ×4
Abrir plano detallado canal por canal →

Código (ESP32 / Arduino)

Máquina de estados no bloqueante (usa millis(), no delay()): espera → cuenta regresiva → secuencia aleatoria → fin. Antes de cablear los 8 canales, prueba uno solo y confirma la polaridad de tu tarjeta de relé (activa en alto o en bajo) — ajusta RELE_ACTIVO_EN_BAJO según el resultado.

reflejos_esp32.ino test_boton.ino (prueba de cableado)
// --- extracto: control de un canal de relé, con polaridad configurable ---
const bool RELE_ACTIVO_EN_BAJO = true;  // cambia a false si tu tarjeta es activa en alto

void encenderActuador(uint8_t indice) {
  digitalWrite(PINES_RELE[indice], RELE_ACTIVO_EN_BAJO ? LOW : HIGH);
}

void apagarActuador(uint8_t indice) {
  digitalWrite(PINES_RELE[indice], RELE_ACTIVO_EN_BAJO ? HIGH : LOW);
}

// --- extracto: intervalo aleatorio entre sueltas, según el potenciómetro ---
unsigned long intervaloAleatorio() {
  int lecturaPot = analogRead(PIN_POTENCIOMETRO);        // 0-4095 (ADC de 12 bits)
  long intervaloMax = map(lecturaPot, 0, 4095,
                           (long)INTERVALO_MIN_DIFICIL_MS,
                           (long)INTERVALO_MAX_FACIL_MS);
  long intervaloMin = intervaloMax / 3;
  return (unsigned long) random(intervaloMin, intervaloMax + 1);
}

// El archivo completo (descargas/reflejos_esp32.ino) incluye la máquina de
// estados completa, el antirrebote del botón START y los mensajes de
// diagnóstico por Serial (115200 baudios).

Bitácora de diseño

Por qué el diseño terminó así — útil si quieres adaptar el proyecto en vez de copiarlo tal cual.

  1. Se descartaron los electroimanes de sujeción. Sostener 8 electroimanes energizados todo el tiempo que el jugador está parado esperando consume energía de forma continua e innecesaria.
  2. Actuador + pestillo de resorte en su lugar. El pestillo solo necesita un pulso eléctrico breve para liberar la barra; el resorte hace el regreso mecánico sin gastar energía. Recargar es empujar la barra de vuelta — no hace falta botón de reset.
  3. ESP32 en vez de Arduino clásico. Compatible con los mismos módulos de relé (los optoacopladores solo necesitan ~5mA, así que 3.3V del ESP32 los activa sin problema), con más pines libres y USB nativo para programar.
  4. No se detecta electrónicamente si el jugador atrapó cada barra. Es un juego de percepción pura — el resultado lo juzga el propio jugador, sin sensores de por medio.

Recursos y Enlaces Relacionados

Documentación técnica, librerías y guías para complementar el armado del proyecto:

☕ Apoya este proyecto (Invítame un café)

¿Te gustó este proyecto, te sirvió para aprender o estás pensando en armarlo? El diseño de los circuitos, las pruebas mecánicas y el código libre llevan muchas horas de trabajo. Si quieres apoyar para que pueda seguir creando y documentando proyectos como este, ¡puedes invitarme un café!

$20 MXN $50 MXN $100 MXN Monto libre
☕ Invitar un café (Apoyar) →