Documentos de Académico
Documentos de Profesional
Documentos de Cultura
CERRADURA ELECTRONICA
INGENIERÍA MECATRONICA
FACULTAD DE TECNOLOGIAS
UNIVERSIDAD TECNOLOGICA DE PEREIRA
09/07/2019
1. INTRODUCCION
Con el propósito de afianzar los conceptos vistos en clase, se realiza una cerradura electrónica la
cual es creada a partir de un micro controlador PIC 16F887, este a su vez nos permite explorar sus
capacidades, esto para realizar la programación propuesta para el proyecto; enfocando el programa
a ciertas condiciones relacionadas con el uso de los periféricos, como los son la pantalla LCD, un
teclado matricial y un banco de relés para trabaja con el actuador.
2. OBJETIVOS
Para realizar el proyecto se tiene que conocer un poco más sobre sus componentes, dado que sus
características permiten darle usos particulares propuestos por el usuario.
Un micro controlador es un circuito integrado programable, capaz de ejecutar las órdenes grabadas
en su memoria. Está compuesto de varios bloques funcionales, los cuales cumplen una tarea
específica. Un micro controlador incluye en su interior las tres principales unidades funcionales de
una computadora: unidad central de procesamiento, memoria y periféricos de entrada/salida. El
proyecto usa un micro controlador PIC 16f887, el cual posee las siguientes características:
1. Posee 40 pines.
2. Máxima frecuencia con reloj externo de 20 MHz.
3. Oscilador interno programable con un máximo de 8 MHz.
4. 36 pines usados como I/O digites programables.
5. 8K por 14 bits de memoria de programa.
6. Memoria EEPROM de 256 bytes.
7. Memoria RAM 368 bytes.
8. Conversor análogo/digital de 10 bits.
9. 2 temporizadores-contadores internos.
10. 2 módulos de comparación analógica.
11. Salida para PWM.
12. Puertos de comunicación tipo RS232, RS485, SPI y I2 C.
13. Alimentación de 5.5v a 20v.
La configuración de los pines se demuestra en la figura 1, este posee 5 puertos configurables (A, B,
C, D, E) de los cuales uno de ellos tiene pull-ups internos configurables.
El proyecto usa uno de los temporizadores/contadores internos, en este caso el timer 0. El módulo
Timer0 es un temporizadores/contadores de 8 bits con las siguientes características:
Cuando se usa este módulo, el Timer0 puede ser usado como un temporizador de 8 bits o un
contador de 8 bits.
Para almacenar datos como las contraseñas de usa la memoria EEPROM; Este un tipo de memoria
ROM que puede ser programada, borrada y reprogramada eléctricamente, a diferencia de la EPROM
que ha de borrarse mediante un aparato que emite rayos ultravioleta. Son memorias no volátiles.
En el dispositivo usado PIC 16f887, la memoria de 256 bytes usa espacios de 8 bits, para escribir y
leer, los cuales almacenan información usada por el programa que es necesario almacenar de forma
permanente o temporal, aun si el dispositivo es desenrizado.
4. Desarrollo del proyecto:
El proyecto consiste en que por medio de una pantalla LCD y un teclado matricial de 4x4, podamos
introducir una clave para abrir una cerradura, en el llegado caso que nos equivoquemos nos indique
que la clave es la incorrecta; adicional a las condiciones anteriores este sistema también debe poder
cambiar clave, y almacenar la clave nueva de forma permanente en la memoria del micro
controlador, asiendo entender que así no haya luz o el sistema re inicie este aun tendrá la
contraseña nueva guardada.
4.1. Código:
Para realizar el proyecto de analizaron algunas fuentes con el propósito de conocer una forma
factible de desarrollar el código. Para el trabajo se tenía en cuenta de las estructuras más
importantes era el manejo de memoria, el uso de interrupciones y manejo de temporizadores.
Primero para el código se usa la configuración interna como se muestra en la figura 2, esta muestra
la configuración básica de los fusibles, configuración de puertos, velocidad del reloj interno y
librerías.
Encabezado:
Interrupciones: -Fusibles.
_TIMER0 como temporizador. -librerías.
-Configuración de puertos como I/O.
-Variables Globales.
Con el orden del a estructura principal, se puede navegar en el programa; este posee 281 líneas. El
Si hay clave la asigna
Inicio del Programa: como la cave por defecto.
-Verifica si hay clave Bucle principal:
almacenada. -inicia el programa
pidiendo la clave.
Si no la hay pone la - es posible cambiar
clave por defecto que es de modo.
1234.
Si la clave es correcta:
-Activa indicador azul, activa Modo A (Por defecto): Modo B: Cambio
relé para el actuador (3 seg). ingreso de clave. de clave.
-Reinicia variables.
////////////////////////////////////////////////////////////////////////////////////////////////////////
#INCLUDE <16F887.H>
#FUSES NOWDT, NOPUT, INTRC_IO, NOMCLR, NOPROTECT, NOBROWNOUT, NOWRT
#USE DELAY (clock = 8MHZ)
#INCLUDE <LCD.C>
#INCLUDE <KBD4X4.C>
#USE FAST_IO (B)
#USE FAST_IO(C)
////////////////////////////////////////////////////////////////////////////////////////////////////////
Int tecla=0, Funcion=2, cont=0, sinal;
int16 INClave=0, OutClave=1234, FN=0, FN1=0, tiempo=0;
int1 borrar=false, Marknuevo=false;
/////// Interrupción (temporizador)//////////////////////////////////////////////////////////////////
#int_timer0
Void tiempo0 ()
{
set_timer1 (205);
If (funcion==1) tiempo=tiempo+1;
If (tiempo==7500 && funcion== 1)
{
Tiempo=1;
Tecla=0x65;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
Void main ()
{
/* Arranque de entrada: contiene las funciones con las cuales arranca el
Sistema. Se usa el puerto C como salida final, el puerto B para el teclado,
Y el puerto D para la pantalla LCD. */
kbd_init ();
lcd_init ();
set_tris_C (0x00);
port_b_pullups (255);
output_c (0x00);
//////////// Configuración del temporizador ///////////////////////////////////////////////////////
/*Se usa el timer 0, para usar el reloj interno, además se configura para
Que cuente 1 siclo luego de 8 tiempos en el reloj interno.*/
setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_8);
enable_interrupts (int_timer0); // se activan las interrupciones para INT_TIMER0.
enable_interrupts (GLOBAL); // se activan las interrupciones de forma global.
set_timer0 (205); // se configura el valor del timer (este calculado para un tiempo
// De 200ms).
///////// Mensaje de entrada ////////////////////////////////////////////////////////////////////////
lcd_gotoxy (3,1);
lcd_putc ("Bienvenido");
delay_ms (1000);
lcd_putc ("\f");
lcd_gotoxy (1,1);
lcd_putc ("Ingresar Clave:");
////////////////////////////////////////////////////////////////////////////////////////////////////////
// Función para la lectura de la clave almacenada en la memoria:
Sinal=read_eeprom (0x32);
/* Lee la memora de un espacio de la eeprom destinado para el uso de
Almacenamiento, no es específicamente la memoria que se usa para el programa*/
If (sinal!=0x0C) // verifica si hay una clave guardada.
OutClave=1234; // si no hay nada, pone una clave por defecto (en este caso 1234).
Else// si la hay procede con la lectura.
{
/* La clave al ser de 16bits se divide en dos partes ya que cada espacio de
Memoria solo acepta hasta 8bits por lo que se opta por dividir la clave en
Dos posiciones contiguas, cuando se necesite se reconstruye*/
FN=read_eeprom (0x30); // se realiza la lectura de la primera parte de la clave (mil y cen).
FN1=read_eeprom (0x31); //se realiza la lectura de la segunda parte de la clave (dec y uni).
OutClave= (FN*100)+FN1; // se unen las dos partes.
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////
While (true)
{
Tecla = kbd_getc (); // Es leído el teclado
If (tecla!= 0) // Si hay tecla oprimida se procede a identificarla
{
Switch (tecla)
{
////////////////////////////////////////////////////////////////////////////////////////////////////////
Case 'B': // modo cambio de Clave:
Funcion = 1; // bandera para activa este modo.
lcd_putc ("\f");
lcd_gotoxy (1,1);
lcd_putc ("Clave Actual:");
tiempo0 ();
Break;
////////////////////////////////////////////////////////////////////////////////////////////////////////
Case 'A': // (Por Defecto) Ingresar clave:
Funcion = 2; // bandera que activa este modo (por defecto activo).
lcd_putc ("\f");
lcd_gotoxy (1,1);
lcd_putc ("Ingresar Clave:");
Break;
////////////////////////////////////////////////////////////////////////////////////////////////////////
Case 0x2A: // Ingresar Clave (*):
If ((Marknuevo==true) && (Funcion == 1))
{
FN=INClave/100; // antes de almacenar la clave se saca la parte superior (mil y cen),
FN1=INClave-(FN*100); // luego se saca la parte inferior (dec y uni).
///////////// Proceso de Guardado///////////////////////////////////////////////////////////////////
/* Para el guardado como se mencionó en la parte de lectura, se guarda la clave
En dos registros continuos, 0x30 y 0x31, adicional se pone una vadera que me indica
Si hay una contraseña guardada o no*/
lcd_putc ("\f");
lcd_gotoxy (1,1);
lcd_putc (" Guardando ");
delay_ms (200);
write_eeprom (0x30, FN); // guarda la primera parte de la clave.
lcd_putc (" Guardando.");
write_eeprom (0x31, FN1); // guarda la segunda parte de la clave.
lcd_putc (" Guardando...”);
delay_ms (200);
write_eeprom (0x32, 0x0C); // Pone la bandera.
lcd_putc (" Guardando...");
delay_ms (200);
OutClave=INClave;
////////////////////////////////////////////////////////////////////////////////////////////////////////
Marknuevo=false; // Indicador de Clave nueva.
Funcion=3; // Saca del modo actual.
lcd_putc ("\f");
lcd_putc (" Presione A");
lcd_gotoxy (1,2);
lcd_putc (" Para Continuar");
}
// Primer paso para cambio de clave: verificación de la clave.
If ((Funcion == 1) && (Marknuevo==false))
{
// Si la clave es correcta pasa a la ventana de calve nueva
If (INClave==OutClave)
{
lcd_putc ("\f");
lcd_gotoxy (1,1);
lcd_putc ("Clave Nueva:");
Marknuevo=true; // Indicador de clave nueva.
}
// Si se equivoca en el primer paso, reinicia pantalla y variables.
Else
{
lcd_putc ("\f");
lcd_gotoxy (1,1);
lcd_putc (" Clave");
lcd_gotoxy (2,2);
lcd_putc (" Incorrecta");
delay_ms (2000);
lcd_putc ("\f");
lcd_putc ("Ingresar Clave:");
}
Borrar=true; // indicador para el reinicio de ingreso de clave.
}
//(modo por defecto) Se usa después de ingresar la clave.
If (Funcion == 2)
{
//Si la clave es correcta activa la salida y un LED indicado.
If (INClave==OutClave)
{
lcd_putc ("\f");
lcd_gotoxy (1,1);
lcd_putc (" Clave");
lcd_gotoxy (2,2);
lcd_putc (" Correcta");
output_c (0x03); // Salida y LED indicado (pines 0 y 1 puerto C)
delay_ms (3000);
output_c (0x00); // luego del Delay apaga la salida.
lcd_putc ("\f");
lcd_putc ("Ingresar Clave:");
}
// Si es incorrecta activa led indicador.
Else
{
lcd_putc ("\f");
lcd_gotoxy (1,1);
lcd_putc (" Clave");
lcd_gotoxy (2,2);
lcd_putc (" Incorrecta");
output_c (0x04); // LED Indicador de clave incorrecta (pin 3 puerto c).
delay_ms (2000);
output_c (0x00); // apaga salidas luego de Delay.
lcd_putc ("\f");
lcd_putc ("Ingresar Clave:");
}
}
Borrar=true;
Break;
////////////////////////////////////////////////////////////////////////////////////////////////////////
// Borrar Pantalla (#):
Case 0x23:
Inclave=0;
Cont=0;
lcd_gotoxy (1,2);
lcd_putc (" "); // sobre escribe con vacío los *.
Break;
/* Para el la siguiente sección se Usa el default del Switch case
Para realizar las operaciones del teclado numérico */
////////////////////////////////////////////////////////////////////////////////////////////////////////
Default:
/* Se llana dentro del código a "borrar" para reiniciar variables
Importantes en el código */
If (borrar == true)
{
Inclave=0;
Cont=0;
Borrar = false;
}
/* Todas las siguientes condiciones hacen referencia a cada una
De las funcionalidades de la cerradura*/
Tecla = tecla -0x30; // entrega el valor de tecla en decimal.
////////////////////////////////////////////////////////////////////////////////////////////////////////
// Ingreso de clave (Por defecto Activado):
If (Funcion == 2)
{
If ((tecla>=0) && (tecla<=9))
{
INclave= Inclave*10 + tecla*1; //almacena la clave digitada.
Cont=cont+1; // contador (lleva el # dígitos y mueve el *).
lcd_gotoxy (cont, 2);
lcd_putc ("*"); //se visualiza * cuando se presiona tecla.
/*La siguiente condición es para cuando se pone una clave de
Mayor de 4 dígitos*/
If (cont>4)
{
Inclave=0; // reinicio de la clave.
Cont=0; // reinicio contador.
lcd_putc ("\f");
lcd_gotoxy (1,1);
lcd_putc ("Clave de 4 dígitos");
lcd_gotoxy (1,2);
lcd_putc (" necesaria");
delay_ms (1000);
lcd_putc ("\f");
lcd_putc ("Ingresar Clave:");
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
// Esto es para cualquier valor de función que no sea el por defecto.
Else
{
//Para la función de cambio de clave (clave guardada):
If ((tecla>=0) && (tecla<=9))
{
INclave= Inclave*10 + tecla*1;
Cont=cont+1;
lcd_gotoxy (cont, 2);
lcd_putc ("*");
If (cont>4)
{
Inclave=0;
Cont=0;
lcd_putc ("\f");
lcd_gotoxy (1,1);
lcd_putc ("Clave de 4 dígitos");
lcd_gotoxy (1,2);
lcd_putc (" necesaria");
delay_ms (1000);
lcd_putc ("\f");
lcd_putc ("Clave Actual:");
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
//Para la función Cambio de clave (nueva clave):
If ((Marknuevo==true) && (Funcion == 1))
{
Tecla = tecla -0x30;
If ((tecla>=0) && (tecla<=9))
{
INClave= Inclave*10 + tecla*1;
cont=cont+1;
lcd_gotoxy (cont, 2);
lcd_putc ("*");
If (cont>4)
{
Inclave=0;
cont=0;
lcd_putc ("\f");
lcd_gotoxy (1,1);
lcd_putc ("Clave de 4 dígitos");
lcd_gotoxy (1,2);
lcd_putc (" necesaria");
delay_ms (1000);
lcd_putc ("\f");
lcd_putc ("Clave Nueva:");
}
}
}
}
break;
}
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
4.2. Simulación:
Teniendo el código preparado, se usa la plataforma de Proteus para realizar una prueba virtual del
código, esto con el propósito de tener la seguridad de que el programa que es el software funciona
bien en conjunto con el hardware. Para la simulación se usa el teclado matricial, pantalla LCD y dos
indicadores como muestra la siguiente figura.
En el programa se hace uso de 3 puertos, los cuales son el puerto B para el teclado, el puerto D
para la pantalla, el puerto se cómo salida I/O. en las siguientes figuras muestra la correspondencia
que se menciona:
Ya con los perisfericos del micro bien conectados y las salidas definidas, se realizan las prubas
correspondientes. En la figura 7 se muestran la salidas, la cuales son dos indicadores. Apersar de lo
salir marcado en esta figura, e lpin 15 RCO es definido dentro del programa como el pin del actuador.
4.3. Construcción planta física:
Luego de verificar que la simulación fuera la correcta, basados en los planos de la simulación, se
construye la planta. Para construcción de la planta, esta se realiza en 3 faces: la primera consiste en
el montaje de circuito eléctrico que realizara las funciones, la segunda pasa a la construcción de una
carcasa protectora para el circuito eléctrico y la tercera y última consiste en la construcción de la
puerta y el seguro.
Para el montaje del circuito se usa el plano de la simulación y se monta en una protoboard, usa una
pantalla LCD, PIC 16f887, potenciómetro, resistencia de 1KΩ, teclado matricial 4X4 y cables. El
montaje se muestra en la siguiente figura:
Luego de contruir la base para la carcasa se añaden detalles, ademas de incluir de manera indirecta
los reles dentro de esta. En la siguentes figuras se muetra el proceso:
Para la realizacion del proyecto se necesitaron cierta cantidad de materiales, la siguente lista los
numera:
1. PIC 16F887.
2. Pantalla LCD LM016L.
3. Teclado matricial 4x4 (tipo menbrana).
4. Modulo de reles.
5. Ponteciometro de 10KΩ.
6. Resistencia de 1KΩ.
7. Funente de 5v con minimo de corriente de 1800mA.
8. Interrutor de montaje superficial.
9. Cables para protoboard.
10. Cantonera o serradura electrica.
11. Cable de calibre 16.
12. Conector para la cantonera.
13. 4 varas de 1,5X1,5 cm pino.
14. 1/2 de oja de mdf.
15. Cinta aislate y de papel.
16. Pegamento.
17. Puntillas, tornillos y alfileres.
5. CONCLUCIONES:
Luego de realizar el proceso de contruccion del proyecto y su conclucion con un prototipo funcional,
se pueden hacer las siguentes obcerbaciones:
Realizando el codigo se observo que el uso apropiado de memoria puede llegar a ser muy
util, en el llegado caso de mejorar el prototipo que se realizo se puede pesar en usar el
espacio de memoria para introducir varios usuario, usando otro medio de entrada como
tarjeta con chip registrado.
Es combeniete limitar el tamaño de la contraceña resulta comodo para el usuario y el
programador y reduce costo computacional, ademas es preferible definir limites superiores
a inferiores, esto quiere decir que puedo tomas maximo de 4 digitos pero no limitar al
usuaria que no puede poner menos.
Tener indicadores, ayuda a verificar errores en el funcionamiento electrico permite
visualizar el resultado de una manera mas amigable.
Las cantoneras son actuadores delicados ya que estos depende de funcionamientos cortos,
en nuestro caso el actuador no resistia mas de 2 seg conectado.
6. BIBLIOGRAFIA: