Sistema de desactivación de bombas puzzle BOOM-DUINO
Proyecto seytrma2526g01 · URJC
Autores
- Pablo García Bachs
- Iván Garrido Morcillo
- Carlos Martín García
Descripción del Proyecto
En este proyecto hemos desarrollado un juego de resolver puzzles portátil. Basado en el videojuego Keep Talking And Nobody Explodes.
El resultado es un sistema interactivo tipo escape room donde el jugador se enfrenta a una bomba con una cuenta atrás y dispone de un tiempo limitado para desactivarla.
El sistema entero depende de un único Arduino UNO e implementa cinco módulos físicos, cada uno representando un reto distinto con elementos de hardware muy dispares.
Para guiar al jugador, el sistema incluye una pantalla LCD que muestra pistas sobre los puzles y el estado de la bomba. Además, un zumbador pasivo genera alarmas sonoras, la cuenta atrás es gobernada por un display de 4 dígitos de 7 segmentos.
Componentes del proyecto
| Componente | Función | Precio Aproximado |
| Arduino UNO | Microcontrolador Principal | 29,30 € |
| 3x 74HC595N | Registros de desplazamiento | 0,90 € |
| Pantalla LCD con Modulo I2C | Pantalla del puzzle de ecuaciones matemáticas y guía para el jugador | 3,80 € |
| Display de 4 Dígitos de 7 Segmentos | Reloj central del puzzle | 6 € |
| Teclado de membrana 4×4 | Teclado para el puzzle de ecuaciones matemáticas | 1,50 € |
| Joystick Analógico | Joystick para el puzzle del laberinto acústico | 2,80 € |
| Lector NFC MFRC522 + llavero | Lector para desactivar la bomba puzzle | 3,50 € |
| Servomotor SG90 | Mecanismo para la puerta de caja fuerte | 2,20 € |
| Potenciómetro | Potenciómetro para abrir el servomotor de la puerta | 1,30 € |
| 2x Zumbadores | Zumbador central que introduce sonidos durante el juego y Otro zumbador para el puzzle de laberinto acústico | 1,30 € |
| 4x LEDs verdes 3x LEDs rojos | Indicadores visuales para los fallos y para los puzzles resueltos | 1 € |
| 2x Pilas 9V | Alimentación para la fuente de alimentación externa y Arduino | 10,50 € |
| 3x Protoboards | Montaje del circuito | 9,60 € |
| Fuente de Alimentación Elegoo MB102 | Añadir corriente necesaria al circuito | 1,40 € |
| Cables Macho-Macho y Macho-Hembra | Conectar los distintos componentes y para el puzzle de cortar los cables | 3 € |
| Resistencias: 20x 220Ω 2x 1KΩ 4x 5.1KΩ 2x 10KΩ 1x 100KΩ 1x 1MΩ | Esenciales para el funcionamiento de los puzzles y el reloj central | 1,50 € |
Coste total Aproximado: 79,60 €
Cómo funciona el sistema
El sistema sigue un ciclo de estados bien definido para el juego:
- Arranque y Aleatorización: Al encender y al reiniciar partida, el sistema usa una matriz de configruaciones para los puzzles, esto hace que en cada partida haya 4 puzzles con respuestas distintas.
- Juego Activo: El reloj se enciende y empieza la cuenta atrás. Los puzzles no llevan un orden en concreto, salvo que el puzzle de la puerta nunca se podrá solucionar si no has resuelto los otros tres antes y el puzzle de los cables nunca podrá ser resuelto sin haber resuelto antes el de las ecuaciones matemáticas, ya que la solución de este será la pista que aparecerá en la pantalla LCD
fasePistaCablesque será esencial para saber que cable «cortar». Una vez resueltos los 4 puzzles, se procederá a desbloquear el NFC con su respectivo llavero, y si se quiere empezar una nueva partida se podrá hacer pulsando el botón interno del joystick.
- Gestión de Errores: Si el jugador falla en un puzzle, se enciende un LED rojo y suena una alarma de error. A los 3 fallos, la bomba explota. También hay otra forma de perder en la partida, que es cuando se acaba el tiempo y no se ha resuelto completamente la bomba, en este caso se encenderán los tres leds a la vez y se perderá automáticamente. Si se quisiera empezar otra partida bastaría con pulsar el botón interno del joystick.
Módulos y Puzzles
El código gestiona cinco lógicas de forma paralela:
- Ecuación matemática: Se muestra una ecuación en la pantalla LCD y el usuario debe teclear mediante el teclado de membrana 4×4 la solución a esta. Si se quiere borrar lo que se ha escrito pulsará * y si se quiere confirmar lo que se ha escrito pulsará #. No se utiliza la columna de las letras.
- Cortar el cable correcto: Son 4 cables conectados mediante un divisor de tensión. La resistencia resultante determinará que cable se ha cortado. La lógica del puzzle depende si se ha resuelto antes o no el puzzle de la ecuación matemática.
- El laberinto acústico: Al pulsar el switch del joystick sonará el tono el cual debemos buscar. Si no se pulsara el botón, no sonaría nada y el puzzle no podría empezar. Acto seguido de pulsarlo debemos movernos gracias al eje X por 5 tonos. El usuario confirmará con otra pulsación al joystick el tono el cual crea que coincide.
- La caja fuerte: Un potenciómetro hace de manecilla de la caja fuerte, el cual como si fuera de verdad, pasará por una serie de números los cuales uno de ellos será la combinación para accionar el servomotor que abrirá la puerta. Las ayudas para este puzzle se imprimirán por la pantalla LCD presentando un sistema de Frío/Caliente para saber cómo de cerca estamos del valor correcto. Una vez abierto el servomotor, podremos desactivar el NFC.
- El módulo central: Se trata de un display de 4 dígitos de 7 segmentos donde aparecerá la cuenta atrás. También cuenta con las 3 LEDs de fallo rojas y un zumbador central que irá dando respuestas sonoras a las acciones del jugador.
Para los cuatro puzzles se encenderá una LED verde una vez resuelto para dar una respuesta visual a lo que se acaba de hacer. Además de que el zumbador general generará un sonido también aumentando la respuesta del sistema hacia el jugador.
Optimización de Hardware
Una vez expuesto todo lo necesario para poder montar este proyecto, es necesario aclarar que el desarrollo no es viable si no se hubiera optado por la estrategia de usar tres registros de desplazamiento en cascada para controlar varios de los componentes necesarios y ahorrar pines del Arduino ya que, los pines del Arduino están todos completos.
Con el objetivo de aumentar en ancho de salidas del Arduino se conectaron en cascada los shifters haciendo posible que utilizando un microcontrolador de 8 bits como el que tiene Arduino UNO se hayan podido generar 24 salidas más.
Gracias a esta gesitón se ha podido llevar a cabo la conexión del display de 4 dígitos, los 3 LEDs rojos, el zumbador central y los 4 LEDs verdes. En total se han acaparado 20 de los 24 pines disponibles junto a todos los pines de la propia placa Arduino.
Rejugabilidad gracias a matriz de puzzles
Un problema el cual nos dimos cuenta en el momento de la primera partida que probamos fue que todas las partidas eran la misma partida, nosotros consideramos que era un problema grave a solucionar.
Si las respuestas son estáticas, el jugador simplemente memoriza la solución. Para solucionar esto sin saturar la memoria dinámica del Arduino UNO, diseñamos una matriz de 16 escenarios.
Posición en la matriz
Al encender el sistema, el Arduino genera una semilla aleatoria randomSeed leyendo el los pines analógicos A1 y A2 sumado a los microsegundos de ejecución del procesador. Esto garantiza que el sistema elija un punto de partida impredecible dentro de una variable llamada numeroPartidaGlobal, que va del 0 al 15.
Cada vez que se reinicia una partida pulsando el botón, este valor avanza en bucle (numeroPartidaGlobal + 1) % 16. Esta única variable define todo el comportamiento de los dos primeros puzles.
- Lógica de Cables:
numeroPartidaGlobal % 4Define cuál de las 4 reglas lógicas se aplicará a los cables en esa partida.
- Selección de Ecuación:
numeroPartidaGlobal / 4Define cuál de las 4 ecuaciones disponibles dentro de ese Draft se mostrará por pantalla.
Hemos agrupado las 16 ecuaciones en 4 sets lógicos. El Puzle de los Cables siempre pide al jugador que evalúe si el número que introdujo en el teclado es par o impar, y lo cruza con una condición de magnitud.
Por ejemplo, si el sistema selecciona el Set Lógico 0 se trata de mayor o menor a 50. Para que este set no sea repetitivo, el jugador puede enfrentarse a 4 escenarios matemáticos totalmente distintos:
- 5x – 10 = 90 -> Menor a 50, Par -> Cortar Cable 1
- 3x + 5 = 14 -> Menor a 50, Impar -> Cortar Cable 2
- 4x + 10 = 250 -> Mayor a 50, Par -> Cortar Cable 3
- x + 15 = 90 -> Mayor a 50, Impar -> Cortar Cable 4
Como se puede observar, el jugador nunca teclea el mismo código, resolviendo ecuaciones distintas.
Sin embargo, todas encajan dentro del mismo bloque de pistas que gobiernan el divisor de tensión de los cables.
Los otros tres sets lógicos funcionan igual, pero cambiando las condiciones de los cables a:
- Set 1: La respuesta tiene 1 dígito o más
- Set 2: La respuesta es mayor o menor/igual a 30
- Set 3: La respuesta es menor o mayor/igual a 100
Esta arquitectura de software asegura que un mismo grupo de jugadores pueda intentar desactivar Boom-Duino varias veces enfrentándose a puzzles nuevos, combinaciones de cables distintas, y tonos de laberinto y objetivos de caja fuerte generados de forma 100% aleatoria.
Conexiones de Arduino y 74HC595N

Conexiones de Arduino:
| Componente | Pin |
| Teclado Membrana 4×4 | A0 |
| Potenciómetro | A1 |
| Eje X del Joystick | A2 |
| Lector de tensión del puzzle de cables | A3 |
| SDA del módulo I2C de la LCD | A4 |
| SCL del módulo I2C de la LCD | A5 |
| Pin DS del shifter 1 | D2 |
| Pin STCP del shifter 1 | D3 |
| Pin SHCP del shifter 1 | D4 |
| Switch del joystick | D5 |
| Zumbador para el puzzle del laberinto acústico | D6 |
| Servo SG90 | D8 |
| Pin RST del lector NFC | D9 |
| Pin RST del lector NFC | D10 |
| Pin RST del lector NFC | D11 |
| Pin RST del lector NFC | D12 |
| Pin RST del lector NFC | D13 |
| Pin 3,3V del lector NFC | Pin de 3,3V del Arduino |
Conexiones de los shifters:

Shifter 1:
| Componente o Conexión | Pin |
| Pin 1 Display de 7 Segmentos | Q4 |
| Pin 2 Display de 7 Segmentos | Q3 |
| Pin 3 Display de 7 Segmentos | Q7 |
| Pin 4 Display de 7 Segmentos | Q2 |
| Pin 5 Display de 7 Segmentos | Q6 |
| Pin 7 Display de 7 Segmentos | Q1 |
| Pin 10 Display de 7 Segmentos | Q5 |
| Pin 11 Display de 7 Segmentos | Q0 |
| D2 Arduino | DS |
| D3 Arduino | STCP |
| D4 Arduino | SHCP |
| DS Shifter 2 | Q7S Shifter 1 |
| SHCP Shifter 2 | SHCP Shifter 1 |
| STCP Shifter 2 | STCP Shifter 1 |
| GND | GND |
| VCC | VCC |
| GND | OE |
| VCC | MR |
Shifter 2:
| Componente o Conexión | Pin |
| Pin 6 Display de 7 Segmentos | Q4 |
| Pin 8 Display de 7 Segmentos | Q1 |
| Pin 9 Display de 7 Segmentos | Q2 |
| Pin 12 Display de 7 Segmentos | Q3 |
| LED Roja 1 | Q0 |
| LED Roja 2 | Q5 |
| LED Roja 3 | Q6 |
| Buzzer del módulo central | Q7 |
| DS Shifter 3 | Q7S Shifter 2 |
| SHCP Shifter 3 | SHCP Shifter 2 |
| STCP Shifter 3 | STCP Shifter 2 |
| GND | GND |
| VCC | VCC |
| GND | OE |
| VCC | MR |
Shifter 3:
| Componente o Conexión | Pin |
| LED Verde 1 | Q0 |
| LED Verde 2 | Q1 |
| LED Verde 3 | Q2 |
| LED Verde 4 | Q3 |
| No conectado | Q4 |
| No conectado | Q5 |
| No conectado | Q6 |
| No conectado | Q7 |
| No conectado | Q7S Shifter 3 |
| No conectado | SHCP Shifter 3 |
| No conectado | STCP Shifter 3 |
| GND | GND |
| VCC | VCC |
| GND | OE |
| VCC | MR |
Proceso de montaje
El proyecto pasó por varias fases debido a la diferencia entre el entorno simulado y real y la complejidad en la escala del desarrollo.
En un primer momento, comenzamos por explorar otras dos ideas de proyecto antes de empezar con este, un sistema de seguimiento facial y un tetris. Pero estas dos ideas fueron descartadas por ser demasiado simples a nivel del trabajo que ejercía el Arduino. Antes de empezar con la idea que al final desarrollamos, realizamos dos inventarios para tener claro realmente las capacidades a nivel de hardware que teniamos. Realizamos un inventario de lo que nosotros teníamos en casa y otro inventario del kit de clase.
Una vez que empezamos a desarrollar este proyecto, se empezó a diseñar varias ideas de puzzles, en un principio el laberinto acústico se iba a tratar de un laberinto visual con una celda de LEDs en las cuales un camino iba a ser dibujado y el usuario con el joystick debía de hacer el mismo camino. Esto fue descartado por falta de conexiones, era necesario adquirir una con un módulo I2C.
En una primera instancia, el proyecto se comenzó a diseñar en Tinkercad hasta tener un prototipo funcional y una simulación capaz de conseguir recrear una partida entera de Boom-Duino. Esto únicamente se trató de una primera fase ya que la diferencia entre el diseño digital y el diseño en físico dista bastante debido a que en Tinkercad el Display de 7 segmentos cuenta con un módulo I2C, el joystick no tiene un módulo digitalizado en la web, no existe tampoco el lector NFC y tampoco se podía simular el puzzle de los cables debido a que si desconectas algo de la placa se detiene automáticamente la simulación.
En Tinkercad se optó por cambiar el joystick por tres pulsadores. Además en el diseño tampoco están implementadas algunos cambios finales tanto en el código como en las LEDs verdes.

