Nothing Special   »   [go: up one dir, main page]

Practica Cerrojo Con PSOC 4

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 17

Universidad Modelo

Campus Mérida

Escuela de Ingeniería
Ingeniería Biomédica
5to Semestre

Electrónica Digital II
Ing. Edson G. Estrada López

Reporte de práctica #3:


“Cerrojo Electrónico”

Alumno:
Canto Martínez Eduardo

29 de octubre de 2018

1
Objetivos
General:
Desarrollar una práctica, la cual imite el funcionamiento de una caja fuerte. Simulando el
funcionamiento con un servomotor, LED RGB, Buzzer y un teclado matricial haciendo uso de
interrupciones.
Específicos:
-Aprender a hacer uso de PWM para así manipular el funcionamiento de un servomotor
-Investigar y haciendo uso de interrupciones aprovechar el funcionamiento del Timer en el
microcontrolador PSoC

Desarrollo
Para el desarrollo de esta práctica se
utilizaron varios elementos que ya habían
sido manejados en anteriores cursos. Estos
fueron:

• PWM y Servomotor
• Timer
• Buzzer
• Teclado Matricial
• LCD
• Switch
Cada uno de estos elementos se conectan
al microcontrolador PSoC como se
muestra en la figura 1.

PWM Figura 1. Top Desing de la práctica

El módulo PWM se alimentó con un reloj de 20MHz y este se


encontraba conectado directamente con el servomotor, el cual para
Grados Porcentaje Pulsos
funcionar requería una señal de 20ms de periodo, lo cual se traducía 0 2% 400
a 20000 pulsos. La señal debía emitir una señal con un ancho de 90 6% 1200
pulso de 0.4 ms para mantenerse en 0 grados, lo cual simula el
180 10.50% 2100
cerrojo estando cerrado y con un ancho de pulso de 2.1 ms para
mantenerse en 180, simulando el estado abierto del cerrojo. Figura 2. Tabla de pulsos PWM

2
Timer
El módulo Timer se alimentó con un reloj de 1KHz, por ende, por cada 1000 pulsos, pasaba un
segundo. En una sección de la práctica se pide que, si en 10 segundos no ocurría algo, se tomara una
acción. Una interrupción fue conectada a este módulo, la cual se disparaba una interrupción cuando
el contador del timer alcanzaba 10000 pulsos, traduciéndose así en 10 segundos.

Figura 3. Configuración Timer_1

LCD

La pantalla LCD no generó ningún problema, ya que


PSoC ya maneja un módulo capaz de manipularla, en la
práctica sólo se maneja el diagrama de la siguiente figura
para su correcta conexión.

Figura 4. Conexión LCD con PSoC

3
Teclado Matricial
El teclado matricial que fue usado contaba con 8 pines, los cuales se representan en la figura con sus
respectivas conexiones.

Figura 5. Diagrama Teclado Matricial

Sin embargo, las entradas tenían una diferencia a las salidas.


Cada entrada del teclado matricial estaba conectada a la entrada del PSoc
y además conectada a una resistencia que estaba conectada a la
alimentación.
Con esta configuración, era posible así que cuando el circuito se cerrara, la
entrada leyera un 0 lógico, y cuando no estuviera oprimida un 1 lógico.

Figura 6. Configuración
Entrada
Secuencia de Interrupción
A diferencia de la lectura del teclado matricial realizada en el curso
pasado de Digital I, en este caso no se hace una lectura continua,
sino se dispara un barrido para buscar que tecla fue oprimida en el
momento en el que se oprime cualquier tecla.
La interrupción se configuró para que cuando cualquiera de las 4
entradas pasara de estado 1 a 0, se dispare.

Figura 7. Configuración Inicial del


Teclado

4
Una vez disparada, el código de la interrupción es ejecutado.
Como primer paso se escribe un 1 lógico en cada una de las salidas del
teclado matricial. Por ende, la lectura de las entradas del teclado es cada
una 1 lógico. Si este no fuera el caso, significaría que ocurrió un error y
en dado caso no se ejecuta el código de la interrupción.

Una vez validado el caso anterior, se procede a realizar el barrido:


I Figura 8. Primer paso de Barrido

Figura 9. 4 pasos del barrido en secuencia

Cada vez que se escribe un nuevo valor en las salidas, se pregunta si la entrada es diferente a 1111, si
este es el caso, significa que se encontró una coincidencia.
Parámetro Valor
Al momento que esta coincidencia ocurra, se leen los valores tanto de entrada como 1110 00
de salida. Posteriormente, estos valores se convierten con un Encoder de 4 a 2 como 1101 01
se muestra en la tabla de la figura .
1011 10
Con los valores ya transformados se obtiene un valor de 4 bits. 0111 11

