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 EMPLEADOSPRECIO
Servomotor4€
Teclado Matricial6€
Caja de cartón1€
Lata de pintura2,30€
Cinta de doble cara1,70€
Cinta Americana1,99€
Touch Sensor0€
Potenciómetro0€
Módulo LCD 16020€
Placa Base0€
Placa de Arduino0€
Pines y Cables0€
Plástico0€
Total16,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.

VIDEO EXPLICATIVO

También te podría gustar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *