You are on page 1of 7

MATERIA DE SISTEMAS EMBEBIDOS

LABORATORIO: 1 PUERTOS DIGITALES Y COMUNICACIÓN


SERIAL
Jorge L. Villarreal Rosales-Marlon E. Ipiales Jingo
13 de mayo de 2021

1. Introducción

El presente laboratorio consiste en la aplicación de da una de las personas.


conocimientos en puertos digitales y comunicación se- Además, el desarrollo de un Keypad con arreglo ma-
rial, para ello el programa a desarrollar cumplirá con tricial 4x4 es necesario ya que podemos establecer los
estos requerimentos para el respectivo desarrollo de un caracteres que conforman cada una de las 3 claves de
sistema capaz de controlar el acceso a personas. acceso, las cuales se representan por una cadena de
Es por ello que, la comunicación serial será de gran 8 caracteres. Finalmente, un LCD nos brindará la vi-
importancia al momento de realizar comparaciones y sualización en pantalla del nombre de la persona que
validaciones de credenciales de acceso asignadas a ca- ingresó al sistema correctamente.

2. Diseño del Sistema


Se debe diseñar un sistema de control de acceso por medio de una contraseña individual. Las contraseñas
ya se cuentran establecidas para cada persona y están almacenadas en el sistema.
Estas son: Ariel Davalos cod: ad102344, Damian Cervantes cod: dc774235 y Carlos Benavides cod: ca543187.
Estos son ingresados por comunicación serial. Cada usuario debe ingresar su código y en una LCD de-
berá aparecer por rotación de datos: ”BIENVENIDO NOMBRE APELLIDO”. Al presionar un botón, se
deberá presentar como reporte por mensaje serial quién ya ingresó a la empresa y quien no lo ha hecho.

2.1. Diagrama de Flujo

Diagrama de flujo del sistema de control de acceso Diagrama de bloques del sistema de control de ac-
- Jorge Villarreal. ceso - Jorge Villarreal.

Figura 1: Diagrama de flujo Figura 2: Diagrama de bloques

1
Diagrama de bloques del sistema de control de ac- Diagrama de bloques del sistema de control de ac-
ceso - Marlon Ipiales. ceso - Marlon Ipiales.

Figura 3: Diagrama de bloques Figura 4: Diagrama de bloques

3. Desarrollo
3.1. Simulación - Marlon Ipiales

Figura 5: Simulación en proteus. Figura 6: Armado del sistema en Fritzing.

3.2. Simulación - Jorge Villarreal

Figura 7: Simulación en proteus. Figura 8: Armado del sistema en Fritzing.

4. Análisis de Resultados
4.1. Análisis de Resultados - Jorge Villarreal
En necesario disponer de las librerı́as de LiquidCrystal y Keypad, para ello se las puede instalar desde
nuestro gestor de librerias. Una vez realizado, se procede a utilizarlas mediante el comando #include. Además,
se genera 4 filas y 4 columnas que permitirán realizar un arreglo matricial de 4x4. Posteriormente se especifica
los valores que ocuparán en cada una de las posiciones. Como último paso se detalla los pines que representarán
las filas y columnas.
# include < L i q u i d C r y s t a l .h >
# include < Keypad .h >

// Diseno del teclado matricial


const byte filas = 4; // numero de filas del teclado
const byte columnas = 4; // numero de columnas del teclado
char keys [ filas ][ columnas ]={ // define los valores del arreglo matricial

2
{ ’1 ’ , ’2 ’ , ’3 ’ , ’a ’} ,
{ ’4 ’ , ’5 ’ , ’6 ’ , ’b ’} ,
{ ’7 ’ , ’8 ’ , ’9 ’ , ’c ’} ,
{ ’* ’ , ’0 ’ , ’# ’ , ’d ’}
};
// Pines dedicados para el Keypad
byte pinfilas [ filas ]={13 ,12 ,11 ,10}; // pines para las filas
byte pincolms [ columnas ]={9 ,8 ,7 ,6}; // pines para las columnas

Se realiza la creación del keypad, para ello se trabaja con los pines y valores de cada posición, posteriormente
declarar los pines que ocupan el LCD que van de A0 a A5. Otro punto importante es declarar variables de tipo
char y string; en donde los de tipo char serán las contraseñas y String el mensaje a indicar.
// Creacion de Keypad
Keypad teclado = Keypad ( makeKeymap ( keys ) , pinfilas , pincolms , filas , columnas ) ; // Se detalla
los pines y el numero dimensional del arreglo (4 x4 )
// Pines LCD .
LiquidCrystal lcd ( A0 , A1 , A2 , A3 , A4 , A5 ) ; // pines a emplear desde A0 hasta A5

// Declaracion de variables
char tcl ;
char pass [9];
char pass1 [9]= " ad102344 " ;
String per1 = " BIENVENIDO ARIEL DAVALOS " ;
char pass2 [9]= " dc774235 " ;
String per2 = " BIENVENIDO DAMIAN CERVANTES " ;
char pass3 [9]= " ca543187 " ;
String per3 = " BIENVENIDO CARLOS BENAVIDES " ;
byte g =0;
int i =0;
int j =0;
const int btn =5; // el pulsador se define en el pin 5

En esta sección se procede a trabajar con la comunicación serial. Lo importante es definir la velocidad de
transmisión de datos y además se muestra mensajes que guiarán en el ingreso de contraseña. Por otra parte, se
inicializa el LCD al final de la sección de este código.
void setup () {
//
Serial . begin (9600) ; // indica la velocidad de transmision .
Serial . println ( " - - - - - - - - - CONTROL DE ACCESO - - - - - - - - - - " ) ; // muestra el encabezado
Serial . println ( " " ) ; // creamos un salto de linea
Serial . println ( " Ingrese su contrasena : " ) ; // definimos el texto para solicitar la
contrasena
// inicializa lcd
lcd . begin (16 , 2) ;
}

En esta sección es importante considerar que se obtiene el valor presionado en el teclado matricial, y se lo
procede a presentar en pantalla. Además se crea una función mostrar(), la cuál se encarga de presentar en el
LCD el mensaje previamente detallado, en caso de que se cumpla ciertas validaciones como lo es el ingreso por
contraseña de una persona. Cabe mencionar que aquı́ se implementa la rotación de datos y se lo hace con un
desplazamiento de derecha a izquierda.
void loop () {
tcl = teclado . getKey () ; // obtener el valor de caracter .
if ( tcl ) {
pass [ g ] = tcl ;
g ++;
Serial . print ( tcl ) ; // se muestra el valor de tecla presionada en el keypad
}
// Creacion de la funcion mostrar
mostrar () ;
if ( g == 8) { // comparamos el tamano de la contrasena
if (! strcmp ( pass1 , pass ) || ! strcmp ( pass2 , pass ) || ! strcmp ( pass3 , pass ) ) { //
comparacion de contrasenas de acceso
Serial . println ( " Contrasena correcta . " ) ; // si se cumple indicar el mensaje .

// LCD mensaje con scroll


// Persona 1
if (! strcmp ( pass , pass1 ) ) {
lcd . setCursor (5 , 0) ;
lcd . print ( per1 ) ;
for ( i = 0; i < 30; i ++) { // Ciclo for para recorrer el texto
lcd . s c r o l l D i s p l a y L e f t () ; // direccion de d ezplazam iento a la izquierda
delay (250) ;

3
}
lcd . clear () ; // limpiar LCD
}
// Persona 2
if (! strcmp ( pass , pass2 ) ) {
lcd . setCursor (5 , 0) ;
lcd . print ( per2 ) ;
for ( i = 0; i < 30; i ++) { // Ciclo for para recorrer el texto
lcd . s c r o l l D i s p l a y L e f t () ; // direccion de d ezplazam iento a la izquierda
delay (250) ;
}
lcd . clear () ;
}
// Persona 3
if (! strcmp ( pass , pass3 ) ) {
lcd . setCursor (5 , 0) ;
lcd . print ( per3 ) ;
for ( i = 0; i < 30; i ++) { // Ciclo for para recorrer el texto
lcd . s c r o l l D i s p l a y L e f t () ; // direccion de d ezplazam iento a la izquierda
delay (250) ;
}
lcd . clear () ;
}
Serial . println ( " " ) ;
Serial . println ( " Ingrese contrasena : " ) ;
g = 0;
} else {
Serial . println ( " Contrasena incorrecta ! " ) ;
Serial . println ( " " ) ;
g = 0;
Serial . println ( " Vuelva a ingresar contrasena : " ) ;
}
}
}

Finalmente, se crea un método el cual permite indicar en el virtual terminal, el nombre de la persona que
previamente ha ingresado correctamente al sistema. Para ello se realiza una comparación de cadenas de caracteres
mediante strcmp y de igual forma que se accione mediante un boton desarrollado mediante configuración pull-up.
void mostrar () { // creacion del metodo
if (! strcmp ( pass , pass1 ) && digitalRead ( btn ) == LOW ) { // se compara con la contrasena de
la persona 1
delay (250) ;
Serial . println ( " " ) ;
Serial . println ( " --- Detalle De Ingreso - - - " ) ;
Serial . println ( " Ariel Davalos : Ingresado " ) ;
Serial . println ( " Damian Cervantes : No ingresado " ) ;
Serial . println ( " Carlos Benavides : No ingresado " ) ;
Serial . println ( " " ) ;
Serial . println ( " Ingrese contrasena : " ) ;

Figura 9: Ingreso correcto de perso- Figura 10: Error en contraseña de Figura 11: Verificación de acceso al
na y contraseña. acceso al sistema. sistema.

4.2. Análisis de Resultados - Marlon Ipiales


Realizaremos la lectura sin emplear ninguna librerı́a. Para ello, realizamos un bucle poniendo a LOW se-
cuencialmente las distintas filas, y realizando la lectura por columnas. Si detectamos la pulsación de una tecla

4
el valor se muestra por el puerto serie. Sin embargo en el proceso de codificación esta muestra un cambio sig-
nificativo a lo ya revisado en clase, puesto que ahora la declaracion de variables y especificaciones tanto como
pines y botones, tienen que ser arreglado de forma matricial, en donde esta se especifica más detalladamente la
posición de cada tecla a presionar. A continuación presentamos el código:
/*
* CAPITULO III : PUERTOS DIGITALES Y COMU NICACIO NES SERIAL
* CODIGO 1: Manejo de LCD , envio de mensajes con librerias < LiquidCrystal .h > y < Keypad .h >
* OBJETIVO : Usar metodos para imprimir mensajes y ciclos condicionales
* FUNCIONES : Libreria LiquidCrystal . h
* LiquidCrystal () // Inicializa la interfaz de la pantalla de LCD
* begin ( columnas , filas ) // Configura el uso de la LCD
* print ( data ) // Imprime texto en la LCD
* setCursor ( columna , fila ) // Posiciona el cursor en la LCD
* FUNCIONES : Keypad . h
# include < Keypad .h >

const byte rowsCount = 4; // Declaracion numero de filas y columnas


const byte columsCount = 4; // Declaracion numero de filas y columnas

char keys [ rowsCount ][ columsCount ] = {


{ ’1 ’ , ’2 ’ , ’3 ’ , ’A ’ } , // P o si ci o na mi en t o de cada tecla en orden matricial
{ ’4 ’ , ’5 ’ , ’6 ’ , ’B ’ } ,
{ ’7 ’ , ’8 ’ , ’9 ’ , ’C ’ } ,
{ ’# ’ , ’0 ’ , ’* ’ , ’D ’ }
};

const byte rowPins [ rowsCount ] = { 11 , 10 , 9 , 8 }; // Uso de pines


const byte columnPins [ columsCount ] = { 7 , 6 , 5 , 4 }; // Uso de pines

Keypad keypad = Keypad ( makeKeymap ( keys ) , rowPins , columnPins , rowsCount , columsCount ) ;


// Llamado a la funcion

void setup () {
Serial . begin (9600) ; // Velocidad de inicio
}

void loop () {
char key = keypad . getKey () ; // Configuracion de teclado

if ( key ) {
Serial . println ( key ) ; // Impresion del texto dirigido por el teclado
}
}
* NOMBRE : Marlon Ipiales
* NOTA : Para que el codigo compile debe estar seleccionado con Arduino Uno WiFi caso
contrario si no funcionara seleccionar Arduino Uno
*/
# include < L i q u i d C r y s t a l .h > // Llamado de l i b r e r i a
# include < Keypad .h > // Llamado de l i b r e r i a
const byte Fila = 4; // Especif icacion de teclado
const byte Col = 4; // E specific acion de teclado
const byte filaPins [ Fila ] = { 13 , 12 , 11 , 10 }; // Pines a usar
const byte columnaPins [ Col ] = { 9 , 8 , 7 , 6 };

char keys [ Fila ][ Col ] = {


{ ’7 ’ , ’8 ’ , ’9 ’ , ’a ’} , // E s p e c i f i c a c i o n e s del teclado
{ ’4 ’ , ’5 ’ , ’6 ’ , ’b ’} ,
{ ’1 ’ , ’2 ’ , ’3 ’ , ’c ’} ,
{ ’* ’ , ’0 ’ , ’# ’ , ’j ’}
};

Keypad tecladoMatr = Keypad ( makeKeymap ( keys ) , filaPins , columnaPins , Fila , Col ) ; // Llamado de
las funciones del teclado

LiquidCrystal lcd ( A0 , A1 , A2 , A3 , A4 , A5 ) ;
const String clave1 = " ad102344 " ; // Claves de ingreso
const String clave2 = " dc774235 " ;
const String clave3 = " ca543187 " ;

const String uno ; // Declaracion de variables


const String dos ; // Declaracion de variables
const String tres ; // Declaracion de variables
const int btn =5; // Declaracion de variables

String input _passwor d ;

5
// Funcion del teclado
void setup () {
pinMode ( btn , INPUT ) ;
Serial . begin (9600) ;
inpu t_passwo rd . reserve (32) ;
Serial . println ( " Laboratorio 1 " ) ;
Serial . println ( " Ingrese su c o n t r a s e a " ) ;
lcd . begin (16 ,2) ;
lcd . clear () ;
lcd . setCursor (2 ,0) ;
lcd . print ( " Laboratorio 1 " ) ;

}
// Configuracion en el ingreso de claves en teclado
void loop () {
lcd . autoscroll () ;
lcd . print ( " " ) ;
delay (300) ;
char tecla = tecladoMatr . getKey () ;
if ( tecla ) {
Serial . print ( tecla ) ;
if ( tecla == ’* ’) {
input_passwo rd = " " ;
} else
if ( tecla == ’# ’) {
if ( clave1 == input_p assword || clave2 == input_ passwor d || clave3 == inpu t_passwo rd ) {
if ( clave1 == input_p assword ) {
uno = clave1 ;
Serial . println ( " " ) ;
Serial . println ( " clave es correcta " ) ;
lcd . setCursor (1 ,1) ;
lcd . print ( " Bienvenido Ariel Davalos " ) ;
delay (300) ;
} else {
if ( clave2 == input_p assword ) {
dos = clave2 ;
Serial . println ( " " ) ;
Serial . println ( " La clave es correcta .! " ) ;
lcd . setCursor (1 ,1) ;
lcd . print ( " Bienvenido Damian Cervantes " ) ;
delay (300) ;
} else {
if ( clave3 == input_p assword ) {
tres = clave3 ;
Serial . println ( " " ) ;
Serial . println ( " La clave es correcta " ) ;
lcd . setCursor (1 ,1) ;
lcd . print ( " Bienvenido Carlos Benavides " ) ;
delay (300) ;
}
}
}
} else {
Serial . println ( " " ) ;
Serial . println ( " Clave incorrecta .! " ) ;
}
inpu t_passwo rd = " " ;
} else {
inpu t_passwo rd += tecla ;
}
}
if ( digitalRead ( btn ) == HIGH ) {
delay (300) ;
Serial . println ( " " ) ;
Serial . println ( " Asistencia : " ) ;
if ( uno == clave1 ) {
Serial . println ( " " ) ;
Serial . println ( " Ariel Davalos ha ingresado " ) ;
} else {
Serial . println ( " " ) ;
Serial . println ( " Ariel Davalos no ha ingresado " ) ;
}
if ( dos == clave2 ) {
Serial . println ( " " ) ;
Serial . println ( " Damian Cervantes ha ingresado " ) ;
} else {

6
Serial . println ( " " ) ;
Serial . println ( " Damian Cervantes no ha ingresado " ) ;
}
if ( tres == clave3 ) {
Serial . println ( " " ) ;
Serial . println ( " Carlos Benavides ha ingresado " ) ;
} else {
Serial . println ( " " ) ;
Serial . println ( " Carlos Benavides no ha ingresado " ) ;
}
}
}

5. Conclusiones y Recomendaciones
El método de scrollDisplayLeft() permite que se realice un desplazamiento en el flujo del texto del LCD, de
tal forma que vaya de derecha a izquierda. Aunque se puede modificar la posición desde dónde queremos
que empiece con setCursor().
Las condiciones de if, else nos permiten establecer instrucciones especı́ficas, principalmente enfocadas en
la comparación de cadenas de caracteres y la salida de texto especı́fico en la Virtual Terminal cuando se
ingresa o no correctamente una contraseña.
Para detectar la pulsación de una tecla actuaremos de forma similar a la lectura simple de un pulsador.
En resumen, ponemos a tierra un extremo del pulsador, y el otro lo conectamos a una entrada digital con
una resistencia de pull-up.

Dentro del proceso de codificación de ARDUINO, se puede tomar en cuenta que al hacer llamado de las
librerias para realizar dicho proceso requiere instalación previa para ser usado.
La correcta concatenación de los caracteres con el teclado a la pantalla del Display LCD y el terminal
virtual debe ser especificada correctamente en la función VOID LOOP para evitar ası́ errores al instante
de ingresar contraseñas.

Es indispensable disponer de las librerı́as necesarias para que funcione adecuadamente el keypad y el
LiquidCrystal, para ello es recomendable instalar o actualizar desde el mismo programa de Arduino.
Realizar una adecuada conexión, por lo general, tratar de no utilizar conexiones que se superpongan entre
sı́.

En caso de cerrar la ventana de virtual terminal, y no se vuelva a ejecutar, lo que se procede hacer es
dirigirse a la opción Debug y activar Virtual Terminal.

You might also like