Index Binario matrix[] Los valores de entrada representan los dos bits Figura 10. Encoder
0 0000 D menos significativos y los de salida los más
1 0001 C significativos. Formando así las coordenas de cada tecla
oprimida. Con estas coordennadas se construyó un arreglo que
2 0010 B
almacenaba los valores tipo char de cada tecla.
3 0011 A
4 0100 # Debido a que eran 16 valores y el número de 4 bits tiene hasta
5 0101 9 16 posibilidades, la relación fue exacta y se relacionó cada una
6 0110 6 de las coordenadas de las teclas con el arreglo de 16 elementos
7 0111 3 como se muestra en la tabla en la figura .
8 1000 0
9 1001 8
10 1010 5
11 1011 2
12 1100 *
13 1101 7
14 1110 4
15 1111 1
Figura 11. Arreglo de coordenadas de matriz

5
Modos de funcionamiento y código Main
Al iniciar el código Main, se inicializan las interrupciones, la pantalla LCD, el Timer y el módulo
PWM con un valor de pulso de 400, lo cual pone el Servo en posición cerrado,
CyGlobalIntEnable; /* Enable global interrupts. */
Timer_ISR_StartEx(TimerCode);

InterruptionsStart();
PwmLed_Start();
PwmLed_WriteCompare(400);//Cerrado
LCD_Start();
Timer_1_Init();

El funcionamiento de esta práctica opera en 5 modos:

A. Modo Cerrado
Durante este modo el usuario solamente puede intentar ingresar la contraseña correcta para así poder
abrir la puerta.
SetReadMode(); }
while((ERROR==0)&&(CONTINUE==0)) else
{ if(CheckPassword()==2)
if(GetCharValue()!='\0') {
{ CONTINUE=1;
ResetValue();
switch(GetCharValue()) }
{ break;
case '0': case 'A':
case '1': case 'B':
case '2': case 'C':
case '3': case 'D':
case '4': case '*':
case '5': case '#':
case '6': ERROR=1;
case '7': ResetValue();
case '8': break;
case '9': default: break;
}
Matrix_Write(GetCharValue()); }
if(CheckPassword()==1)
{ }
ERROR=1;
ResetValue();

Constantemente se hace la pregunta si hay algún valor recibido por parte del teclado matricial, cuando
este es el caso, solamente cuando se detectan valores numéricos se escribe en la pantalla del LCD. Y
hasta que se introduzca la contraseña correcta se permitirá el acceso y se abrirá el cerrojo.

6
B. Modo Error
Este modo ocurre cuando el usuario introduce un número que no sea numérico o cuando la
contraseña sea incorrecta. Una vez concluido este error, se regresa a la configuración inicial.
SetNotReadMode();
LCD_Position(0, 0);
LCD_PrintString("* INCORRECT *");
LCD_Position(1, 0);
LCD_PrintString("* PASSWORD *");
//Alternar entre LED ROJO y LED AMARILLO
//Buzzer Error

C. Modo Abriendo
Una vez que la contraseña se acepte, el usuario cuenta con 10 segundos para abrir la misma, de lo
contrario esta se volverá a cerrar.
Para logra el funcionamiento de esta sección se utiliza una variable llamada TimerFlag, la cual se
inicializa en 0 y sólo puede volverse 1 cuando el Timer alcance los 10000 pulsos, lo cual se traduce
en 10 segundos.

TimerFlag=0;
SetNotReadMode();
Timer_1_RestoreConfig();
Timer_1_WriteCounter(0);
Timer_1_Enable();

PwmLed_WriteCompare(2100);
RgbLed_SetColors(RGBLED_GREEN);

PIN_BUZZER_Write(1);
CyDelay(3000);
PIN_BUZZER_Write(0);

while((TimerFlag==0)&&(PIN_DOOR_Read()==0))
{

}
if((TimerFlag==1)&&(PIN_DOOR_Read()==0))
{
ERROR=1;
LCD_Position(0, 0);
LCD_PrintString("* TIME IS UP *");
LCD_Position(1, 0);
LCD_PrintString("* DOOR CLOSING *");
CyDelay(2000);
}

7
D. Modo Abierto
Durante este modo el usuario puede optar por cambiar la contraseña.

SetReadMode(); case '6':


LCD_Position(0, 0); case '7':
LCD_PrintString("* ACCESS *"); case '8':
LCD_Position(1, 0); case '9':
LCD_PrintString("* GRANTED *"); Password_Write(GetCharValue());
CyDelay(2000); //Escribir

uint8 change=0,aux=0,aux2=0;
while(PIN_DOOR_Read()==1) break;
{ case 'A':
if(aux2==0) //Aceptar, error si no son 6
{ digitos
LCD_Position(0, 0); if(CheckNewPassword()==1)
LCD_PrintString("*PRESS A TO "); {
LCD_Position(1, 0); SetNewPassword();
LCD_PrintString("*CHANGE PASSWORD"); change=0;
aux2=1; aux2=0;
} aux=0;
if(!(change==1)) ResetValue();
{ ClearLastChar();
if(GetCharValue()!='\0'){ LCD_Position(0, 0);
switch(GetCharValue()) LCD_PrintString("NEW PASSWORD HAS");
{ case 'A': LCD_Position(1, 0);
change=1; LCD_PrintString("BEEN SET ");
ClearLastChar(); CyDelay(3000);
break; }
default: break; else
}} {
}
else LCD_Position(0, 0);
{ LCD_PrintString("PASSWORD MUST");
if(aux==0){ LCD_Position(1, 0);
LCD_Position(0, 0); LCD_PrintString("HAVE 6 NUMBERS ");
LCD_PrintString("*OLD: *"); CyDelay(3000);
LCD_Position(1, 0); aux=0;
LCD_PrintString("*NEW: ------ *"); ResetValue();
aux=1; ClearLastChar();
GetOldPassword(); }
} break;
//Función que imprima vieja contra case 'C':
//Funcion Clear
//Ciclo para recibir nueva contraseña Password_Clear();
A=Aceptar, C=Clear, D=Delete break;
if(GetCharValue()!='\0'){ case 'D':
switch(GetCharValue()) //Funcion Delete
{ Password_Delete();
case '0': break;
case '1': default: break;
case '2': }
case '3': }
case '4': }
case '5': }

En esta rutina el usuario puede decidir si quiere cambiar la contraseña oprimiendo la tecla A.
Si este es el caso, al usuario se le proveerá la contraseña anterior y verá en tiempo real la
nueva contraseña que está escribiendo. La nueva contraseña solo puede tener 6 dígitos
numéricos. El usuario puede borrar la clave ingresada un dígito por uno o borrar todos los
dígitos ingresados. Para confirmar, el usuario oprime la tecla A, Si la nueva contraseña no es
válida, el usuario no podrá cambiar la contraseña y deberá iniciar de nuevo.

8
E. Modo Cerrando
Para acceder a este modo, se debe cerrar la puerta, lo que implica cambiar el switch a 0 lógico, y esto
causa que se salga del ciclo que hacía que la rutina principal se mantuviese en el modo abierto.
SetNotReadMode();
RgbLed_SetColors(RGBLED_YELLOW);

LCD_Position(0, 0);
LCD_PrintString("* CLOSING *");
LCD_Position(1, 0);
LCD_PrintString("* DOOR *");
CyDelay(1000);

PwmLed_WriteCompare(400);//Cerrado
CyDelay(1000);
RgbLed_SetColors(RGBLED_RED);

Organización de Librerías y Main

Figura 12. Organización de librerías e interrupciones

9
FUNCIONES EN MAIN
Descripción

Funciones que aprovechan, el funcionamiento del teclado matricial, para obtener los valores
ingresados por el mismo y así lograr el funcionamiento de una caja fuerte.

Funciones
void Matrix_Write(char value)
void ResetValue(void)
uint8 CheckPassword(void)
void GetOldPassword(void)
void Password_Write(char value)
void Password_Delete(void)
void Password_Clear(void)
void SetNewPassword(void)
uint8 CheckNewPassword(void)

Documentación de funciones

void Matrix_Write(char value)


Recibe un parámetro de tipo char, el cual imprime en una posición específica y va recorriendo los
valores hasta 6 lugares.

Retorna:

Nada

Uso de función:
{
LCD_Position(0, 0);
LCD_PrintString("* PASSWORD *");
LCD_Position(1, 0);
LCD_PrintString("* ------ *");
Matrix_Write(‘5’)
/*Imprime -----5 */

10
void ResetValue(void)
No recibe ningún parámetro. Limpia los valores ingresados que fueron guardados.

Retorna:

Nada

Uso de función:
{
LCD_Position(1, 0);
LCD_PrintString("*NEW: ----52 *");

ResetValues();
/* Regreso los valores a : ------ */

}
uint8 CheckPassword(void)
No recibe ningún parámetro.

Retorna:

2 si la contraseña es correcta, 1 si la contraseña es incorrecta y 0 si no se han ingresado 6 dígitos.

Uso de función:
{
if(CheckPassword()==1)
{
/*Se ejecuta este código si contraseña es incorrecta*/
}
else if(CheckPassword()==2)
{
/*Se ejecuta este código si contraseña es correcta*/
}
}
void GetOldPassword(void)
No recibe ningún parámetro. Imprime la contraseña anterior.

Retorna:

Nada

Uso de función:
{
LCD_Position(0, 0);
LCD_PrintString("*OLD: *");
GetOldPassword();
/*Imprime la contraseña anterior*/

11
void Password_Write(char value)
Recibe un carácter, el cual imprime.

Retorna:

Nada

Uso de función:
{

LCD_Position(1, 0);
LCD_PrintString("*NEW: ----52 *");
Password_Write(‘8’);

/*Imprime el caracter y despliega “---528”*/

void Password_Delete(void)
No recibe ningún parámetro. Borra un carácter.

Retorna:

Nada

Uso de función:
{
LCD_Position(1, 0);
LCD_PrintString("*NEW: ----52 *");
Password_Clear();

/*Borra un caracter y despliega “-----5”*/

void Password_Clear(void)
No recibe ningún parámetro. Imprime “------” en vez de los valores que se hayan ingresado.

Retorna:

Nada

Uso de función:
{
LCD_Position(1, 0);

12
LCD_PrintString("*NEW: ------ *");
Password_Clear();

/*Imprime “------” en vez de los valores que se hayan ingresado*/

}
void SetNewPassword(void)
No recibe ningún parámetro. Reemplaza la antigua contraseña con la nueva ingresada.

Retorna:

Nada

Uso de función:
{
SetNewPassword();

/*Reemplaza la antigua contraseña con la nueva ingresada*/

uint8 CheckNewPassword(void)
No recibe ningún parámetro. Válida la contraseña ingresada.

Retorna:

Nada

Uso de función:
{
if(CheckNewPassword()==1)
{
/*Ejecuta este código si la nueva clave es válida*/

}
else
{
}
/*Ejecuta este código si la nueva clave no es válida*/

13
GENERAL API – MATRIX KEYBOARD
Descripción

Funciones que permiten el correcto funcionamiento del teclado matricial, asistido con
interrupciones. Permite su lectura dependiendo en el modo en que se encuentre.

Funciones
void SetNotReadMode()
void SetReadMode()
void InterruptionsStart(void)
void ClearLastChar(void)
char GetCharValue(void)

Documentación de funciones

void SetNotReadMode()
No recibe parámetros. No permite la lectura del teclado matricial.

Retorna:

Nada

Uso de función:
{

SetNotReadMode()
/*Establece un modo en el cual no permite la lectura del teclado matricial*/

}
void SetReadMode()
No recibe parámetros. Permite la lectura del teclado matricial.

Retorna:

Nada

Uso de función:
{

SetReadMode();
/* Establece un modo en el cual permite la lectura del teclado matricial */

14
}

void InterruptionsStart(void)
Permite trabajar con interrupciones, lo cual permite el correcto funcionamiento de la lectura del
teclado matricial

Retorna:

Nada

Uso de función:
{

InterruptionsStart(void);
/*Habilita el uso de interrupciones de la librería del teclado matricial*/

void ClearLastChar(void)
No recibe ningún parámetro, solo borra el último char registrado.

Retorna:

Nada

Uso de función:
{
ClearLastChar()
/*Algo*/

char GetCharValue(void)
No recibe ningún parámetro

Retorna:

El último valor Char registrado por el teclado matricial

Uso de función:
{

/*Algo*/

15
}

Resultados Prácticos
MODO CERRADO: MODO ABIERTO:

MODO ERROR: MODO CERRANDO:

MODO ABRIENDO:

16
Conclusión
En esta práctica me enfrenté nuevamente con problemas de organización de código. A pesar de que
en la entrega final el código funcionaba sin ningún problema, la librería realmente estaba construida
para resolver específicamente el objetivo de esta práctica, privando así a la librería de ser
independiente y poder ser usada para siguientes proyectos. Ahí es donde recae la importancia de una
buena organización de librerías.
Además, logré hacer uso de los módulos tales como PWM, Teclado Matricial y Timer. Gracias a mi
anterior curso de electrónica digital, logré entender y manipular estas herramientas sin mucho
problema. La herramienta que aún estoy aprendiendo a usar son las interrupciones, las cuales fueron
vitales para el desarrollo de esta práctica.

Referencias
Gaddis, T. (2015). C++ From Control Structures through Objects. Pearson. Páginas consultadas:
495-546 .

Savitch, W. (2015). Problem Solving with C++. Pearson. Páginas consultadas: 507-541.

W3schools.com. (n.d.). JavaScript Bitwise Operations. Retrieved from w3bschools:


https://www.w3schools.com/js/js_bitwise.asp

17

También podría gustarte