Tch-Inno Figure Out & Solve it S.L.
Curso Arduino. Formación básica.
2.4.1.- Lectura Matriz botones. Teclado.
/* En este ejemplo veremos cómo realizar la lectura de una matriz de botones, para lo que emplearemos sólo un pin por columna y
un pin por fila.
El principio de funcionamiento es bastante sencillo. Generalmente, disponemos los botones en columnas y filas, de la
siguiente forma:
col. 0 col. 1 col. 2 col. 3 Para leer un teclado con forma matricial, vamos a
| | | | realizar un escaneado por filas (o por columnas), de manera
_ | _ | _ | _ | que activaremos la fila y leeremos cada una de
fila 0 --o o--|--o o--|--o o--|--o o--| las columnas.
_ | _ | _ | _ |
fila 1 --o o--|--o o--|--o o--|--o o--| Al activar la fila, hacemos que si se pulsa hacemos que
_ | _ | _ | _ | si se pulsa cualquier botón de la misma, la activación
fila 2 --o o--|--o o--|--o o--|--o o--| llegará hasta la columna que estamos leyendo y por lo tanto
_ | _ | _ | _ | sabremos que se ha pulsado el botón.
fila 3 --o o--|--o o--|--o o--|--o o--|
Así pues, el algoritmo básico es:
- Activamos una fila.
- Leemos la primera columna. Si la columna está activada, el botón en la intersección columna-fila que estamos
leyendo, está activado.
- Leemos siguiente columna ... mismo procedimiento.
- Activamos la siguiente fila
- Leemos la primera columna ...
En este ejemplo, vamos a ver cómo leer un teclado matricial de 4 filas y 4 columnas, escaneando las filas y posteriormente
las columnas. Aunque también se podrán escanear las columnas y posteriormente las filas.
Los botones no están conectados a resistencias de pull-up ni pull-down, así que vamos a usar las resistencias de pull-up
internas del Arduino. Por lo tanto vamos a tener los botones en pull-up y vamos activar las columnas a nivel bajo para poder
leer los botones.
Autor: Marc Filbà */
1 Práctica 4. Edición 1. Revisión 0. Junio 2018
Tch-Inno Figure Out & Solve it S.L.
Curso Arduino. Formación básica.
#define NUM_COLUMNAS 4 /* Definimos la cantidad de columnas */
#define NUM_FILAS 4 /* Definimos la cantidad de filas */
byte pinColumnas [NUM_COLUMNAS] = {7, 6, 5, 4}; /* Inicializamos dos vector con los pines de las columnas */
byte pinFilas [NUM_FILAS] = {8, 9, 10, 11}; /* y de las filas para poder recorrerlos fácilmente */
void setup() { /* Inicializamos el puerto serie a 115200 bps */
Serial.begin (115200);
for (byte i = 0; i < NUM_COLUMNAS; ++i) /* Recorremos los pines de las columnas */
/* Inicializamos los pines como entrada pero activando las resistencias
pinMode (pinColumnas [i], INPUT_PULLUP); internas de pull-up*/
for (byte i = 0; i < NUM_FILAS; ++i) /* Recorremos los pines de las filas */
/* Inicializamos los pines como entrada, aunque después re-inicializaremos
pinMode (pinFilas [i], INPUT); estos pines cómo salida, queremos que solamente uno de ellos está activo.
Cuando los necesitemos, los activaremos de uno en uno */
}
void loop() {
for (byte i = 0; i < NUM_FILAS; ++i){ /* Recorremos los pines de las filas de la matriz*/
pinMode (pinFilas [i], OUTPUT); /* Re-inicializamos la fila objetivo como salida*/
/* Como los pines de entrada están con una resistencia de pull-up,
digitalWrite (pinFilas [i], LOW queremos que el botón pulsado nos devuelva nivel bajo, así que ponemos el
pin de la fila a nivel bajo */
for (byte j = 0; j < NUM_COLUMNAS; ++j){ /* Recorremos los pines de las columnas */
if (! digitalRead (pinColumnas [j])){ /* Si algún pin está a nivel bajo, es que el botón en la fila y columna
que estamos analizando está pulsado */
Serial.println ("Pulsado botón (" + String (i)
/* Escribimos por el puerto serie las coordenadas del botón pulsado */
+ "," + String (j) + ")");
}
}
pinMode (pinFilas [i], INPUT); /* Dejamos la fila que estábamos analizando como estaba para que no
interfiera en las siguientes lecturas */
}
}
2 Práctica 4. Edición 1. Revisión 0. Junio 2018
Tch-Inno Figure Out & Solve it S.L.
Curso Arduino. Formación básica.
Curso Arduino: Formación básica
Práctica 4.1:
Lectura de matriz de bototes
(teclado) 4 x 4
Matriz P/N:
Lámina 1 de 1 09 Junio 2018
3 Práctica 4. Edición 1. Revisión 0. Junio 2018
Tch-Inno Figure Out & Solve it S.L.
Curso Arduino. Formación básica.
2.4.2.- Lectura Matriz botones. Teclado. Usando librería.
/* En este ejemplo veremos cómo realizar la lectura de una matriz de botones, para lo que emplearemos sólo un pin por columna y
un pin por fila. En este caso usando la librería Keypad de Arduino.
La librería la podéis encontrar en: Programa-> Incluir Librería -> Gestionar Librerías, y en el buscador, buscar "keypad" y
seleccionar la de los autores "Mark Stanley, Alexander Brevig".
Autor: Marc Filbà */
#include <Keypad.h>
#define NUM_COLUMNAS 4 /* Definimos la cantidad de columnas */
#define NUM_FILAS 4 /* Definimos la cantidad de filas */
char hexaTeclas [NUM_FILAS] [NUM_COLUMNAS] = { /* La librería necesita que le pasemos una matriz de */
{'0','1','2','3'}, /* caracteres acorde a las dimensiones de la matriz */
{'4','5','6','7'},
{'8','9','A','B'},
{'C','D','E','F'}
};
byte pinColumnas [NUM_COLUMNAS] = {7, 6, 5, 4}; /* Inicializamos dos vector con los pines de las columnas */
byte pinFilas [NUM_FILAS] = {8, 9, 10, 11}; /* y de las filas */
Keypad teclado = Keypad (makeKeymap (hexaTeclas), /* Inicializamos el teclado con la matriz de caracteres, los pines de las
pinFilas, pinColumnas, NUM_FILAS, NUM_COLUMNAS); filas, los de las columnas y las medidas de la matriz */
void setup() {
Serial.begin (115200); /* Inicializamos el puerto serie a 115200 bps */
}
void loop() {
char tecla = teclado.getKey(); /* Simplemente leemos la tecla pulsada */
if (tecla){ /* Si se ha pulsado alguna tecla, la imprimimos */
Serial.println(tecla); /* por el puerto serie */
}
}
4 Práctica 4. Edición 1. Revisión 0. Junio 2018
Tch-Inno Figure Out & Solve it S.L.
Curso Arduino. Formación básica.
Curso Arduino: Formación básica
Práctica 4.2:
Lectura de matriz de bototes
(teclado) 4 x 4
Matriz P/N:
Lámina 1 de 1 09 Junio 2018
5 Práctica 4. Edición 1. Revisión 0. Junio 2018