Caja Fuerte con Arduino

AUTORES

Gonzalo Torres Huamantica

Arismendy Castillo González

Dipendra Shamser Kunwor Khadka

INTRODUCCIÓN

El proyecto que hemos realizado los miembros del grupo 7 de Vicálvaro es un modelo de caja fuerte. A la hora de elegir el trabajo a realizar consultamos varias ideas, como la de una pantalla para visualizar mensajes y colores, pero tras recomendación de los profesores decidimos descartar el resto de ideas y continuar con lo que se convirtió en el proyecto final.

MATERIALES UTILIZADOS

MaterialPrecio
Placa Arduino UnoProporcionada por la URJC
Teclado 4×45,77€
Servomotor SG907,10€
2 Luces LED Proporcionados por la URJC
Resistencia 10K ΩProporcionado por la URJC
10 Cables Jumper M-M1,75€
10 Cables Jumper M-H1,75€
Pila 12V1,5€
3 Láminas Cartón Pluma6,75€
Pantalla LCD I2C6,99€
Mini ProtoboardProporcionada por la URJC
Alfileres0€

MONTAJE DEL PROYECTO

En primer lugar, se realizaron las conexiones apropiadas en la placa Arduino y en la protoboard para el correcto funcionamiento del prototipo. Una vez hecho esto, se eligieron unas medidas para la caja, calculándolas sobre unas láminas de cartón pluma, el material elegido para su construcción por su fácil manejo.

Tras elegir las medidas, se cortaron las láminas para dar forma a las distintas caras de la caja y se hicieron los agujeros correspondientes para ubicar la pantalla LCD, las luces led, el teclado numérico y la entrada de conexiones de la placa Arduino.

Ranura para conectar la placa Arduino al ordenador

Para juntar toda la estructura se usaron alfileres en las uniones de las caras, y por dentro se hizo una especie de compartimento para separar la circuitería del resto del habitáculo.

Plano cenital del interior de la caja
Interior de la caja finalizada

CÓDIGO FUENTE DEL PROYECTO

A continuación se mostrará el código que se ejecuta en la placa Arduino para el funcionamiento de la caja fuerte:

// LCD configuración
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
#include <Servo.h>
#include <Keypad.h>


// Variables
int numIntentos = 0;      // Contador de intentos
int mot_min = 90;          // Ángulo mínimo del servo
int mot_max = 0;         // Ángulo máx del servo 
int pulsoMax = 1000;
int pulsoMin = 2000;
int indice = 0;
int indiceClaveMaestra = 0;

// Cogemos 16 porque es el número de columnas que hay en el LCD para comparar las claves
const int lcdLength = 16; 
// Intentos Máximos
const int intentosMax = 3;   
   
// Arrays
char clave[lcdLength];
char claveMaestra[lcdLength] =  "0000";  

//Pins
Servo myservo;
int pinServo = 13;     // Pin del Servo Motor
int VERDE = 10;        // Pin del led verde
int ROJO = 11;         // Pin del led rojo 


//Keypad config
const byte ROWS = 4; //cuatro filas
const byte COLS = 4; //cuatro columnas

//definir los símbolos del teclado
char keys[ROWS][COLS] = {    // define la distribucion de teclas
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; //conectar a los pines de las filas del teclado
byte colPins[COLS] = {5, 4, 3, 2}; //conectar a los pines de las columnas del teclado


//inicializar una clase llamada NewKeypad
Keypad teclado = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS); 


void setup(){
   
   myservo.attach(pinServo, pulsoMin, pulsoMax); //Inicializamos el Servo
   myservo.write(mot_min);  //Cierra la puerta
   
   //Inicializar el LCD y escribir el texto de inicio
   lcd.init();
   lcd.backlight();
   bienvenido();
   delay(2000);
   solicitarClave(clave);  

   pinMode(ROJO, OUTPUT);  // El pin del led rojo es de salida
   pinMode(VERDE, OUTPUT); // El pin del led verde es de salida
}


void loop(){ 
  
  digitalWrite(ROJO, HIGH);  // Al inicio el led rojo se encuentra apagado (lógica negativa)
  digitalWrite(VERDE, HIGH); // Al inicio el led verde se encuentra apagado (lógica negativa)
  
  char tecla = teclado.getKey(); // Esta función lee la tecla hemos pulsado

  if(tecla && indice <= 4){   
    clave[indice]= tecla;
    lcd.setCursor(6+indice,1);
    lcd.print(tecla);
    delay(200);
    indice++;
  }

  while(indice == 4){
    if(!strcmp(clave, claveMaestra)){    // Compara clave ingresada con clave maestra
        digitalWrite(VERDE, LOW);        // Enciende led verde
        abrirCaja();
        delay(1000);
        digitalWrite(VERDE, HIGH);       // Apaga led verde
        indice = 5;
    }else{ 
        error();
        digitalWrite(ROJO, LOW);         // Enciende led rojo
        delay(1500);
        digitalWrite(ROJO, HIGH);        // Apaga led rojo
        solicitarClave(clave);
        indice = 0;
    }
  }

  if(tecla == 'B' && indice == 5){
    bloquearCaja();
    delay(1000);
    solicitarClave(clave);
    indice = 0;
  }

  if(tecla == 'C' && indice == 5){
    cambiarClave();
    indice++;
  }

  while(indice == 6){
    if(indiceClaveMaestra <= 4){
      tecla = teclado.getKey();
    
      if(tecla){
        lcd.setCursor(6+indiceClaveMaestra,1);
        lcd.print(tecla);
        delay(200);
        claveMaestra[indiceClaveMaestra] = tecla;
        clave[indiceClaveMaestra] = tecla;
        indiceClaveMaestra++;
      }  
    }
  
    if(indiceClaveMaestra == 4){
      lcd.clear();
      lcd.setCursor(1,0);
      lcd.print("CLAVE CAMBIADA");
      delay(1500);
      solicitarClave(clave);
      indice = 0; 
      indiceClaveMaestra = 0;
    }
  }

}

// Funciones

void bienvenido(){
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("BIENVENIDO");
}

void solicitarClave(char clave[]){
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("CLAVE DE ACCESO:");
   limpiarClave();
}

void limpiarClave(){
  lcd.setCursor(6,1);
  lcd.print("****");
}

void abrirCaja(){
  lcd.clear();
  lcd.setCursor(2,0);
  lcd.print("PIN CORRECTO");
  myservo.write(mot_max);
  delay(1500);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("B: BLOQUEAR");
  lcd.setCursor(0,1);
  lcd.print("C: CAMBIAR CLAVE");
}

void error(){
  lcd.clear();
  lcd.setCursor(1,0);
  lcd.print("PIN INCORRECTO");
}

void bloquearCaja(){
  lcd.clear();
  lcd.setCursor(2,0);
  lcd.print("CAJA CERRADA");
  myservo.write(mot_min);
}

void cambiarClave(){
  lcd.clear();
  lcd.setCursor(2,0);
  lcd.print("NUEVA CLAVE:");
  lcd.setCursor(6,1);
  lcd.print("****");

PROBLEMAS Y SOLUCIONES

Compramos una pila de 9V y al poco tiempo de uso, no tenía potencia suficiente para que el servo funcionase, así que decidimos de comprar una pila de mayor voltaje.

Tuvimos problemas a la hora de acomodar el circuito y los cables en el interior de la caja, y como solución se nos ocurrió hacer un compartimento en el interior para separarlos.

VÍDEO EXPLICATIVO

Para terminar, dejamos un vídeo con una explicación más detallada del código, así como de la parte hardware y una pequeña demostración del funcionamiento.

También te podría gustar...

1 respuesta

  1. LEX dice:

    Buenas tardes. Me gusto mucho tu proyecto. Me gustaría preguntar ¿Que pasa después de hacer el número de intentos máximos? ¿Se bloque por algún tiempo o como?

Deja una respuesta

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