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
Material | Precio |
---|---|
Placa Arduino Uno | Proporcionada por la URJC |
Teclado 4×4 | 5,77€ |
Servomotor SG90 | 7,10€ |
2 Luces LED | Proporcionados por la URJC |
Resistencia 10K Ω | Proporcionado por la URJC |
10 Cables Jumper M-M | 1,75€ |
10 Cables Jumper M-H | 1,75€ |
Pila 12V | 1,5€ |
3 Láminas Cartón Pluma | 6,75€ |
Pantalla LCD I2C | 6,99€ |
Mini Protoboard | Proporcionada por la URJC |
Alfileres | 0€ |
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.
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.
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.
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?