Teclado Matricial



El teclado matricial es un dispositivo bastante común en proyectos con sistemas microcontrolados como el Arduino y está conformado básicamente por un arreglo de pulsadores distribuidos en forma de matriz, que puede ser leído utilizando pocos pines del Arduino, utilizando el concepto de la multiplexación (el mismo que vimos en la entrada del Display 7 Segmentos con Arduino).
En el mercado podemos encontrar Teclados matriciales de diferentes tamaños, como el teclado matricial 4×4, 3×3, 4×3, entre otros. Estos teclados pueden tener una estructura de membrana o una estructura rigida.

Teclados Matriciales de Membrana

Incorporar Teclados Matriciales a nuestros proyectos con Arduino es bastnate interesante debido a que puede ser empleado en proyectos que requieran la inserción de datos por parte del usuario, como por ejemplo hacer una calculadora con arduino y teclado matricial, pedir una contraseña con arduino, mover un servo con teclado matricial, usar teclas de dirección para un robot, cnc, solicitar parámetros numéricos para nuestros proyectos, solicitar información específica, entre otros.

Funcionamiento del Teclado de Arduino

Para ingresar valores con un teclado matricial en Arduino seguiremos los siguientes pasos.
Por la configuración en matriz que presentan los pulsadores dentro de un teclado matricial, se puede establecer cual botón dentro del arreglo está siendo presionado de la siguiente forma:

Vamos primero a suponer que tenemos un arreglo Matricial 4×3 o teclado arduino 4×3 (el funcionamiento es el mismo para otro tipo de teclado). Donde internamente la distribución de los botones es así:

Teclado Matricial 4x3

Para programar el Teclado o Keypad en Arduino o en cualquier otro microcontrolador, basta con seguir en orden la siguiente secuencia:
  1. Inicialmente conectamos el teclado matricial en los PINES DIGITALES del ARDUINO. Para eso será importante poder identificar cuales son las columnas y las filas del teclado.
2.Las Filas del Teclado estarán conectadas en PINES DIGITALES configurados como SALIDAS.

3.Las Columnas del Teclado estarán conectadas en PINES DIGITALES configurados como ENTRADAS y con el PULLUP activado (por lo tanto, estas entradas siempre estarán recibiendo un 1 lógico, si ningún botón es presionado).

4.Configuramos TODAS las SALIDAS (Filas) en 1 lógico o 5v, es decir vamos a dejarlas encendidas.

5.Aplicamos el concepto de la MULTIPLEXACIÓN: Aquí vamos a mandar un 0 lógico por cada fila y vamos a leer todas las columnas, si se detecta que alguna columna recibió el cero lógico, indica que el botón que comparte la fila y la columna fue presionado, en caso contrario vuelvo a colocar la fila en 1 lógico y verifico la siguiente fila.


En la siguiente animación podemos ver como se establece el presionado de un botón sobre el keypad. Notarás más adelante, que cuando se programa el teclado sin librería, basicamente usamos el teclado matricial con for (ciclo) para poder preguntar por las columnas del teclado.


Teclado Matricial Animado




Librería Keypad de Arduino

Una forma rápida de usar un Teclado con Arduino, es valernos de su librería Keypad, bastante sencilla de entender, para el caso de un teclado matricial 4×4 (KEYPAD 4×4) tenemos:

TECLADO MATRICIAL 4X4
1.Incluimos la librería en nuestro proyecto:

#include <Keypad.h>

Establecemos 2 constantes que determinan el número de filas y columnas del teclado matricial


const byte rowsCount = 4;
const byte columsCount = 4;


Establecemos el Arreglo que nos dará los caracteres de cada uno de los botones del teclado matricial.


char keys[rowsCount][columsCount] = {
{ '1','2','3', 'A' },
{ '4','5','6', 'B' },
{ '7','8','9', 'C' },
{ '#','0','*', 'D' }
};


Creamos dos vectores donde colocaremos los Pines del Arduino asociados a las Filas y Columnas del teclado matricial:

const byte rowPins[rowsCount] = { 11, 10, 9, 8 };
const byte columnPins[columsCount] = { 7, 6, 5, 4 };


Creamos el objeto de la instancia Keypad con las variables creadas en el paso 2 y 3

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


NOTA: No es necesario configurar los pines conectados al teclado usando el pinMode, porque ya la propia librería del Keypad lo hace internamente.
Para leer cual tecla fue presionada usamos la siguiente instrucción:

char key = keypad.getKey();

Ejemplo del Teclado Matricial Arduino

Es hora de comenzar a realizar proyectos de teclado matricial con Arduino, y una vez finalices este proyecto estarás en la capacidad por ejemplo de crear otro proyecto usando un menu con teclado matricial y Arduino.
Vamos a ver como utilizar este periferico con Arduino, de dos formas, una será programando el Arduino y la otra será utilizando la librería Keypad
Vamos a ingresar valores con el teclado matricial y Arduino para visualizar las teclas presionadas por el puerto Serial, usando el siguiente circuito:

Teclado Arduino



Librería



#include <Keypad.h>
const byte filas = 4; 
const byte columnas = 4;
byte pinesFilas[]  = {9,8,7,6};
byte pinesColumnas[] = {5,4,3,2};
char teclas[4][4] = {{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}};
Keypad teclado1 = Keypad( makeKeymap(teclas), pinesFilas, pinesColumnas, filas, columnas);  
void setup() {
Serial.begin(9600);
Serial.println("Teclado 4x4 con Biblioteca Keypad");
Serial.println();
}
void loop() {
//Verifica si alguna tecla fue presionada
char tecla_presionada = teclado1.getKey();
//Monitor Serial
if (tecla_presionada)
{
Serial.print("Tecla: ");
Serial.println(tecla_presionada);
}

Sin Librería



byte pinesFilas[] = {9,8,7,6}; 
byte pinesColumnas[] = {5,4,3,2}; 
char teclas[4][4] = {{'1','2','3','A'}, 
{'4','5','6','B'}, 
{'7','8','9','C'}, 
{'*','0','#','D'}};
void setup()
{
for (int nL = 0; nL <= 3; nL++) {
pinMode(pinesFilas[nL], OUTPUT);
digitalWrite(pinesColumnas[nL], HIGH);
}
for (int nC = 0; nC <= 3; nC++) {
pinMode(pinesColumnas[nC], INPUT_PULLUP);
Serial.begin(9600);
Serial.println("Teclado 4x4");
Serial.println();
}
void loop()
{
//Barrido por las filas
for (int nL = 0; nL <= 3; nL++)
{
digitalWrite(pinesFilas[nL], LOW);
//Barrido en columnas buscando un LOW
for (int nC = 0; nC <= 3; nC++) {
if (digitalRead(pinesColumnas[nC]) == LOW)
{
Serial.print("Tecla: ");
Serial.println(teclas[nL][nC]);
while(digitalRead(pinesColumnas[nC]) == LOW){}
}
}
digitalWrite(pinesFilas[nL], HIGH);
}
delay(10);
}
























No hay comentarios:

Publicar un comentario