{"id":10271,"date":"2026-05-05T23:52:36","date_gmt":"2026-05-05T21:52:36","guid":{"rendered":"https:\/\/blogs.etsii.urjc.es\/dseytr\/?p=10271"},"modified":"2026-05-06T00:19:12","modified_gmt":"2026-05-05T22:19:12","slug":"video-de-desactivacion-completa","status":"publish","type":"post","link":"https:\/\/blogs.etsii.urjc.es\/dseytr\/video-de-desactivacion-completa\/","title":{"rendered":"Proyecto B.O.M.B.A"},"content":{"rendered":"\n<p><strong>Introducci\u00f3n al Sistema<\/strong>&nbsp;<\/p>\n\n\n\n<p>El proyecto B.O.M.B.A. es un sistema interactivo basado en hardware y software que adapta a la realidad f\u00edsica la mec\u00e1nica central del videojuego cooperativo&nbsp;Keep&nbsp;Talking&nbsp;and&nbsp;Nobody&nbsp;Explodes. El objetivo fundamental es la creaci\u00f3n de una experiencia de simulaci\u00f3n de alta presi\u00f3n donde la resoluci\u00f3n de problemas y la comunicaci\u00f3n t\u00e9cnica son los pilares de la victoria.&nbsp;<\/p>\n\n\n\n<p><strong>1.1. Concepto y Din\u00e1mica Operativa<\/strong>&nbsp;<\/p>\n\n\n\n<p>El sistema se fundamenta en un modelo de comunicaci\u00f3n asim\u00e9trica entre dos figuras clave:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>El Desactivador:<\/strong>&nbsp;El operario que interact\u00faa directamente con el artefacto f\u00edsico. Este usuario posee la capacidad de manipulaci\u00f3n de los m\u00f3dulos, pero carece del conocimiento sobre la l\u00f3gica interna necesaria para resolverlos.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>El Experto:<\/strong>&nbsp;Un analista que posee el manual t\u00e9cnico de desactivaci\u00f3n. El experto dispone de toda la l\u00f3gica condicional y las tablas de referencia, pero tiene prohibido el contacto visual con el dispositivo.&nbsp;<\/li>\n<\/ul>\n\n\n\n<p>La resoluci\u00f3n del sistema solo es posible mediante el intercambio constante de informaci\u00f3n precisa, lo que introduce un factor humano de error que debe gestionarse bajo condiciones de estr\u00e9s temporal.&nbsp;<\/p>\n\n\n\n<p><strong>1.2. Arquitectura del Juego y Condiciones de Fallo<\/strong>&nbsp;<\/p>\n\n\n\n<p>La bomba est\u00e1 gobernada por un sistema de control central que monitoriza dos par\u00e1metros cr\u00edticos de seguridad:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Gesti\u00f3n Temporal:<\/strong>&nbsp;Un temporizador de cuenta atr\u00e1s que define el margen de maniobra del equipo. El agotamiento del tiempo resulta en la detonaci\u00f3n inmediata del artefacto.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Sistema de Penalizaciones (Strikes):<\/strong>&nbsp;El dispositivo cuenta con un registro de errores para el seguimiento de fallos operativos. El sistema admite un m\u00e1ximo de dos errores; al registrarse el tercer strike, el m\u00f3dulo central activa la secuencia de detonaci\u00f3n como medida de seguridad ante una manipulaci\u00f3n negligente.&nbsp;<\/li>\n<\/ul>\n\n\n\n<p><strong>1.3. Descripci\u00f3n de los M\u00f3dulos de Desactivaci\u00f3n<\/strong>&nbsp;<\/p>\n\n\n\n<p>Para lograr la desactivaci\u00f3n completa del sistema, el equipo debe neutralizar cinco subsistemas o m\u00f3dulos independientes, cada uno dise\u00f1ado para poner a prueba diferentes capacidades cognitivas y t\u00e9cnicas:&nbsp;<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>C\u00f3digo Morse:<\/strong>&nbsp;Un m\u00f3dulo de decodificaci\u00f3n que requiere la interpretaci\u00f3n visual de se\u00f1ales lum\u00ednicas para identificar palabras clave y sintonizar una frecuencia de radio espec\u00edfica mediante un potenci\u00f3metro.&nbsp;&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Sim\u00f3n Dice Condicional:<\/strong>&nbsp;Un juego de memoria visual cuya l\u00f3gica de respuesta es din\u00e1mica. La correspondencia entre la luz mostrada y el bot\u00f3n a pulsar var\u00eda en funci\u00f3n del n\u00famero de strikes activos en la bomba en ese instante.&nbsp;&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>Cortar Cables:<\/strong>&nbsp;Un desaf\u00edo de l\u00f3gica pura basado en el an\u00e1lisis del estado inicial del cableado. El desactivador debe identificar qu\u00e9 cables espec\u00edficos interrumpir siguiendo una jerarqu\u00eda de reglas condicionales de alta complejidad.&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><strong>M\u00f3dulo de Memoria:<\/strong>&nbsp;Un sistema de cinco fases que exige al jugador recordar posiciones y etiquetas de botones anteriores en funci\u00f3n de la informaci\u00f3n num\u00e9rica mostrada en un&nbsp;display&nbsp;de siete segmentos.&nbsp;&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"5\" class=\"wp-block-list\">\n<li><strong>Descarga del Capacitor (M\u00f3dulo \u00abNeedy\u00bb):<\/strong>&nbsp;A diferencia de los anteriores, este es un m\u00f3dulo as\u00edncrono de mantenimiento persistente. No se desactiva permanentemente, sino que requiere ser monitorizado y descargado&nbsp;cada pocos segundos&nbsp;para evitar una sobrecarga que sumar\u00eda un strike al contador global, interrumpiendo as\u00ed el flujo de trabajo en los dem\u00e1s m\u00f3dulos.&nbsp;<\/li>\n<\/ol>\n\n\n<h3 class=\"wp-block-post-title\">Proyecto B.O.M.B.A<\/h3>\n\n\n<p><a href=\"https:\/\/urjc-my.sharepoint.com\/:v:\/r\/personal\/a_mayoral_2022_alumnos_urjc_es\/Documents\/Video%20Sistemas%20Empotrados.mp4?csf=1&amp;web=1&amp;e=A9bk5o&amp;nav=eyJyZWZlcnJhbEluZm8iOnsicmVmZXJyYWxBcHAiOiJTdHJlYW1XZWJBcHAiLCJyZWZlcnJhbFZpZXciOiJTaGFyZURpYWxvZy1MaW5rIiwicmVmZXJyYWxBcHBQbGF0Zm9ybSI6IldlYiIsInJlZmVycmFsTW9kZSI6InZpZXcifX0%3D\">Video Sistemas Empotrados.mp4<\/a><\/p>\n\n\n\n<p><strong>M\u00f3dulo 1: C\u00f3digo Morse<\/strong>&nbsp;<\/p>\n\n\n\n<p><strong>2.1. Casos de Uso y Funcionamiento<\/strong>&nbsp;<\/p>\n\n\n\n<p>Se trata de un m\u00f3dulo de decodificaci\u00f3n donde el jugador debe interpretar una palabra transmitida en c\u00f3digo Morse mediante el parpadeo de un LED. La palabra se emite en bucle de forma continua. El jugador dispone de un potenci\u00f3metro que controla una frecuencia mostrada en un&nbsp;display&nbsp;de 7 segmentos; debe sintonizar la frecuencia que corresponde a la palabra que est\u00e1 siendo transmitida.&nbsp;La complejidad y el factor diferencial (el caso de uso principal) radica en que el jugador necesita conocer tanto el c\u00f3digo Morse como la tabla de correspondencias palabra\u2013frecuencia: primero debe decodificar visualmente la secuencia de puntos y rayas, identificar la palabra, y luego girar el potenci\u00f3metro hasta seleccionar la frecuencia correcta antes de pulsar el bot\u00f3n para confirmar su respuesta.&nbsp;<\/p>\n\n\n\n<p><strong>2.2. Implementaci\u00f3n Hardware<\/strong>&nbsp;<\/p>\n\n\n\n<p>Implementado sobre la placa Arduino Mega, el m\u00f3dulo requiere:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Entradas:&nbsp;<\/strong>1 potenci\u00f3metro conectado al pin anal\u00f3gico A0 para la selecci\u00f3n de frecuencia, y 1 pulsador con resistencia&nbsp;Pull-Up interna habilitada por software (pin 7).&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Salidas:<\/strong>&nbsp;1 LED (pin 13) para la emisi\u00f3n de la se\u00f1al Morse, y 1&nbsp;display&nbsp;de 4 d\u00edgitos de 7 segmentos controlado mediante un registro de desplazamiento 74HC595 (pines&nbsp;Latch=8,&nbsp;Clock=12, Data=11) con 4 l\u00edneas de selecci\u00f3n de d\u00edgito (pines 2, 3, 4, 5) para la multiplexaci\u00f3n.&nbsp;<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"772\" height=\"477\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/image-44.png\" alt=\"\" class=\"wp-image-10283\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/image-44.png 772w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/image-44-300x185.png 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/image-44-768x475.png 768w\" sizes=\"auto, (max-width: 772px) 100vw, 772px\" \/><\/figure>\n\n\n\n<p><strong>2.3. Implementaci\u00f3n Software<\/strong>&nbsp;<\/p>\n\n\n\n<p>El m\u00f3dulo Morse est\u00e1 implementado como una clase que encapsula toda la l\u00f3gica de juego, desde la emisi\u00f3n no bloqueante de se\u00f1ales Morse hasta la lectura anal\u00f3gica del potenci\u00f3metro y la validaci\u00f3n de la frecuencia seleccionada.&nbsp;<\/p>\n\n\n\n<p><strong><em>A. Inicializaci\u00f3n y Configuraci\u00f3n (begin)<\/em><\/strong>&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Gesti\u00f3n de Pines:<\/strong>&nbsp;Configura los pines del registro de desplazamiento (latch,&nbsp;clock, data) y el LED Morse como salidas, los pines de selecci\u00f3n de d\u00edgito como salidas, y el bot\u00f3n como entrada utilizando INPUT_PULLUP para aprovechar las resistencias internas del microcontrolador.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Aleatoriedad:&nbsp;<\/strong>Utiliza&nbsp;randomSeed(analogRead(A5)) para asegurar que la palabra seleccionada sea diferente en cada partida, leyendo el ruido el\u00e9ctrico de un pin anal\u00f3gico flotante. Tras ello,&nbsp;random(0, TOTAL_PALABRAS) elige un \u00edndice aleatorio de la tabla de 10 palabras posibles.&nbsp;<\/li>\n<\/ul>\n\n\n\n<p><strong><em>B. Tabla de Palabras y Alfabeto Morse<\/em><\/strong>&nbsp;<\/p>\n\n\n\n<p>El m\u00f3dulo almacena dos estructuras de datos est\u00e1ticas fundamentales:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>table[10]:<\/strong>&nbsp;Un array de&nbsp;structs&nbsp;MorseWord&nbsp;que asocia cada palabra posible con su frecuencia correspondiente (ej. \u00abbrillo\u00bb \u2192 1505, \u00abbomba\u00bb \u2192 1552). Esta tabla es la referencia tanto para la emisi\u00f3n como para la validaci\u00f3n.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>alphabet[26]:<\/strong>&nbsp;Un array que codifica cada letra del abecedario (a\u2013z) en su representaci\u00f3n Morse de puntos (&#8216;.&#8217;) y rayas (&#8216;-&#8216;), permitiendo traducir cualquier palabra car\u00e1cter a car\u00e1cter.&nbsp;<\/li>\n<\/ul>\n\n\n\n<p><strong><em>C. M\u00e1quina de Estados en&nbsp;actualizarMorse<\/em><\/strong>&nbsp;<\/p>\n\n\n\n<p>Este m\u00e9todo gestiona la emisi\u00f3n de la se\u00f1al Morse de forma completamente no bloqueante, utilizando&nbsp;millis() y una variable&nbsp;nextEventTime&nbsp;para controlar las transiciones temporales. La unidad de tiempo base (U) es de 200ms. Su flujo se divide en:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>ENVIANDO_SIMBOLO:<\/strong>&nbsp;Enciende el LED y programa el tiempo de encendido: 1\u00d7U (200ms) para un punto, 3\u00d7U (600ms) para una raya.&nbsp;Transiciona&nbsp;al estado ESPACIO_SIMBOLO.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>ESPACIO_SIMBOLO:<\/strong>&nbsp;Apaga el LED tras el punto o la raya y eval\u00faa el siguiente paso:&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Si quedan m\u00e1s s\u00edmbolos en la letra actual, espera 1\u00d7U (espacio&nbsp;intra-car\u00e1cter) y vuelve a ENVIANDO_SIMBOLO.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Si la letra ha terminado, pero quedan m\u00e1s letras en la palabra, espera 3\u00d7U (espacio entre letras) y avanza al siguiente car\u00e1cter.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Si la palabra ha terminado por completo, espera 10\u00d7U (2 segundos de espacio entre repeticiones) y reinicia la emisi\u00f3n desde el primer car\u00e1cter.&nbsp;<\/li>\n<\/ul>\n\n\n\n<p><strong><em>D. Multiplexaci\u00f3n del&nbsp;Display&nbsp;(mostrarFrecuencia)<\/em><\/strong>&nbsp;<\/p>\n\n\n\n<p>Este m\u00e9todo implementa la t\u00e9cnica de multiplexaci\u00f3n por barrido r\u00e1pido para mostrar la frecuencia de 4 d\u00edgitos en el&nbsp;display&nbsp;de 7 segmentos utilizando un \u00fanico registro de desplazamiento 74HC595. Para cada d\u00edgito:&nbsp;<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Apaga todos los d\u00edgitos para eliminar el efecto de \u00absombras\u00bb (ghosting).&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Carga el patr\u00f3n de segmentos correspondiente al d\u00edgito actual en el 74HC595 mediante&nbsp;shiftOut.&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>Enciende \u00fanicamente el d\u00edgito activo antes de pasar al siguiente.&nbsp;<\/li>\n<\/ol>\n\n\n\n<p><strong><em>E. Lectura del Potenci\u00f3metro y Selecci\u00f3n de Frecuencia (update)<\/em><\/strong>&nbsp;<\/p>\n\n\n\n<p>El m\u00e9todo&nbsp;update&nbsp;se ejecuta en cada iteraci\u00f3n del&nbsp;loop&nbsp;principal y orquesta las cuatro tareas del m\u00f3dulo:&nbsp;<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Lectura anal\u00f3gica:<\/strong>&nbsp;Lee el valor crudo del potenci\u00f3metro con&nbsp;analogRead(potPin).&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Calibraci\u00f3n y mapeo:<\/strong>&nbsp;Aplica&nbsp;constrain(val, 15, 940) para recortar los extremos no alcanzables del rango ADC, y luego&nbsp;map() para convertir el valor calibrado a un \u00edndice de la tabla de palabras (0\u20139), obteniendo as\u00ed la frecuencia seleccionada.&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>Emisi\u00f3n Morse:<\/strong>&nbsp;Invoca&nbsp;actualizarMorse() con la palabra asociada al \u00edndice aleatorio elegido al inicio.&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><strong>Comprobaci\u00f3n del bot\u00f3n:<\/strong>&nbsp;Si&nbsp;txButtonJustPressed() detecta una pulsaci\u00f3n confirmada, invoca&nbsp;validarRespuesta().&nbsp;<\/li>\n<\/ol>\n\n\n\n<p><strong><em>F. Debounce del&nbsp;Bot\u00f3n&nbsp;(txButtonJustPressed)<\/em><\/strong>&nbsp;<\/p>\n\n\n\n<p>Implementa un algoritmo de&nbsp;debounce&nbsp;por software que detecta flancos de bajada (HIGH &#8211; LOW) estables. Utiliza tres variables de estado (_lastStableBtnState, _candidateBtnState, _debounceTimestamp) para filtrar el ruido mec\u00e1nico del pulsador:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Si la lectura cambia respecto al candidato actual, se reinicia el temporizador.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Solo cuando la lectura se mantiene estable durante m\u00e1s de 50ms (DEBOUNCE_MS) y difiere del \u00faltimo estado confirmado, se acepta como pulsaci\u00f3n real.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Retorna true \u00fanicamente en el instante de la transici\u00f3n confirmada a LOW, garantizando una \u00fanica detecci\u00f3n por pulsaci\u00f3n.&nbsp;<\/li>\n<\/ul>\n\n\n\n<p><strong><em>G. Validaci\u00f3n de Respuesta (validarRespuesta)<\/em><\/strong>&nbsp;<\/p>\n\n\n\n<p>Compara la frecuencia actualmente seleccionada por el potenci\u00f3metro (selectedFreq) con la frecuencia correcta de la palabra que se est\u00e1 emitiendo:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Acierto (return&nbsp;1): Apaga todos los componentes del m\u00f3dulo (LED,&nbsp;display) dej\u00e1ndolo en estado resuelto.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Fallo (return&nbsp;-1): El valor de retorno se procesa en el&nbsp;loop&nbsp;principal, que incrementa el contador global de strikes.&nbsp;<br>&nbsp;&nbsp;<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"1080\" style=\"aspect-ratio: 1920 \/ 1080;\" width=\"1920\" controls src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/morse.mp4\"><\/video><\/figure>\n\n\n\n<p><strong>M\u00f3dulo 2: Sim\u00f3n Dice Condicional<\/strong>&nbsp;<\/p>\n\n\n\n<p><strong>3.1. Casos de Uso y Funcionamiento<\/strong>&nbsp;<\/p>\n\n\n\n<p>Se trata de un juego de memoria visual y sonora de hasta 5 rondas. El jugador debe replicar la secuencia de luces generada por el Arduino. La complejidad y el factor diferencial (el caso de uso principal) radica en que<strong>&nbsp;la correspondencia de botones cambia din\u00e1micamente seg\u00fan el estado global de la bomba<\/strong>. Si el jugador no tiene errores (0 strikes), el bot\u00f3n rojo puede corresponder a la luz azul; pero si tiene 1 strike, el mapeo cambia.&nbsp;<\/p>\n\n\n\n<p><strong>3.2. Implementaci\u00f3n Hardware<\/strong>&nbsp;<\/p>\n\n\n\n<p>Implementado sobre la placa Arduino Mega, el m\u00f3dulo requiere:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Entradas:<\/strong>&nbsp;4 pulsadores con resistencias&nbsp;<em>Pull-Up<\/em>&nbsp;internas habilitadas por software.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Salidas:<\/strong>&nbsp;4&nbsp;LEDs&nbsp;(Rojo, Azul, Verde, Amarillo) con resistencias limitadoras de 220\u03a9 y un zumbador pasivo para el&nbsp;<em>feedback<\/em>&nbsp;sonoro.&nbsp;<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"442\" height=\"337\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/image-47.png\" alt=\"\" class=\"wp-image-10290\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/image-47.png 442w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/image-47-300x229.png 300w\" sizes=\"auto, (max-width: 442px) 100vw, 442px\" \/><\/figure>\n\n\n\n<p><strong>3.3 Implementaci\u00f3n Software<\/strong>&nbsp;<\/p>\n\n\n\n<p>El m\u00f3dulo&nbsp;<strong>Sim\u00f3n Dice<\/strong>&nbsp;est\u00e1 implementado como una clase que encapsula toda la l\u00f3gica de juego, desde la generaci\u00f3n de secuencias hasta la validaci\u00f3n de entradas con reglas condicionales.&nbsp;<\/p>\n\n\n\n<p><strong><em>A. Inicializaci\u00f3n y Configuraci\u00f3n (<\/em><\/strong><strong><em>begin<\/em><\/strong><strong><em>)<\/em><\/strong>&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Gesti\u00f3n de Pines<\/strong>: Configura los pines de los&nbsp;LEDs&nbsp;como salidas y los botones como entradas utilizando&nbsp;INPUT_PULLUP&nbsp;para aprovechar las resistencias internas del microcontrolador.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Entrop\u00eda<\/strong>: Utiliza&nbsp;randomSeed(analogRead(A0))&nbsp;para asegurar que las secuencias generadas sean diferentes en cada partida, leyendo el ruido el\u00e9ctrico de un pin anal\u00f3gico flotante.&nbsp;<\/li>\n<\/ul>\n\n\n\n<p><strong><em>B. L\u00f3gica de Mapeo Condicional (<\/em><\/strong><strong><em>getMappedColor<\/em><\/strong><strong><em>)<\/em><\/strong>&nbsp;<\/p>\n\n\n\n<p>Este m\u00e9todo es el coraz\u00f3n de la \u00abl\u00f3gica condicional\u00bb del proyecto. No realiza una comparaci\u00f3n directa, sino que traduce el color mostrado a un bot\u00f3n esperado bas\u00e1ndose en el n\u00famero de&nbsp;<strong>strikes<\/strong>&nbsp;actuales:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>0 strikes<\/strong>: Mapea mediante el array&nbsp;map0&nbsp;(ej. Rojo se convierte en Azul).&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>1 strike<\/strong>: Mapea mediante&nbsp;map1&nbsp;(ej. Rojo se convierte en Verde).&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u22652 strikes<\/strong>: Mapea mediante&nbsp;map2&nbsp;(ej. Rojo se convierte en Amarillo).&nbsp;<\/li>\n<\/ul>\n\n\n\n<p><strong><em>C. M\u00e1quina de Estados en&nbsp;<\/em><\/strong><strong><em>update<\/em><\/strong>&nbsp;<\/p>\n\n\n\n<p>El m\u00e9todo&nbsp;update&nbsp;se ejecuta en cada iteraci\u00f3n del&nbsp;loop&nbsp;principal sin detener el procesador. Su flujo se divide en:&nbsp;<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>GENERATE<\/strong>: A\u00f1ade un nuevo paso aleatorio a la secuencia y reinicia el contador para mostrarla.&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>PAUSING<\/strong><strong>&nbsp;y&nbsp;<\/strong><strong>SHOWING<\/strong>: Controlan el tiempo de encendido (500ms) y el intervalo entre&nbsp;LEDs&nbsp;(200ms). Utiliza una variable&nbsp;_timer&nbsp;con&nbsp;millis()&nbsp;para determinar cu\u00e1ndo cambiar de estado sin usar&nbsp;delay().&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>WAITING<\/strong>: Llama a&nbsp;readButtons()&nbsp;para detectar la entrada del jugador.&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Si el bot\u00f3n coincide con el resultado de&nbsp;getMappedColor, avanza al estado&nbsp;FEEDBACK.&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Si falla, env\u00eda una se\u00f1al de error al&nbsp;GameState&nbsp;(strike) y reinicia la visualizaci\u00f3n de la secuencia.&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><strong>FEEDBACK<\/strong>: Mantiene el LED del bot\u00f3n pulsado encendido por 150ms para dar respuesta visual al usuario antes de procesar el siguiente paso.&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"5\" class=\"wp-block-list\">\n<li><strong>ROUND_FLASHING<\/strong><strong>&nbsp;y&nbsp;<\/strong><strong>FLASHING<\/strong>: Son estados de transici\u00f3n est\u00e9tica que ejecutan parpadeos r\u00e1pidos al completar una ronda o el m\u00f3dulo completo, respectivamente.&nbsp;<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"850\" style=\"aspect-ratio: 478 \/ 850;\" width=\"478\" controls src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/simon_dice.mp4\"><\/video><\/figure>\n\n\n\n<p><strong>M\u00f3dulo 3: Cortar Cables<\/strong>&nbsp;<\/p>\n\n\n\n<p><strong>4.1. Casos de Uso y Funcionamiento<\/strong>&nbsp;<\/p>\n\n\n\n<p>Este m\u00f3dulo presenta una serie de 10 cables de distintos colores. El objetivo del desactivador es inutilizar el m\u00f3dulo cortando \u00fanicamente los cables correctos bas\u00e1ndose en un conjunto de reglas l\u00f3gicas. Si el jugador corta un cable que no corresponde, el m\u00f3dulo registrar\u00e1 un error y enviar\u00e1 un STRIKE.&nbsp;<\/p>\n\n\n\n<p><strong>Nota Cr\u00edtica de Funcionamiento:<\/strong>&nbsp;Todas las reglas l\u00f3gicas se eval\u00faan \u00fanica y exclusivamente bas\u00e1ndose en el&nbsp;<strong>estado inicial<\/strong>&nbsp;de la bomba. Los cables que el jugador vaya cortando siguen contando para todas las reglas (por ejemplo, si inicialmente hab\u00eda 2 cables rojos y corta uno, la l\u00f3gica que exige \u00abexactamente 2 rojos\u00bb sigue siendo la v\u00e1lida). El desactivador debe llevar un registro mental o f\u00edsico de la configuraci\u00f3n original.&nbsp;<\/p>\n\n\n\n<p><strong>Instrucciones de Desconexi\u00f3n:<\/strong>&nbsp;En el momento en que una condici\u00f3n se cumpla, se debe ejecutar la acci\u00f3n:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Si hay exactamente 2 cables Rojos:<\/strong>&nbsp;Corta todos los cables Rojos.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Si hay 1 cable Marr\u00f3n y al menos 2 Azules:<\/strong>&nbsp;Corta el cable Marr\u00f3n.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Si hay al menos 1 cable Rojo y uno Negro:<\/strong>&nbsp;Corta el cable Negro.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Si hay 1 cable Verde y un Azul:<\/strong>&nbsp;Corta el cable Azul.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Si hay 1 cable Rojo y un Verde:<\/strong>&nbsp;Corta el cable Rojo.&nbsp;<\/li>\n<\/ul>\n\n\n\n<p><strong>Condici\u00f3n importante:<\/strong>&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Si hay un cable de color BLANCO:<\/strong>&nbsp;Se ignora cualquier otra regla o cable mencionado anteriormente. El desactivador debe cortar \u00fanicamente el cable Blanco, ignorando por completo el resto de&nbsp;colores.&nbsp;<\/li>\n<\/ul>\n\n\n\n<p><strong>4.2. Implementaci\u00f3n Hardware<\/strong>&nbsp;<\/p>\n\n\n\n<p>Implementado sobre la placa Arduino Mega, este m\u00f3dulo se basa en la interrupci\u00f3n de un circuito cerrado:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Entradas:<\/strong>&nbsp;10 cables f\u00edsicos puenteados. Un extremo de cada cable va conectado a un pin com\u00fan de Tierra (GND) y el otro extremo va conectado directamente a pines digitales espec\u00edficos del Arduino Mega (pines 45, 46, 47, 48, 49, 50, 51, 52, 53 y 6).&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Se utilizan las resistencias&nbsp;Pull-Up internas de la placa habilitadas por software, por lo que un cable conectado leer\u00e1 un estado l\u00f3gico LOW (conectado a tierra) y un cable cortado leer\u00e1 un estado HIGH (circuito abierto).&nbsp;<\/li>\n<\/ul>\n\n\n\n<p><strong>4.3 Implementaci\u00f3n Software<\/strong>&nbsp;<\/p>\n\n\n\n<p>El m\u00f3dulo est\u00e1 implementado mediante la clase Cables, la cual encapsula la configuraci\u00f3n de los pines, la evaluaci\u00f3n del estado inicial y el ciclo de validaci\u00f3n de cortes.&nbsp;<\/p>\n\n\n\n<p><strong><em>A. Inicializaci\u00f3n y Configuraci\u00f3n (begin)<\/em><\/strong>&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Gesti\u00f3n de Pines:<\/strong>&nbsp;Itera sobre el array de pines configur\u00e1ndolos como INPUT_PULLUP.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Captura del Estado Inicial:<\/strong>&nbsp;Eval\u00faa cada pin usando&nbsp;digitalRead() == LOW para determinar qu\u00e9 cables est\u00e1n f\u00edsicamente presentes al arrancar la bomba, guardando esta informaci\u00f3n en el array _estadoInicial.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A continuaci\u00f3n, invoca el m\u00e9todo&nbsp;inicializarReglas() para&nbsp;precalcular&nbsp;la soluci\u00f3n.&nbsp;<\/li>\n<\/ul>\n\n\n\n<p><strong><em>B. Evaluaci\u00f3n L\u00f3gica de Reglas (inicializarReglas)<\/em><\/strong>&nbsp;&nbsp;<\/p>\n\n\n\n<p>Este m\u00e9todo act\u00faa como el cerebro del m\u00f3dulo, traduciendo las reglas del manual a l\u00f3gica de c\u00f3digo bas\u00e1ndose en el estado inicial capturado:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Condici\u00f3n de Prioridad M\u00e1xima (Blanco):<\/strong>&nbsp;Revisa primero si el pin asociado al cable blanco (\u00edndice 7) est\u00e1 presente. Si lo est\u00e1, marca exclusivamente este cable en _cableADesconectar&nbsp;y finaliza la evaluaci\u00f3n mediante un&nbsp;return.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Conteo de Colores:<\/strong>&nbsp;Si no hay cable blanco, recorre el estado inicial y clasifica los cables presentes en variables contadoras (verdes, rojos, azules, marrones) seg\u00fan su \u00edndice de hardware.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Cascada Condicional:<\/strong>&nbsp;Eval\u00faa los contadores a trav\u00e9s de una serie de sentencias&nbsp;if&nbsp;que representan fielmente las instrucciones de desconexi\u00f3n. Si una condici\u00f3n es verdadera, marca el \u00edndice (o \u00edndices) correspondientes en el array booleano _cableADesconectar.&nbsp;<\/li>\n<\/ul>\n\n\n\n<p><strong><em>C. Monitoreo y Validaci\u00f3n de Cortes (update)&nbsp;<\/em><\/strong>&nbsp;<\/p>\n\n\n\n<p>El m\u00e9todo&nbsp;update&nbsp;se ejecuta en cada iteraci\u00f3n del ciclo principal de la bomba de forma no bloqueante:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Detecci\u00f3n de Cambios (Cortes):<\/strong>&nbsp;Lee el estado actual de los 10 pines. Si detecta que un pin pasa de estado LOW (Anterior) a HIGH (Actual), significa que el jugador acaba de cortar ese cable.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Validaci\u00f3n de STRIKE:<\/strong>&nbsp;Al detectar un corte, comprueba si ese \u00edndice espec\u00edfico estaba marcado como true en _cableADesconectar. Si no lo estaba, incrementa el contador de fallos (_fallos) y devuelve un evento de error (-1) al sistema central.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Condici\u00f3n de Victoria:<\/strong>&nbsp;Simult\u00e1neamente, verifica que todos los cables que deb\u00edan ser desconectados se encuentren ahora en estado HIGH (cortados). Si es as\u00ed, marca el&nbsp;flag&nbsp;_resolved como true y devuelve 1, indicando que el m\u00f3dulo ha sido desactivado con \u00e9xito.&nbsp;<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"478\" style=\"aspect-ratio: 848 \/ 478;\" width=\"848\" controls src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/cables.mp4\"><\/video><\/figure>\n\n\n\n<p><strong>M\u00f3dulo 4: Memoria<\/strong>&nbsp;<\/p>\n\n\n\n<p><strong>5.1. Casos de Uso y Funcionamiento<\/strong>&nbsp;<\/p>\n\n\n\n<p>Este m\u00f3dulo pone a prueba la memoria del usuario, dado que el objetivo es ir presionando los botones correctos en funci\u00f3n del n\u00famero que se muestra en un&nbsp;display. Hay varias fases y en cada una de ellas cambia el bot\u00f3n que se debe presionar con cada n\u00famero, si se comete un error se vuelve a la primera fase. Para completar este m\u00f3dulo es necesario superar las 5 fases que tiene.&nbsp;<\/p>\n\n\n\n<p><strong>5.2. Implementaci\u00f3n Hardware<\/strong>&nbsp;<\/p>\n\n\n\n<p>Implementado sobre la placa Arduino Mega, el m\u00f3dulo requiere:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Entradas:<\/strong>&nbsp;4 pulsadores con resistencias&nbsp;<em>Pull-Up<\/em>&nbsp;internas habilitadas por software.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Salidas:&nbsp;<\/strong>1&nbsp;display&nbsp;de 7 segmentos.&nbsp;<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"396\" height=\"343\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/image-46.png\" alt=\"\" class=\"wp-image-10285\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/image-46.png 396w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/image-46-300x260.png 300w\" sizes=\"auto, (max-width: 396px) 100vw, 396px\" \/><\/figure>\n\n\n\n<p><strong>5.3 Implementaci\u00f3n Software<\/strong>&nbsp;<\/p>\n\n\n\n<p>El m\u00f3dulo&nbsp;<strong>Memoria<\/strong>&nbsp;est\u00e1 implementado como una clase la cual contiene la l\u00f3gica necesaria para configurar y usar el m\u00f3dulo.&nbsp;<\/p>\n\n\n\n<p><strong><em>A. Inicializaci\u00f3n y Configuraci\u00f3n (<\/em><\/strong><strong><em>begin<\/em><\/strong><strong><em>)<\/em><\/strong>&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Botones (setUpButtons):&nbsp;<\/strong>Se recorre la lista con los pines de los botones, configurando cada pin como entrada con resistencia interna (INPUT_PULLUP).&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Display&nbsp;(setUpSegments):&nbsp;<\/strong>Recorriendo los pines asignados a cada segmento del&nbsp;display&nbsp;se establecen como pines de salida.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Entrop\u00eda<\/strong>: Utiliza&nbsp;randomSeed(analogRead(A0))&nbsp;para asegurar que los n\u00fameros mostrados en el&nbsp;display&nbsp;sean diferentes cada vez que se inicia el m\u00f3dulo, leyendo el ruido de un pin anal\u00f3gico.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Inicializaci\u00f3n de&nbsp;debounce<\/strong>: Se inicializan las estructuras necesarias para el control de rebotes de los botones, almacenando el estado estable, el estado candidato y el tiempo de cambio de cada bot\u00f3n.&nbsp;<\/li>\n<\/ul>\n\n\n\n<p><strong><em>B. Mostrar un numero (<\/em><\/strong><strong><em>showNumber<\/em><\/strong><strong><em>)<\/em><\/strong>&nbsp;<\/p>\n\n\n\n<p>Se obtiene de la lista que contiene las configuraciones para cada n\u00famero la configuraci\u00f3n deseada. Despu\u00e9s se visita los pines de cada segmento. Al mismo tiempo se obtiene el valor de salida del pin de la configuraci\u00f3n, activando y desactivando de esta forma los segmentos para formar el n\u00famero.&nbsp;<\/p>\n\n\n\n<p><strong><em>C. Apagar&nbsp;display<\/em><\/strong><strong><em>(shutDownNumber)<\/em><\/strong>&nbsp;<\/p>\n\n\n\n<p>Un simple m\u00e9todo que desactiva todos los segmentos, visitando el pin de cada segmento y estableci\u00e9ndolo a 0.&nbsp;<\/p>\n\n\n\n<p><strong><em>D. Leer bot\u00f3n activo (readButtons)<\/em><\/strong>&nbsp;<\/p>\n\n\n\n<p>Se recorren los pines de los botones leyendo su estado actual. Para evitar lecturas err\u00f3neas producidas por el rebote mec\u00e1nico, se compara cada lectura con un estado candidato y se utiliza un temporizador para verificar que el cambio se mantiene estable durante un periodo m\u00ednimo (DEBOUNCE_MS).&nbsp;<\/p>\n\n\n\n<p>Cuando se detecta un cambio estable de HIGH a LOW (flanco de bajada), se considera que el bot\u00f3n ha sido pulsado y se devuelve su \u00edndice.&nbsp;En caso de no detectarse ninguna pulsaci\u00f3n v\u00e1lida, se devuelve \u20131.&nbsp;<\/p>\n\n\n\n<p><strong><em>E. Comprobar si el bot\u00f3n pulsado es correcto (checkAnswer)<\/em><\/strong>&nbsp;<\/p>\n\n\n\n<p>Recibiendo la fase en la que se encuentra el m\u00f3dulo, el n\u00famero que se ha mostrado y el bot\u00f3n pulsado, se comprueba si el bot\u00f3n pulsado es el correcto. Esta comprobaci\u00f3n se realiza obteniendo el \u00edndice del bot\u00f3n que deber\u00eda haber sido pulsado con la fase y el n\u00famero, y compar\u00e1ndolo con el \u00edndice del bot\u00f3n pulsado.&nbsp;<\/p>\n\n\n\n<p><strong><em>F. Desarrollo del juego y cambios de fase (Update)<\/em><\/strong>&nbsp;<\/p>\n\n\n\n<p>Para empezar, se comprueba si el m\u00f3dulo ya ha sido completado previamente. En caso contrario, el funcionamiento del juego se controla mediante una m\u00e1quina de estados no bloqueante.&nbsp;<\/p>\n\n\n\n<p>En el estado inicial se genera un n\u00famero aleatorio y se muestra en el&nbsp;display. A continuaci\u00f3n, el sistema pasa a un estado de espera de entrada, donde se comprueba continuamente si se ha pulsado alg\u00fan bot\u00f3n mediante el m\u00e9todo con&nbsp;debounce.&nbsp;<\/p>\n\n\n\n<p>Cuando se detecta una pulsaci\u00f3n, se comprueba si el bot\u00f3n es correcto. En caso de ser incorrecto, el&nbsp;display&nbsp;se apaga y se devuelve un error. Si es correcto, el&nbsp;display&nbsp;se apaga y se inicia una pausa de 1 segundo, antes de continuar.&nbsp;<\/p>\n\n\n\n<p>Cada fase est\u00e1 compuesta por 6&nbsp;subrondas. Tras cada acierto se avanza a la siguiente&nbsp;subronda. Una vez completadas las 6&nbsp;subrondas, se realiza una pausa de 2 segundos que indica el cambio de fase.&nbsp;<\/p>\n\n\n\n<p>El proceso contin\u00faa hasta completar las 5 fases.&nbsp;Una vez finalizadas todas, el m\u00f3dulo pasa al estado de completado e informa de que el juego ha sido superado.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"478\" style=\"aspect-ratio: 848 \/ 478;\" width=\"848\" controls src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/memoria.mp4\"><\/video><\/figure>\n\n\n\n<p><strong>M\u00f3dulo 5: M\u00f3dulo \u00abNeedy\u00bb (Descargar Capacitor)<\/strong>&nbsp;<\/p>\n\n\n\n<p><strong>6.1. Casos de Uso y Funcionamiento<\/strong>&nbsp;<\/p>\n\n\n\n<p>A diferencia del resto de m\u00f3dulos que son est\u00e1ticos, el \u00abNeedy\u00bb es un m\u00f3dulo as\u00edncrono y de interrupci\u00f3n cognitiva. De forma aleatoria (entre 3 y 10 segundos), el m\u00f3dulo exige atenci\u00f3n encendiendo un LED y emitiendo un sonido r\u00e1pido y agudo.&nbsp;El caso de uso exige que el jugador&nbsp;<strong>mantenga pulsado<\/strong>&nbsp;un bot\u00f3n de descarga durante exactamente 2 segundos continuos antes de que pasen 10 segundos.&nbsp;Si suelta el bot\u00f3n antes, debe volver a empezar. Si se acaba el tiempo, se suma un&nbsp;<em>strike<\/em>.&nbsp;<\/p>\n\n\n\n<p><strong>6.2. Implementaci\u00f3n Hardware<\/strong>&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Entradas:<\/strong>&nbsp;1 pulsador f\u00edsico (INPUT_PULLUP).&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Salidas:<\/strong>&nbsp;1 LED indicador de atenci\u00f3n y un zumbador dedicado.&nbsp;<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"457\" height=\"313\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/image-45.png\" alt=\"\" class=\"wp-image-10286\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/image-45.png 457w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/image-45-300x205.png 300w\" sizes=\"auto, (max-width: 457px) 100vw, 457px\" \/><\/figure>\n\n\n\n<p><strong>6.3 Implementaci\u00f3n Software<\/strong>&nbsp;<\/p>\n\n\n\n<p>El m\u00f3dulo&nbsp;<strong>Needy<\/strong>&nbsp;act\u00faa como una tarea as\u00edncrona de mantenimiento que requiere atenci\u00f3n peri\u00f3dica del jugador.&nbsp;<\/p>\n\n\n\n<p><strong><em>A. Control de Activaci\u00f3n Aleatoria (<\/em><\/strong><strong><em>refreshInterval<\/em><\/strong><strong><em>)<\/em><\/strong>&nbsp;<\/p>\n\n\n\n<p>El m\u00f3dulo no est\u00e1 activo constantemente. En el estado&nbsp;IDLE, espera un tiempo aleatorio entre 3 y 10 segundos (IDLE_MIN_MS&nbsp;y&nbsp;IDLE_MAX_MS) antes de entrar en fase de alerta.&nbsp;<\/p>\n\n\n\n<p><strong><em>B. Gesti\u00f3n de Entradas con&nbsp;Debouncing&nbsp;(<\/em><\/strong><strong><em>btnJustPressed<\/em><\/strong><strong><em>&nbsp;y&nbsp;<\/em><\/strong><strong><em>btnHeld<\/em><\/strong><strong><em>)<\/em><\/strong>&nbsp;<\/p>\n\n\n\n<p>A diferencia de una lectura simple, el c\u00f3digo implementa dos tipos de detecci\u00f3n para el mismo bot\u00f3n:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>btnJustPressed<\/strong>: Detecta el momento exacto en que el bot\u00f3n es presionado (flanco de bajada) tras 50ms de estabilidad.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>btnHeld<\/strong>: Verifica continuamente si el bot\u00f3n permanece en estado bajo (LOW) durante el proceso de descarga.&nbsp;<\/li>\n<\/ul>\n\n\n\n<p><strong><em>C. Flujo de la M\u00e1quina de Estados<\/em><\/strong>&nbsp;<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>IDLE<\/strong>: El m\u00f3dulo est\u00e1 \u00abdormido\u00bb. Solo monitorea el tiempo para su pr\u00f3xima activaci\u00f3n.&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>ATTENTION<\/strong>: Es el estado de urgencia.&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Activa el parpadeo del LED y sonidos de alerta mediante un c\u00e1lculo de m\u00f3dulo (elapsed&nbsp;% 400 &lt; 200) para crear una onda cuadrada de parpadeo sin bloqueos.&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Si pasan 10 segundos (ATTENTION_TIMEOUT_MS) sin que el jugador act\u00fae, el m\u00e9todo retorna&nbsp;-1&nbsp;para sumar un strike.&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>HOLDING<\/strong>: Se activa cuando el jugador presiona el bot\u00f3n.&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Debe mantenerse por 2 segundos (HOLD_REQUIRED_MS).&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Si el jugador suelta el bot\u00f3n (!btnHeld()), el estado regresa a&nbsp;ATTENTION, obligando a reiniciar la descarga.&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>Si se completa el tiempo, retorna&nbsp;1&nbsp;(\u00e9xito), apaga los indicadores y vuelve a&nbsp;IDLE.&nbsp;<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"478\" style=\"aspect-ratio: 848 \/ 478;\" width=\"848\" controls src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/needy.mp4\"><\/video><\/figure>\n\n\n\n<p><strong>Problemas y Soluciones<\/strong>&nbsp;<\/p>\n\n\n\n<p>El desarrollo e implementaci\u00f3n del proyecto B.O.M.B.A ha supuesto un reto significativo, no solo desde la perspectiva de la l\u00f3gica de programaci\u00f3n, sino especialmente en la fase de integraci\u00f3n f\u00edsica. A lo largo del ciclo de vida del proyecto, se identificaron y resolvieron diversas problem\u00e1ticas, siendo las m\u00e1s cr\u00edticas aquellas relacionadas con las limitaciones de hardware y la concurrencia del sistema.&nbsp;<\/p>\n\n\n\n<p><strong>7.1. Limitaci\u00f3n de Pines y Escalabilidad del Hardware<\/strong>&nbsp;<\/p>\n\n\n\n<p>Durante las fases iniciales del proyecto, se adopt\u00f3 una metodolog\u00eda de desarrollo modular y en paralelo. Cada integrante del equipo fue responsable de dise\u00f1ar, programar y testear su respectivo m\u00f3dulo de manera independiente. En esta etapa, las pruebas se realizaron utilizando&nbsp;la Arduino UNO proporcionada en el kit de la asignatura&nbsp;(con un n\u00famero limitado de entradas y salidas), y todos los subsistemas funcionaron a la perfecci\u00f3n en entornos aislados.&nbsp;<\/p>\n\n\n\n<p>Sin embargo, el primer obst\u00e1culo de gran magnitud surgi\u00f3 en la fase de integraci\u00f3n. Al intentar unificar los cinco m\u00f3dulos simult\u00e1neos (Sim\u00f3n Dice,&nbsp;Needy, Memoria, Morse y Cables) en una \u00fanica placa, la demanda total de pines GPIO (General&nbsp;Purpose&nbsp;Input\/Output) super\u00f3 con creces la capacidad de un microcontrolador est\u00e1ndar. La suma de pantallas de 7 segmentos, registros de desplazamiento,&nbsp;LEDs&nbsp;individuales, potenci\u00f3metros, zumbadores y la extensa matriz de botones, interruptores y cables hizo inviable la conexi\u00f3n conjunta.&nbsp;<\/p>\n\n\n\n<p><strong>Soluci\u00f3n:<\/strong>&nbsp;Para resolver esta limitaci\u00f3n de escalabilidad, fue imperativo adquirir y migrar todo el sistema a la placa Arduino Mega. Esta plataforma proporciona un n\u00famero significativamente mayor de pines digitales y anal\u00f3gicos, lo que nos permiti\u00f3 alojar todos los componentes de los cinco m\u00f3dulos sin necesidad de recurrir a arquitecturas excesivamente complejas de multiplexaci\u00f3n que habr\u00edan comprometido la velocidad de respuesta del sistema.&nbsp;&nbsp;<\/p>\n\n\n\n<p><strong>7.2. Complejidad del Ensamblaje F\u00edsico y Falsos Contactos<\/strong>&nbsp;<\/p>\n\n\n\n<p>El principal cuello de botella del proyecto radic\u00f3 en el hardware durante la fase de montaje final. La convivencia de cinco m\u00f3dulos operando simult\u00e1neamente requiri\u00f3 un volumen masivo de cableado. A nivel f\u00edsico, esto gener\u00f3 un entramado de conexiones cruzadas de alta densidad que result\u00f3 ser extremadamente sensible.&nbsp;<\/p>\n\n\n\n<p>Este \u00ablaberinto\u00bb de cables deriv\u00f3 en numerosos problemas de conductividad y falsos contactos. En un sistema tan interconectado, el m\u00e1s m\u00ednimo movimiento en la estructura provocaba que algunos pines quedaran \u00abflotantes\u00bb durante milisegundos- Una simple vibraci\u00f3n o un cable ligeramente suelto en la&nbsp;protoboard&nbsp;era interpretado por el microcontrolador como un corte intencionado, lo que imped\u00eda el desarrollo normal del sistema.&nbsp;<\/p>\n\n\n\n<p><strong>Soluci\u00f3n:<\/strong>&nbsp;Se tuvo que llevar a cabo un proceso de saneamiento exhaustivo del cableado. Se reestructuraron las conexiones, agrupando las l\u00edneas l\u00f3gicas, asegurando firmemente los puentes en las placas de pruebas y revisando meticulosamente las conexiones a tierra (GND) comunes para evitar ruidos par\u00e1sitos. Adem\u00e1s, se reforz\u00f3 la robustez mec\u00e1nica del montaje para garantizar que la manipulaci\u00f3n del jugador durante el juego no afectara a la estabilidad el\u00e9ctrica de los componentes internos.&nbsp;<\/p>\n\n\n\n<p><strong>7.3. Concurrencia de Software y Depuraci\u00f3n Cruzada<\/strong>&nbsp;<\/p>\n\n\n\n<p>A los problemas f\u00edsicos se sum\u00f3 el reto de la integraci\u00f3n del software. Ejecutar cinco m\u00f3dulos de alta exigencia temporal (como el&nbsp;<em>Needy<\/em>, que requiere atenci\u00f3n as\u00edncrona, o el&nbsp;<em>Morse<\/em>, que emite se\u00f1ales continuas sin bloquear el sistema) en un \u00fanico hilo de ejecuci\u00f3n requiri\u00f3 una orquestaci\u00f3n sumamente precisa.&nbsp;&nbsp;<\/p>\n\n\n\n<p>La conjunci\u00f3n de los fallos de&nbsp;hardware&nbsp;mencionados anteriormente con la concurrencia del software dificult\u00f3 enormemente la localizaci\u00f3n de los errores (depuraci\u00f3n cruzada). En ocasiones, un comportamiento an\u00f3malo del software parec\u00eda ser un fallo de programaci\u00f3n, cuando en realidad era un falso contacto en un pin de lectura.&nbsp;<\/p>\n\n\n\n<p><strong>Soluci\u00f3n:<\/strong>&nbsp;Para garantizar la estabilidad, fue necesario realizar una&nbsp;revisi\u00f3n&nbsp;exhaustiva del c\u00f3digo fuente. Se revis\u00f3 l\u00ednea por l\u00ednea el bucle principal (loop) y la m\u00e1quina de estados de cada m\u00f3dulo para asegurar una ejecuci\u00f3n estrictamente no bloqueante (eliminando cualquier uso de funciones como&nbsp;delay()). Esta estricta organizaci\u00f3n estructural y metodol\u00f3gica permiti\u00f3 aislar el comportamiento l\u00f3gico del f\u00edsico, lo que facilit\u00f3 identificar si un error proven\u00eda de una ca\u00edda de tensi\u00f3n, un pin desconectado o una transici\u00f3n de estado incorrecta en el c\u00f3digo. Tras este intenso trabajo de depuraci\u00f3n conjunta, se logr\u00f3 estabilizar el sistema obteniendo una bomba completamente funcional y fiable.&nbsp;<\/p>\n\n\n\n<p><strong>Lista de Materiales y Costes<\/strong>&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Material<\/strong>&nbsp;<\/td><td><strong>Coste<\/strong>&nbsp;<\/td><\/tr><tr><td><strong>Arduino Mega<\/strong>&nbsp;<\/td><td>25 \u20ac&nbsp;<\/td><\/tr><tr><td><strong>Pantalla LCD<\/strong>&nbsp;<\/td><td>6 \u20ac&nbsp;<\/td><\/tr><tr><td><strong>Cables de distintos tipos y&nbsp;protoboards&nbsp;extra<\/strong>&nbsp;<\/td><td>15 \u20ac&nbsp;<\/td><\/tr><tr><td><strong>Kit de botones con tapas de colores<\/strong>&nbsp;<\/td><td>8,50 \u20ac&nbsp;<\/td><\/tr><tr><td><strong>Pintura negra<\/strong>&nbsp;<\/td><td>4 \u20ac&nbsp;<\/td><\/tr><tr><td><strong>Caja de madera<\/strong>&nbsp;<\/td><td>Prestada&nbsp;<\/td><\/tr><tr><td><strong>Display&nbsp;de 7 segmentos de 1 y 4 d\u00edgitos<\/strong>&nbsp;<\/td><td>Kit de clase&nbsp;<\/td><\/tr><tr><td><strong>LEDs&nbsp;de distintos colores<\/strong>&nbsp;<\/td><td>Kit de clase&nbsp;<\/td><\/tr><tr><td><strong>Potenci\u00f3metro<\/strong>&nbsp;<\/td><td>Kit de clase&nbsp;<\/td><\/tr><tr><td><strong>74HC595<\/strong>&nbsp;<\/td><td>Kit de clase&nbsp;<\/td><\/tr><tr><td><strong>Resistencias de distintos valores<\/strong>&nbsp;<\/td><td>Kit de clase&nbsp;<\/td><\/tr><tr><td><strong>Buzzer<\/strong>&nbsp;<\/td><td>Kit de clase&nbsp;<\/td><\/tr><tr><td><strong>Total<\/strong>&nbsp;<\/td><td><strong>58,5 \u20ac<\/strong>&nbsp;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><strong>Anexo: C\u00f3digo fuente<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include \"SimonDice.h\"\n#include \"Cables.h\"\n#include \"Morse.h\"\n#include \"Memoria.h\"\n#include \"Needy.h\"\n#include &lt;Wire.h&gt;\n#include &lt;LiquidCrystal_I2C.h&gt;\n\n\/\/ --- CONSTANTES DE CONFIGURACI\u00d3N GLOBAL ---\nconst unsigned long TIME_LIMIT_MS = 300000; \nconst uint8_t MAX_STRIKES = 3; \n\n\/\/ ESTADO DEL JUEGO (Anteriormente en GameState)\nunsigned long startTime = 0;\nbool gameStarted = false;\nint numStrikes = 0;\nbool isModuleSolved&#091;] = {false, false, false, false};\nuint8_t simonLeds&#091;] = {22, 23, 24, 25};\nuint8_t simonBtns&#091;] = {26, 28, 27, 29};\nuint8_t simonBuzzer = 30;\nSimonDice simonModule(simonLeds, simonBtns, simonBuzzer);\n\n\/\/ 1 - CORTAR CABLES\nuint8_t cableWires&#091;] = {45, 46, 47, 48, 49, 50, 51, 52, 53, 6};\nbool cableInitialState&#091;] = {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH};\nCables cablesModule(cableWires, cableInitialState);\n\n\/\/ 2 - C\u00d3DIGO MORSE\nMorse morseModule;\n\n\/\/ 3 - MEMORIA\nMemoria memoriaModule;\n\n\/\/ 4 - NEEDY\nuint8_t needyBtn    = 42;\nuint8_t needyLed    = 39;\nuint8_t needyBuzzer = 30;\nNeedy needyModule(needyBtn, needyLed, needyBuzzer);\n\n\/\/ LCD\nLiquidCrystal_I2C lcd(0x27, 16, 2);\nint lastLcdSeconds = -1;\nint lastLcdStrikes = -1;\n\nunsigned long getTimeRemaining() {\n    if (!gameStarted) return TIME_LIMIT_MS;\n    unsigned long elapsed = millis() - startTime;\n    if (elapsed &gt;= TIME_LIMIT_MS) return 0;\n    return TIME_LIMIT_MS - elapsed;\n}\n\nbool isGameOver() {\n    return (getTimeRemaining() == 0 || numStrikes &gt;= MAX_STRIKES);\n}\n\nbool isGameWon() {\n    \/\/ Needy no cuenta para la victoria, es un modulo de mantenimiento\n    for(int i=0; i&lt;4; i++){\n        if(isModuleSolved&#091;i] == false) return false;\n    }\n    return true;\n}\n\nvoid updateLCD() {\n    unsigned long timeRemaining = getTimeRemaining();\n    int secondsTotal = timeRemaining \/ 1000;\n    \n    if (secondsTotal != lastLcdSeconds || numStrikes != lastLcdStrikes) {\n        lastLcdSeconds = secondsTotal;\n        lastLcdStrikes = numStrikes;\n        \n        int minutes = secondsTotal \/ 60;\n        int seconds = secondsTotal % 60;\n        \n        lcd.setCursor(0, 0);\n        lcd.print(\"TIEMPO: \");\n        if (minutes &lt; 10) lcd.print(\"0\");\n        lcd.print(minutes);\n        lcd.print(\":\");\n        if (seconds &lt; 10) lcd.print(\"0\");\n        lcd.print(seconds);\n        \n        lcd.setCursor(0, 1);\n        lcd.print(\"STRIKES: \");\n        lcd.print(numStrikes);\n        lcd.print(\"\/\");\n        lcd.print(MAX_STRIKES);\n    }\n}\n\nvoid solveModuleOutput(int mOutput, uint8_t moduleIndex) {\n    switch(mOutput){\n        case 1:\n            \/\/ Needy (moduleIndex 4) no se marca como resuelto permanentemente\n            if (moduleIndex &lt; 4) {\n                isModuleSolved&#091;moduleIndex] = true;\n            }\n            break;\n        case -1:\n            numStrikes++;\n            break;\n    }\n}\n\nvoid setup() {\n    Wire.begin(); \n    lcd.init();\n    lcd.backlight();\n\n    simonModule.begin();\n    cablesModule.begin();\n    morseModule.begin();\n    memoriaModule.begin();\n    needyModule.begin();\n    \n    startTime = millis();\n    gameStarted = true;\n}\n\nvoid loop() {\n    if (isGameOver()) {\n        updateLCD();\n        lcd.setCursor(0, 0);\n        lcd.print(\"   GAME OVER    \");\n        return; \n    }\n\n    if (isGameWon()) {\n        lcd.setCursor(0, 0);\n        lcd.print(\"    YOU WIN!    \");\n        return; \n    }\n\n    updateLCD();\n\n    solveModuleOutput(simonModule.update(numStrikes), 0);\n    solveModuleOutput(cablesModule.update(), 1);\n    solveModuleOutput(morseModule.update(isModuleSolved&#091;2]), 2);\n    solveModuleOutput(memoriaModule.update(isModuleSolved&#091;3]), 3);\n    solveModuleOutput(needyModule.update(isGameOver(), isGameWon()), 4);\n}<\/code><\/pre>\n\n\n\n<p>El resto del c\u00f3digo se encuentra disponible en nuestro repositorio de github: <a href=\"https:\/\/github.com\/jae9104\/SistemasEmpotrados-TiempoReal\">github.com\/jae9104\/SistemasEmpotrados-TiempoReal<\/a><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introducci\u00f3n al Sistema&nbsp; El proyecto B.O.M.B.A. es un sistema interactivo basado en hardware y software que adapta a la realidad f\u00edsica la mec\u00e1nica central del videojuego cooperativo&nbsp;Keep&nbsp;Talking&nbsp;and&nbsp;Nobody&nbsp;Explodes. El objetivo fundamental es la creaci\u00f3n de&#46;&#46;&#46;<\/p>\n","protected":false},"author":337,"featured_media":10296,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-10271","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-proyectos"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Proyecto B.O.M.B.A - Proyectos con Arduino.<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/video-de-desactivacion-completa\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Proyecto B.O.M.B.A - Proyectos con Arduino.\" \/>\n<meta property=\"og:description\" content=\"Introducci\u00f3n al Sistema&nbsp; El proyecto B.O.M.B.A. es un sistema interactivo basado en hardware y software que adapta a la realidad f\u00edsica la mec\u00e1nica central del videojuego cooperativo&nbsp;Keep&nbsp;Talking&nbsp;and&nbsp;Nobody&nbsp;Explodes. El objetivo fundamental es la creaci\u00f3n de&#046;&#046;&#046;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/video-de-desactivacion-completa\/\" \/>\n<meta property=\"og:site_name\" content=\"Proyectos con Arduino.\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-05T21:52:36+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-05T22:19:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/portada_post.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1566\" \/>\n\t<meta property=\"og:image:height\" content=\"1244\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"seytrmo2526g09\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"seytrmo2526g09\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"27 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/video-de-desactivacion-completa\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/video-de-desactivacion-completa\\\/\"},\"author\":{\"name\":\"seytrmo2526g09\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/person\\\/157817393a4701a9788f8d52b9c6d8bf\"},\"headline\":\"Proyecto B.O.M.B.A\",\"datePublished\":\"2026-05-05T21:52:36+00:00\",\"dateModified\":\"2026-05-05T22:19:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/video-de-desactivacion-completa\\\/\"},\"wordCount\":5118,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/video-de-desactivacion-completa\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2026\\\/05\\\/portada_post.jpg\",\"articleSection\":[\"Proyectos\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/video-de-desactivacion-completa\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/video-de-desactivacion-completa\\\/\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/video-de-desactivacion-completa\\\/\",\"name\":\"Proyecto B.O.M.B.A - Proyectos con Arduino.\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/video-de-desactivacion-completa\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/video-de-desactivacion-completa\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2026\\\/05\\\/portada_post.jpg\",\"datePublished\":\"2026-05-05T21:52:36+00:00\",\"dateModified\":\"2026-05-05T22:19:12+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/video-de-desactivacion-completa\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/video-de-desactivacion-completa\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/video-de-desactivacion-completa\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2026\\\/05\\\/portada_post.jpg\",\"contentUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2026\\\/05\\\/portada_post.jpg\",\"width\":1566,\"height\":1244},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/video-de-desactivacion-completa\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Proyecto B.O.M.B.A\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#website\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\",\"name\":\"Proyectos con Arduino.\",\"description\":\"Blog de proyectos de Arduino de alumnos de la URJC\",\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\",\"name\":\"Universidad Rey Juan Carlos\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/05\\\/logourjc-1.jpg\",\"contentUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/05\\\/logourjc-1.jpg\",\"width\":745,\"height\":288,\"caption\":\"Universidad Rey Juan Carlos\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/person\\\/157817393a4701a9788f8d52b9c6d8bf\",\"name\":\"seytrmo2526g09\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d86ac4a05305b41ef7a2399536146baa6eca4715a23e7f43b2f99c829de759dc?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d86ac4a05305b41ef7a2399536146baa6eca4715a23e7f43b2f99c829de759dc?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d86ac4a05305b41ef7a2399536146baa6eca4715a23e7f43b2f99c829de759dc?s=96&d=mm&r=g\",\"caption\":\"seytrmo2526g09\"},\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/author\\\/seytrmo2526g09\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Proyecto B.O.M.B.A - Proyectos con Arduino.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blogs.etsii.urjc.es\/dseytr\/video-de-desactivacion-completa\/","og_locale":"es_ES","og_type":"article","og_title":"Proyecto B.O.M.B.A - Proyectos con Arduino.","og_description":"Introducci\u00f3n al Sistema&nbsp; El proyecto B.O.M.B.A. es un sistema interactivo basado en hardware y software que adapta a la realidad f\u00edsica la mec\u00e1nica central del videojuego cooperativo&nbsp;Keep&nbsp;Talking&nbsp;and&nbsp;Nobody&nbsp;Explodes. El objetivo fundamental es la creaci\u00f3n de&#46;&#46;&#46;","og_url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/video-de-desactivacion-completa\/","og_site_name":"Proyectos con Arduino.","article_published_time":"2026-05-05T21:52:36+00:00","article_modified_time":"2026-05-05T22:19:12+00:00","og_image":[{"width":1566,"height":1244,"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/portada_post.jpg","type":"image\/jpeg"}],"author":"seytrmo2526g09","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"seytrmo2526g09","Tiempo de lectura":"27 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/video-de-desactivacion-completa\/#article","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/video-de-desactivacion-completa\/"},"author":{"name":"seytrmo2526g09","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/person\/157817393a4701a9788f8d52b9c6d8bf"},"headline":"Proyecto B.O.M.B.A","datePublished":"2026-05-05T21:52:36+00:00","dateModified":"2026-05-05T22:19:12+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/video-de-desactivacion-completa\/"},"wordCount":5118,"commentCount":0,"publisher":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/video-de-desactivacion-completa\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/portada_post.jpg","articleSection":["Proyectos"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/video-de-desactivacion-completa\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/video-de-desactivacion-completa\/","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/video-de-desactivacion-completa\/","name":"Proyecto B.O.M.B.A - Proyectos con Arduino.","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/video-de-desactivacion-completa\/#primaryimage"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/video-de-desactivacion-completa\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/portada_post.jpg","datePublished":"2026-05-05T21:52:36+00:00","dateModified":"2026-05-05T22:19:12+00:00","breadcrumb":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/video-de-desactivacion-completa\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/video-de-desactivacion-completa\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/video-de-desactivacion-completa\/#primaryimage","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/portada_post.jpg","contentUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/portada_post.jpg","width":1566,"height":1244},{"@type":"BreadcrumbList","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/video-de-desactivacion-completa\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/blogs.etsii.urjc.es\/dseytr\/"},{"@type":"ListItem","position":2,"name":"Proyecto B.O.M.B.A"}]},{"@type":"WebSite","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#website","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/","name":"Proyectos con Arduino.","description":"Blog de proyectos de Arduino de alumnos de la URJC","publisher":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.etsii.urjc.es\/dseytr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization","name":"Universidad Rey Juan Carlos","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/logo\/image\/","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/logourjc-1.jpg","contentUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/logourjc-1.jpg","width":745,"height":288,"caption":"Universidad Rey Juan Carlos"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/person\/157817393a4701a9788f8d52b9c6d8bf","name":"seytrmo2526g09","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/d86ac4a05305b41ef7a2399536146baa6eca4715a23e7f43b2f99c829de759dc?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/d86ac4a05305b41ef7a2399536146baa6eca4715a23e7f43b2f99c829de759dc?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d86ac4a05305b41ef7a2399536146baa6eca4715a23e7f43b2f99c829de759dc?s=96&d=mm&r=g","caption":"seytrmo2526g09"},"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/author\/seytrmo2526g09\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/10271","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/users\/337"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/comments?post=10271"}],"version-history":[{"count":4,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/10271\/revisions"}],"predecessor-version":[{"id":10303,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/10271\/revisions\/10303"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media\/10296"}],"wp:attachment":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media?parent=10271"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/categories?post=10271"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/tags?post=10271"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}