Una vez empezado el diseño físico, al ser un proyecto tan grande, primeramente modularizamos los puzzles individualmente. Para llevar ordenado todos los códigos abrimos un repositorio para mantener todos los códigos en un mismo lugar común y mantener todos la última versión del código. Además de una memoria que hace de guía para conectar todos los puzzles.

Una vez terminados los módulos comenzamos a desarrollar el primer prototipo de Boom-Duino.

A partir de este punto se comenzó a desarrollar una primera versión del código que controla todo el circuito. Además poco a poco comenzamos con la optimización de cables y conectamos una tercera placa para distribuir mejor los componentes.
En una primera versión del código simplemente nos dedicamos a conseguir que todo lo conectado funcionara y se pudiera utilizar. Realmente la lógica del juego no empezó a ser desarrollada hasta el final, ya que tuvimos mucha dificultad en un principio para hacer funcionar correctamente todo lo conectado a los 3 registros de desplazamiento.
La principal barrera fue la multiplexación del reloj de 7 segmentos. Al intentar refrescar los cuatro dígitos secuencialmente dentro del bucle principal loop la pantalla parpadeaba de forma constante o se congelaba cada vez que el Arduino se detenía a leer el teclado de membrana o el lector NFC. La solución definitiva a este cuello de botella fue delegar esta tarea al Timer 2 del Arduino.
Configuramos este temporizador para que lanzara una interrupción periódica en segundo plano. Al mover todo el código de control de los registros dentro de la rutina de interrupción ISR(TIMER2_COMPA_vect), logramos que el procesador pausara momentáneamente lo que estuviera haciendo, actualizara el display y retomara su tarea original a una velocidad imperceptible para el ojo humano.
Al sacar el refresco de la pantalla del loop() quedó completamente liberado, fue gracias a esta modificación que logramos conseguir un código que consiguiera que el Arduino pudiera controlar todo al mismo tiempo.

