🎤 PROYECTO: SAFETY BOX – Caja
fuerte electrónica con Arduino
👥 Presentación del equipo
Buenos
días, somos el grupo Phantom Technology y hoy les presentamos nuestro
proyecto titulado “Safety Box”, una caja fuerte electrónica controlada
con Arduino y un teclado 4x4.
Nuestro objetivo fue crear un sistema de seguridad inteligente, económico y
funcional, aplicando nuestros conocimientos de electrónica y programación.
💭 Motivación del proyecto
Decidimos
desarrollar esta caja fuerte porque queríamos combinar la robótica con un
propósito práctico y real: proteger objetos personales o materiales
escolares.
Además, queríamos demostrar que con herramientas accesibles como el
Arduino, se pueden construir sistemas útiles que promuevan la innovación, el
aprendizaje y la creatividad.
⚙️ Descripción general del proyecto
“Safety
Box” es una caja fuerte digital controlada por un teclado 4x4 y un servomotor.
El sistema permite ingresar una contraseña; si el código es correcto, el servo
se activa y la caja se abre.
Si el código es incorrecto, se enciende un LED amarillo y la caja permanece
cerrada.
Todo esto controlado desde el Arduino, que interpreta cada tecla y ejecuta las
acciones según la programación.
🧩 Componentes utilizados
|
Componente |
Función |
|
Arduino Uno |
Controla toda la lógica del
sistema y coordina las señales. |
|
Teclado 4x4 |
Permite ingresar la contraseña
numérica. |
|
Servo motor SG90 |
Simula la apertura y cierre del
mecanismo de la caja. |
|
LED verde |
Indica acceso correcto (caja abierta). |
|
LED amarillo |
Indica error en la contraseña
(caja bloqueada). |
|
Protoboard y cables |
Permiten realizar las
conexiones sin soldadura. |
🎯 Objetivo general
Diseñar y
programar una caja fuerte electrónica que permita la apertura solo
mediante un código correcto, demostrando conocimientos de electrónica y lógica
de control con Arduino.
🔹 Objetivos específicos
- Aplicar programación
estructurada para gestionar una contraseña.
- Usar componentes
electrónicos básicos en un sistema de seguridad.
- Aprender de los errores de
montaje y codificación para optimizar el diseño.
- Demostrar cómo un sistema
simple puede cumplir una función práctica.
💡 Funcionamiento
Al
encender el sistema, el Arduino muestra en el monitor serial el mensaje “Ingresa
el código”.
El usuario digita los números en el teclado:
·
Si el
código ingresado es correcto (en nuestro caso “2707”), el servo gira 90° y la
caja se abre.
·
Si es
incorrecto, se enciende el LED amarillo y el sistema indica “Código
incorrecto”.
Luego de tres segundos, el servo regresa a su posición inicial y la caja vuelve
a quedar cerrada.
👨💻 CÓDIGO
EXPLICADO
#include <Keypad.h>
#include <Servo.h>
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7,
6};
byte colPins[COLS] = {5, 4, 3,
2};
Keypad keypad = Keypad(makeKeymap(keys),
rowPins, colPins, ROWS, COLS);
Servo miServo;
// Configuración
const String PASSWORD =
"123";
String buffer = "";
const int SERVO_PIN = 10;
const int LED_VERDE = 11;
const int LED_ROJO = 12;
const int ANGULO_ABIERTO = 90;
const int ANGULO_CERRADO = 0;
void setup() {
Serial.begin(9600);
miServo.attach(SERVO_PIN);
miServo.write(ANGULO_CERRADO);
pinMode(LED_VERDE, OUTPUT);
pinMode(LED_ROJO, OUTPUT);
digitalWrite(LED_VERDE, LOW);
digitalWrite(LED_ROJO, LOW);
Serial.println("Listo. Ingresa la contraseña y presiona # para
confirmar.");
}
void loop() {
char key = keypad.getKey();
if (key) {
if (key == '#') {
Serial.println();
comprobarPassword();
} else if (key == '*') {
buffer = "";
miServo.write(ANGULO_CERRADO);
digitalWrite(LED_VERDE, LOW);
digitalWrite(LED_ROJO, LOW);
Serial.println("\nReiniciado. Servo
a 0.");
} else if (key == 'D') {
if (buffer.length() > 0) {
buffer.remove(buffer.length() - 1);
}
Serial.print("\rEntrada: ");
for (unsigned int i = 0; i <
buffer.length(); i++) Serial.print('*');
} else {
buffer += key;
Serial.print('*');
}
}
}
void comprobarPassword() {
Serial.print("Comprobando... ");
if (buffer == PASSWORD) {
Serial.println("OK");
abrirServo();
} else {
Serial.println("INCORRECTA");
falloPassword();
}
buffer = "";
}
void abrirServo() {
miServo.write(ANGULO_ABIERTO);
digitalWrite(LED_VERDE, HIGH);
digitalWrite(LED_ROJO, LOW);
Serial.println("Servo movido a 90° y LED verde encendido.");
// Si quieres que se cierre solo después de unos segundos, descomenta:
// delay(5000);
// miServo.write(ANGULO_CERRADO);
// digitalWrite(LED_VERDE, LOW);
}
void falloPassword() {
digitalWrite(LED_VERDE, LOW);
digitalWrite(LED_ROJO, HIGH);
Serial.println("LED rojo encendido (contraseña incorrecta).");
// Parpadeo rápido para enfatizar el error
for (int i = 0; i < 3; i++) {
digitalWrite(LED_ROJO, HIGH);
delay(200);
digitalWrite(LED_ROJO, LOW);
delay(200);
}
}
🔍 EXPLICACIÓN DEL CÓDIGO
Este código está escrito en C++,
el lenguaje base de Arduino, y representa un excelente ejemplo de programación estructurada y sistemas embebidos.
Su función es controlar la apertura y cierre de una caja fuerte electrónica a
través de un teclado matricial, dos LEDs y un servomotor.
El programa se basa en un ciclo continuo de
lectura y respuesta a las acciones del usuario, lo que lo convierte en un
sistema reactivo e interactivo.
Cada parte del código cumple un propósito específico, combinando lógica
digital, control de hardware y retroalimentación visual.
⚙️ Tipo de programación
Este proyecto utiliza programación estructurada e imperativa, lo que significa
que las instrucciones se ejecutan paso a paso siguiendo una lógica ordenada.
Además, al usar objetos de librerías como Servo y Keypad, también
implementa conceptos de programación
orientada a objetos.
💡 En resumen:
·
Imperativa:
le indica al microcontrolador exactamente qué hacer y en qué orden.
·
Estructurada:
separa las tareas en bloques lógicos como funciones (setup(), loop(),
abrirServo()...).
·
Reactiva:
responde constantemente a las entradas del teclado.
·
Orientada
a objetos (parcialmente): usa objetos como miServo y keypad
para controlar hardware.
🧩 Estructuras principales del programa
|
Estructura |
Función dentro
del código |
Ejemplo |
|
Variables y constantes |
Guardan datos fijos o temporales (pines, contraseña,
ángulos) |
|
|
Condicionales (if / else) |
Deciden si la contraseña es correcta o incorrecta |
|
|
Funciones |
Organizan el código en tareas específicas |
|
|
Bucle repetitivo (loop) |
Mantiene el sistema activo para siempre |
|
|
Repetición controlada (for) |
Genera parpadeo del LED rojo en caso de error |
|
|
Objetos |
Representan componentes físicos (servo, teclado) |
|
|
Arreglos y matrices |
Organizan las teclas del teclado 4x4 |
|
🧱 Explicación paso a paso del código
1️⃣
Inclusión
de librerías
#include <Keypad.h>#include <Servo.h>
Estas librerías agregan funcionalidades
específicas:
·
Keypad.h permite leer teclas del teclado
matricial 4x4.
·
Servo.h controla el movimiento del
servomotor.
Ambas librerías se basan en clases y métodos, lo que aplica
principios de orientación a objetos.
2️⃣
Declaración
del teclado
const byte ROWS = 4;const byte COLS = 4;char keys[ROWS][COLS] = { ... };byte rowPins[ROWS] = {9, 8, 7, 6};byte colPins[COLS] = {5, 4, 3, 2};
Aquí se define la estructura física del
teclado:
·
Se crea una matriz bidimensional con los caracteres de cada tecla.
·
Se asignan los pines del Arduino a las filas y
columnas.
·
Luego, se inicializa el objeto keypad
con esta información.
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
3️⃣
Configuración
de pines y componentes
const int SERVO_PIN = 10;const int LED_VERDE = 11;const int LED_ROJO = 12;
Estas líneas definen los pines que usará el
Arduino para conectar el servo y los LEDs.
Los #define
o const
se utilizan para dar nombres simbólicos a valores que no cambiarán.
4️⃣
Función setup()
void setup() { Serial.begin(9600); miServo.attach(SERVO_PIN); miServo.write(ANGULO_CERRADO); pinMode(LED_VERDE, OUTPUT); pinMode(LED_ROJO, OUTPUT);}
Esta parte del programa se ejecuta una sola vez al encender la placa:
·
Inicializa la comunicación serial.
·
Conecta el servo a su pin y lo deja cerrado.
·
Configura los LEDs como salidas.
·
Muestra un mensaje de inicio en el monitor
serial.
👉 Esta función cumple la fase de inicialización del sistema.
5️⃣
Función loop()
void loop() { char key = keypad.getKey(); if (key) { ... }}
Este es el corazón del programa.
El bucle loop()
se ejecuta constantemente, verificando si una tecla fue presionada.
Si detecta una entrada, analiza qué tipo de tecla fue y ejecuta la acción
correspondiente:
·
# → confirma y verifica la contraseña.
·
* → reinicia todo y apaga los LEDs.
·
D → borra el último carácter ingresado.
·
Números → se agregan al buffer (se muestran como
“*” en la consola).
Aquí se aplican estructuras condicionales y secuenciales para manejar
los posibles eventos.
6️⃣
Función comprobarPassword()
void comprobarPassword() { if (buffer == PASSWORD) { abrirServo(); } else { falloPassword(); }}
Compara la contraseña digitada con la
almacenada en la variable PASSWORD.
Si coincide, abre el servo; si no, ejecuta la rutina de error.
📘 Esta parte usa estructuras condicionales anidadas para
evaluar resultados.
7️⃣
Función abrirServo()
void abrirServo() { miServo.write(ANGULO_ABIERTO); digitalWrite(LED_VERDE, HIGH); digitalWrite(LED_ROJO, LOW);}
Mueve el servo a 90°, lo que representa la apertura de la caja, y
enciende el LED verde.
También puede cerrarse automáticamente si se descomenta el delay()
y el servo.write(0).
💡 Aquí se controla
directamente el hardware desde el software, lo que es el núcleo de los sistemas
embebidos.
8️⃣
Función falloPassword()
void falloPassword() { digitalWrite(LED_VERDE, LOW); digitalWrite(LED_ROJO, HIGH); for (int i = 0; i < 3; i++) { digitalWrite(LED_ROJO, HIGH); delay(200); digitalWrite(LED_ROJO, LOW); delay(200); }}
Enciende el LED rojo y hace que parpadee tres veces, indicando error.
Usa una estructura repetitiva “for”
que se ejecuta tres veces con pausas controladas por delay().
🧠 Estructuras de programación utilizadas
|
Tipo |
Descripción |
Ejemplo |
|
Secuencial |
Instrucciones ejecutadas una tras otra. |
|
|
Condicional |
Toma decisiones según la lógica del programa. |
|
|
Repetitiva |
Ejecuta un bloque varias veces. |
|
|
Modular |
Divide el programa en funciones. |
|
|
Orientada a objetos |
Controla el hardware mediante clases. |
|
|
Eventos (interactiva) |
Reacciona a acciones del usuario. |
|
🌱 Aprendizaje técnico y sostenible
El desarrollo de este código fortalece
competencias en:
·
Lógica de
control y flujo, aplicando condiciones y bucles.
·
Uso
responsable de recursos electrónicos, reutilizando componentes y
reduciendo desperdicio.
·
Trabajo
colaborativo, ya que depurar el código exigió pruebas, comunicación y
mejora continua.
Con este proyecto, el grupo Phantom Technology
demuestra cómo la educación tecnológica
y la innovación sostenible
pueden integrarse para crear soluciones seguras, accesibles y responsables con
el entorno.
⚙️ DIFICULTADES Y ERRORES DURANTE
EL PROYECTO
Este
proyecto no fue perfecto desde el inicio. Tuvimos varios errores que nos
ayudaron a entender mejor cómo funciona Arduino y cómo depurar fallos reales.
1. Error
en las conexiones del teclado 4x4:
Al
principio conectamos mal los pines de las filas y columnas, lo que provocaba
que el Arduino leyera teclas incorrectas.
Lo solucionamos revisando el datasheet del teclado y reorganizando los cables
en la protoboard.
2. Servo
sin movimiento:
En una
prueba, el servo no respondía. El problema fue que compartíamos el mismo pin
con otro componente. Cambiamos el pin a uno PWM (pin 10) y funcionó
correctamente.
3.
Contraseña no reconocida:
Tuvimos
errores al comparar la contraseña porque olvidamos incluir la librería Password.h y el código no evaluaba correctamente.
Después de incluirla y reiniciar el monitor serial, el sistema empezó a
funcionar.
4. LED
encendido permanentemente:
El LED
amarillo quedaba encendido después de un intento fallido.
Agregamos la línea digitalWrite(LED_AMARILLO,
LOW) cuando
el código era correcto para reiniciar su estado.
5. Fallo
de comunicación serial:
En
algunos intentos, los mensajes no se veían en el monitor serial.
Descubrimos que era porque no teníamos configurada la velocidad correcta en Serial.begin(9600) y el monitor serial en la misma velocidad.
Todos
estos errores nos enseñaron a diagnosticar problemas reales, usar el
multímetro, revisar la lógica del programa y validar cada componente por
separado.
🌱 APORTE AL DESARROLLO SOSTENIBLE
Aunque
sea un prototipo pequeño, Safety Box está alineado con varios Objetivos
de Desarrollo Sostenible (ODS):
📘 ODS 4 – Educación de calidad
Fomenta
el aprendizaje práctico, impulsa la educación tecnológica y ayuda a comprender
principios de robótica, electrónica y programación.
Enseña a los estudiantes que se aprende más haciendo, fallando y corrigiendo.
⚙️ ODS 9 – Industria, innovación e
infraestructura
Promueve
la cultura de la innovación y el desarrollo de proyectos tecnológicos
accesibles.
Al trabajar con Arduino, se demuestra cómo la tecnología puede ser usada para
crear soluciones reales sin necesidad de grandes recursos.
🔋 ODS 12 – Producción y consumo
responsables
Los
componentes como el Arduino, el teclado y el servo pueden reutilizarse en
otros proyectos, lo que evita desperdicio electrónico.
Es un ejemplo de economía circular educativa, donde nada se desecha,
solo se transforma.
🧩 ODS 11 – Ciudades y comunidades
sostenibles
Este tipo
de proyectos puede evolucionar hacia sistemas de seguridad domésticos o
escolares sostenibles, accesibles para comunidades con pocos recursos.
💬 Preguntas y respuestas
1. ¿Qué aprendieron
con los errores?
Que
equivocarse no es perder tiempo. Cada fallo nos ayudó a entender mejor el
funcionamiento del Arduino y a pensar de forma lógica y ordenada.
2. ¿Por
qué este proyecto es sostenible?
Porque
enseña tecnología sin desperdiciar materiales, reutiliza componentes y fomenta
la educación práctica.
3. ¿Qué
mejorarían?
Agregaríamos
una pantalla LCD, un sistema de bloqueo por tiempo después de varios intentos
fallidos y una alarma sonora.
4. ¿Qué
representa “Safety Box” para ustedes?
Representa
aprendizaje, trabajo en equipo y la satisfacción de convertir una idea en algo
que realmente funciona.
🧭 Conclusión
“Safety
Box” no es solo una caja fuerte, es un proyecto educativo con propósito.
Representa el esfuerzo, la curiosidad y la constancia de nuestro grupo.
Aprendimos a programar, a montar circuitos, a identificar errores y, sobre
todo, a entender que la tecnología también puede ser sostenible, accesible y
educativa.
“Safety
Box” es una muestra de que innovar no significa tener muchos recursos, sino
saber aprovechar los que se tienen.