Caja Fuerte implementada con Sensor de Contacto
AUTORAS
Trabajo hecho por:
- ANA BELÉN ALBA MEDINA
- EVA CARBAJO BURGOS
- MARÍA GARCÍA VEGA
INTRODUCCIÓN
Nuestro proyecto se basa en la construcción de una pequeña caja fuerte cuya apertura consistirá en la comprobación de una contraseña y el reconocimiento mediante un sensor de contacto. La caja pedirá una contraseña que debe ser correcta, y si cumple este requisito, usaremos el sensor como señal para desbloquear la puerta de la caja fuerte. En caso de que la contraseña sea incorrecta, este sensor no recibirá ninguna señal y, por lo tanto, no abrirá la puerta hasta que pongas bien la contraseña.
OBJETIVOS
- Creación de una caja fuerte básica con seguridad aumentada.
- Conocimiento y familiaridad con los componentes.
- Creación de un proyecto base con mayor utilidad en un futuro.
- Puesta en común y preferencias en el diseño del proyecto
MATERIALES Y COMPONENTES
Esta es la lista de materiales que hemos usado.
COMPONENTES EMPLEADOS | PRECIO |
---|---|
Servomotor | 4€ |
Teclado Matricial | 6€ |
Caja de cartón | 1€ |
Lata de pintura | 2,30€ |
Cinta de doble cara | 1,70€ |
Cinta Americana | 1,99€ |
Touch Sensor | 0€ |
Potenciómetro | 0€ |
Módulo LCD 1602 | 0€ |
Placa Base | 0€ |
Placa de Arduino | 0€ |
Pines y Cables | 0€ |
Plástico | 0€ |
Total | 16,99€ |
IMPLEMENTACIÓN
DISEÑO PROTOTIPO
Primero hemos diseñado a mano unos primeros prototipos de lo que sería nuestra caja.
Esta primera imagen muestra una primera idea de la caja fuerte, una caja con una pantalla que nos indicaría que usáramos nuestra huella dactilar, y un detector de huella dactilar para usar nuestras huellas para abrir la caja fuerte. Esta idea fue descartada cuando nos dimos cuenta de que no teníamos un sensor de huellas sino un sensor de contacto.
La segunda imagen muestran mejor la idea final que habíamos diseñado. Al carecer de sensor de huella, la idea cambiaría a una caja fuerte con contraseña y que sólo se abra al tocar ese sensor. Este funcionamiento consiste en suministrar una contraseña que active la capacidad del sensor de recibir la señal de contacto. Por lo tanto, es el sensor el que abre finalmente la puerta a través de un servomotor.
Y la última imagen es el diseño definitivo que teníamos pensado construir.
DIAGRAMA DE ESTADOS
HARDWARE
El teclado matricial 3×4, es decir, 3 filas y 4 columnas, lo que indica que hay 12 teclas. Al presionar una tecla, se activa una conexión entre una fila y una columna específicas, y permite identificar qué tecla se ha presionado.
Para suministrar energía y cerrar el circuito usamos cables para unir de la Placa Arduino los pines 5V y GND a la Protoboard y así poder conectar los pines de Tierra y Potencia de cada uno de los componentes. El Módulo LCD está también conectado a este suministro con sus pines de LED y estos permiten controlar la retroiluminación de la pantalla junto al potenciómetro, que está conectado tanto al suministro como a la pantalla.
El resto del circuito se basa en las señales de los componentes conectados a Arduino para ejecutar las operaciones específicas en el código. El Módulo LCD recibe información a través de conexiones específicas para enseñar lo que queremos escribir de nuestro código. Y cada componente, como el teclado matricial, el sensor de contacto y el servomotor, envía señales a Arduino, que luego interpreta según el código programado para realizar las acciones correspondientes. En este caso, el Sensor de Contacto enviará una señal a Arduino para que este envié otra señal que permitirá que el servomotor se mueva para desbloquear la puerta. Y para bloquearla de nuevo, se pulsará un botón que enviará otra señal al servomotor para que bloquee la puerta.
CÓDIGO
#include <Keypad.h> //Librería Matriz 4x4
#include <LiquidCrystal.h> //Librería LCD
#include <Servo.h> //Librería Servo
Servo myservo; //Crear objeto de servomotor
char c1, c2, c3, c4,cc; //Declaración caracteres contraseña
char p1, p2, p3, p4; //Declaración carácteres contraseña predeterminada
char w1,w2,w3,w4; //Declaración carácteres cambio de contraseña
char aux1, aux2, aux3, aux4; //Delcaración carácteres confirmación de contraseña
int tim = 250; //variable de tiempo
const byte ROWS = 4; //Numero de filas
const byte COLS = 3; //Número de columnas
char hexaKeys[ROWS][COLS] = {
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'},
{'*', '0', '#'}
};
byte rowPins[ROWS] = {13,12,11,10}; //Pines de conexión de filas matriz
byte colPins[COLS] = {9,8,7}; //Pines de conexión columnas matriz
// Define el pin de entrada analógica
int valorSensor;
//Incialización de función matriz
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
//Inicialización de librerías LCD
LiquidCrystal lcd(0,1,2,3,4,5); //Pines conectados del LCD
void setup() {
myservo.attach(6); //Declaración de conexión de servomotor
lcd.begin(16,2); //inicialización LCD
lcd.clear(); //Borrar Pantall LCD
lcd.setCursor(0,0); //Posicion de caracter LCD 0,0
lcd.print("INTRODUCE CODIGO"); //Impresión pantalla
lcd.setCursor(6,1); //Posicion de caracter LCD 6,1
//Valores contraseña por defecto
p1='1';
p2='2';
p3='3';
p4='4';
}
void loop() {
myservo.write(90);
leerCodigo(&c1, &c2, &c3, &c4);
if (c1!=0 && c2!=0 && c3!=0 && c4!=0){ //función que se inicia cuando los 4 caracteres son guarddos
if (c1==p1 && c2==p2&& c3==p3&& c4==p4){
//lcd.clear();
lcd.clear();
lcd.setCursor(4,0); //Posicion de caracter LCD 0,0
lcd.write("CODIGO");
lcd.setCursor(4,1); //Posición Caracter LCD 0,1
lcd.print ("CORRECTA"); //Impresión correcto en el LCD
lcd.clear();
lcd.setCursor(4,0); //Posicion de caracter LCD 0,0
lcd.write("ESPERANDO");
lcd.setCursor(0,1); //Posición Caracter LCD 0,1
lcd.print ("CONFIRMACION...");
valorSensor = analogRead(A5); //Leer el valor del touch sensor
int estado = (valorSensor > 800) ? 1:0; //Estado del touch sensor segun su valor
unsigned long tiempoInicio = millis(); //Guardar el tiempo actual
unsigned long tiempoActual = millis(); //Guardar el tiempo actual
int tiempo = ((tiempoActual - tiempoInicio) > 5000) ? 1:0; //Guardar si han transcurrido mas de 5 segundos
while (!estado){
tiempoActual = millis();
tiempo = ((tiempoActual - tiempoInicio) > 5000) ? 1:0; //Actualizar el valor del tiempo transucrrido
if (tiempo){ //Si pasan mas de 5 segundos sale del bucle
break;
} else {
valorSensor = analogRead(A5); //Actualizar el valor del sensor
estado = (valorSensor > 800) ? 1:0;
}
}
if (!tiempo){ //Si no han transcurrido mas de 5 segundos y se ha confirmado la apertura
lcd.clear();
lcd.write("ABRIENDO CAJA...");
delay(1000);
myservo.write(0);
delay(250);
myservo.write(90);//Move Servo a 0 Grados para abrir la caja fuerte
lcd.clear();
lcd.print("\"#\" CERRAR ");
lcd.setCursor(0,1);
lcd.print("\"*\" CAMBIAR CODIGO ");
c1=0;
c2=0;
c3=0;
c4=0;
cc=0;
while (!cajaCerrada()){
lcd.clear();
lcd.print("\"#\" CERRAR ");
lcd.setCursor(0,1);
lcd.print("\"*\" CAMBIAR COD ");
cc=0;
}
} else { //Si han transcurrido mas de 5 segundos vuelve a pedir la contraseña
lcd.clear(); //Borrar pantalla
lcd.setCursor(0,0); //Posicion de caracter LCD 0,0
lcd.print("INTRODUCE CODIGO"); //Impresión pantalla
lcd.setCursor(6,1);
c1=0;
c2=0;
c3=0;
c4=0;
}
} else { //Codigo incorrecto
lcd.clear();
lcd.setCursor(4,0); //Posucuón Carácter LCD 0,1
lcd.print("CODIGO"); //Impresión INCORRECTO en LCD
lcd.setCursor(4,1); //Posición Caracter LCD 0,1
lcd.print ("INCORRECTO"); //Impresión correcto en el LCD
delay(1000); //Delay 1 segundo
lcd.clear(); //Borrar pantalla
lcd.setCursor(0,0); //Posicion de caracter LCD 0,0
lcd.print("INTRODUCE CODIGO"); //Impresión pantalla
lcd.setCursor(6,1);
c1=0;
c2=0;
c3=0;
c4=0;
}
}
}
boolean cajaCerrada(){
char customClose = customKeypad.getKey(); //Lectura Matriz
while (!customClose){
customClose = customKeypad.getKey(); //Espera de un dato de la Matriz
}
if (cc==0){
cc=customClose;
lcd.print(cc);
delay(1000);
}
if (cc=='#'){ //Cerrar la caja
lcd.clear();
lcd.write("CERRANDO CAJA...");
delay(1000);
myservo.write(180);
delay(250);
myservo.write(90);
lcd.clear();
lcd.write("CAJA CERRADA");
delay(1500);
lcd.clear();
lcd.write("INTRODUCE CODIGO:");
lcd.setCursor(6,1);
return true;
} else if (cc='*') { //Cambiar contraseña
lcd.clear();
lcd.write("NUEVO CODIGO:");
lcd.setCursor(6,1);
cambiarPsw();
return false;
} else{
return false;
}
}
void cambiarPsw() {
leerCodigo(&w1, &w2, &w3, &w4);
if (w1==0 || w2==0 || w3==0 || w4==0){
cambiarPsw();
} else { //Confirmación del código
lcd.clear();
lcd.write("CONFIRMA CODIGO:");
lcd.setCursor(6,1);
confirmPsw();
}
//Restablecer valores
w1=0;
w2=0;
w3=0;
w4=0;
aux1=0;
aux2=0;
aux3=0;
aux4=0;
}
void confirmPsw() {
leerCodigo(&aux1, &aux2, &aux3, &aux4);
if (aux1==0 || aux2==0 || aux3==0 || aux4==0){
confirmPsw();
}
if (aux1==w1 && aux2==w2 && aux3==w3 && aux4==w4){ //Confirmación correcta
p1=w1;
p2=w2;
p3=w3;
p4=w4;
lcd.clear();
lcd.setCursor(4,0); //Posucuón Carácter LCD 0,1
lcd.print("CODIGO"); //Impresión INCORRECTO en LCD
lcd.setCursor(4,1); //Posición Caracter LCD 0,1
lcd.print ("CAMBIADO"); //Impresión correcto en el LCD
delay(1000); //Delay 1 segundo
} else { //Confirmación incorrecta
lcd.clear();
lcd.setCursor(0,0); //Posucuón Carácter LCD 0,1
lcd.print("ERROR AL"); //Impresión INCORRECTO en LCD
lcd.setCursor(0,1); //Posición Caracter LCD 0,1
lcd.print ("CAMBIAR CODIGO"); //Impresión correcto en el LCD
delay(1000); //Delay 1 segundo
}
}
void leerCodigo(char *a1, char *a2, char *a3, char *a4){
char customKey = customKeypad.getKey(); //Lectura Matriz
while (!customKey){
customKey = customKeypad.getKey(); //Espera de un dato de la Matriz
}
if (*a1==0){
*a1=customKey; //Guardar 1er caracter en C1
lcd.print(*a1); //Imprimir C1 en LCD
}
else if (*a2==0){
*a2=customKey; //Guardar 2er caracter en C2
lcd.print(*a2); //Imprimir C2 en LCD
}
else if (*a3==0){
*a3=customKey; //Guardar 3er caracter en C3
lcd.print(*a3); //Imprimir C3 en LCD
}
else if (*a4==0){
*a4=customKey; //Guardar 4o caracter en C4
lcd.print(*a4); //Imprimir C4 en LCDC
delay(1000); //Delay 1 segundo
}
}
CONSTRUCCIÓN
Primero hemos recortado con un cúter unos agujeros en la caja de cartón para poder colocar la pantalla y el teclado matricial, y hemos construido una puerta creando una estructura similar a la de una caja fuerte.
Posteriormente, lo hemos decorado con pintura en spray para obtener un resultado más realista.
Después, tras haber realizado a parte el circuito con Arduino, lo hemos colocado cuidadosamente dentro de la caja.
Y, por último, comprobamos su correcto funcionamiento.
FUNCIONALIDAD
El funcionamiento es el siguiente: usamos el teclado matricial para introducir el código para activar el sensor de contacto, mientras se envían señales al Módulo LCD para mostrar su información. Al activarse el sensor, usaremos el dedo para enviar una señal a la Placa Arduino mientras, por dentro, el código hará sus funciones para enviar otra señal al Servomotor para que se active.
Después para cerrar la caja se pulsará otro botón, que enviará otra señal para activar de nuevo el Servomotor.
También podemos cambiar la contraseña pulsando otro botón, la contraseña nueva necesita una confirmación para poder cambiarla.
PROBLEMAS Y SOLUCIONES
Uno de los problemas que nos hemos encontrado han sido que no teníamos un sensor de huella digital y su coste no era asequible. Hemos tenido que cambiarlo por el Touch Sensor que nos venía en la caja de herramientas.
Otro problema que nos encontramos fue que la pantalla no funcionaba bien, debido a que no hacía un correcto contacto con los cables. Hemos arreglado esto usando cinta americana para unir mejor los cables a los conectores ya que la opción de soldar no era asequible debido a que el material pertenece a la universidad.
Después tuvimos otro que fue con el servomotor, pues no conseguíamos ajustar bien los grados que tenía que rotar. Esto lo arreglamos informándonos en cuanto a los valores que debíamos modificar y empleando la técnica de prueba y error poniendo datos que se ajustasen a lo que buscábamos.
Y por último, al tener todas las entradas digitales ocupadas por los componentes, no había más espacio para conectar el Touch Sensor, por lo que tuvimos que adaptar las entradas analógicas a salidas digitales para poder conectar este componente.