Una vez diseñado este prototipo final, comenzamos a refinar la lógica del juego. Añadiéndole funcionalidades que en un principio no estaban contempladas como que el puzzle de los cables sólo se pudiera resolver después de las ecuaciones, la pantalla LCD imprimiera muchos más textos de feedback para el usuario, la implementación de una matriz de tipos de bombas para conseguir una rejugabilidad muy extensa y el poder reiniciar para empezar otra partida una vez terminada la que estás jugando independientemente de si se pierde o se gana.
Finalmente le añadimos unos cables más largos a los componentes que aun seguían enchufados a la placa para poder separarlos de esta para que en el diseño de la caja final pudiera encajar a la perfección.
Una vez conseguimos terminar esta fase del desarrollo, finalmente creamos la caja del puzzle. Al principio teníamos pensado que fuera una caja impresa en 3D pero por falta de tiempo nos decantamos por hacerla en cartón.

Hicimos la caja por un lado, el fondo de la caja por otro lado, con un hueco para conectar el Arduino al PC. No nos fue posible conectarlo a una pila 9V debido a diferencias en los valores de las teclas de la membrana dependiendo de a donde estuviera conectada. Lo que hacia que se descofigurasen los valores establecidos para cada tecla. Por otro lado hicimos un cajón interno para dentro de la caja donde va colocado el lector NFC y una tapa para esta última que se encargaría de abrir y cerrar el servomotor.

