Descripción ADM
Vamos conectar un teclado matricial a arduino, y a través del monitor del puerto serie vamos a ver como pulsando cada tecla obtenemos su correspondiente carácter en la pantalla.
Materiales
Placa de Arduino
Teclado matricial de 16 teclas
Protoboard, cables para conexiones y el cable USB para conectar el arduino al PC y sirve además de alimentación.
Esquema
Vamos conectar el teclado directamente a arduino, como vemos en el esquema de circuito, de manera que el pin 1 del teclado, que es mirándo de frente al teclado, el primero de la izquierda coincida con el pin2 de arduino y el pin 8 del teclado, que es el último de la derecha, coincida con el pin9 de arduino. Una vez conectado todo está listo.
nota.- Hemos utilizado los pines del 2 al 9, es conveniente saber, que arduino utiliza los pines 0 y 1 para comunicarse por USB, por lo que NO es buena idea usarlos, cuando se va a utilizar el puerto serie.
nota.- Hemos utilizado los pines del 2 al 9, es conveniente saber, que arduino utiliza los pines 0 y 1 para comunicarse por USB, por lo que NO es buena idea usarlos, cuando se va a utilizar el puerto serie.
El programa ha de consistir en ir dando tensión de forma consecutiva a los pines de las filas, es decir al 8, 7, 6 y 5, y después ir leyendo los valores de las columnas para detectar que teclas se han pulsado.
No es un programa complicado, pero para facilitar muchísimo esta labor, contamos con una librería llamada KeyPad ideal para leer este tipo de matrices sin complicaciones.
Si no tienes instalada la librería en el IDE de arduino, debe de instalarla antes de proseguir. Usando el gestor de biblioteca del IDE, una vez instalada la librería prosigamos con el código
#include <Keypad.h>
const byte Filas = 4;
const byte Cols =4;
byte Pins_Filas[] = {9,8,7,6};
byte Pins_Cols [] = {5,4,3,2};
char Teclas[Filas][Cols]={
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'},
};
Keypad Teclado1=Keypad(makeKeymap(Teclas), Pins_Filas,Pins_Cols,Filas,Cols);
void setup() {
Serial.begin(115200);
}
void loop() {
char pulsacion = Teclado1.getKey();
if (pulsacion){
Serial.println(pulsacion);
}
}
Lo siguiente es un array de dos dimensiones tipo char para definir que símbolo corresponde a cada tecla. Primero declaramos el nombre Teclas, luego definimos los dos arrays dando el nombre de las dos constantes, con lo cual C++ sabe que son 4 elementos en cada array, luego enumeramos los 4 arrays de 4 elementos, fijate que cada array va entre llaves, y los elementos se separan por comas, inclusive las llaves se separan por coma y al final ponemos un punto y coma porque todo el conjunto es una asignación.
Una de las curiosidades de leer una matriz de teclas y después asignar un carácter contenido en un array es que podemos redefinir el valor de las teclas sin más que cambiar el contenido del array.
Si por lo que sea hubiéramos conectado mal los pines del keypad al Arduino, podríamos redefinir los valores del array para que coincidan con lo que pone en las teclas. Puede ser más fácil que mover de sitio los cables.
De hecho es esa capacidad de mapear la representación de un carácter a una posición en una tabla, es lo que permite que podamos reconfigurar el mismo teclado a diferentes lenguas, sin más que cambiar los valores del array (aunque también ayudará mucho luego cambiar los símbolos rotulados en el teclado).
Luego creamos una instacia u objeto tipo Keypad al que llamamos Teclado1 y al que asignaremos las teclas que tenemos en el array Teclas, y le decimos que hemos conectado las filas del keypad a los números de pines que te indico en el array Pins_Filas y las columnas al array Pins_Cols.
MakeKeymap (Teclas) es una función disponible en la librería y que nos permite asignar un array de valores a una matriz. Se hace solo una vez al principio salvo que por lo que sea nos interese cambiarlo sobre la marcha.
Luego con char pulsacion lo utilizaremos para leer el keypad y hacemo llamada a otra función de la librería, que nos dirá que tecla se ha pulsado.
El bloque if revisa si se pulsa o no una tecla y cuando este se pulsa envía el valor de la misma al monitor del puerto serie, dependiendo si la condición if es TRUE o FALSE
#include <Keypad.h>
const byte Filas = 4;
const byte Cols =4;
byte Pins_Filas[] = {9,8,7,6};
byte Pins_Cols [] = {5,4,3,2};
char Teclas[Filas][Cols]={
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'},
};
Keypad Teclado1=Keypad(makeKeymap(Teclas), Pins_Filas,Pins_Cols,Filas,Cols);
void setup() {
Serial.begin(115200);
}
void loop() {
char pulsacion = Teclado1.getKey();
if (pulsacion){
if (pulsacion != '#'){
Serial.print(pulsacion);
}else {
Serial.println("");
}
}
}
Este nuevo código permite utilizar la tecla # como salto de línea, para eso solo hemos anidado un if con la condición de que cualquier tecla distinta a la # la imprima una a continuación de otra, pero si se pulsa la # entonces se haga un salto de línea.