Finalmente introducimos el proyecto dentro de la caja y juntamos todas las piezas de cartón. Por falta de tiempo no pudimos integrar la puerta para el servomotor. Para el puzzle de los cables tuvimos que recortar el cartón para finalmente dejarlo puesto en la protoboard además de que el ensamblado del resto de los componentes no pudo ser finalizado por la misma razón

Encuentra todos los códigos, memoria y esquemas en nuestro repositorio. Lee el README para saber como navegar y utilizar los distintos archivos y carpetas: https://github.com/Karlosk1/Boom-Duino
Conclusiones
- Herramientas como Tinkercad son excelentes para validar la lógica y probar el circuito inicial, pero el montaje físico trae consigo muchas dificultades que distan de un programa tan básico como Tinkercad. Para el diseño digital final se ha utilizado una herramienta de diseño distinta, llamada Fritzing.
- Organizar el código como una máquina de estados nos permitió que el jugador pudiera interactuar con varios puzles de forma simultánea y no lineal, evitando los cuellos de botella que se generarían al usar funciones como
delay().
- Delegar tareas al Timer 2 es fundamental para conseguir que todo el proyecto funcione.
- Proyectos tan grandes como estos con los cables para kits de Arduino y sin soldar es extremadamente experimental y una facilidad para dejar de funcionar muy alta.
Proyecto realizado para la asignatura de Sistemas Empotrados y de Tiempo Real · URJC Grupo seytrma2526g01 · Pablo García Bachs · Iván Garrido Morcillo · Carlos Martín García