Вы находитесь на странице: 1из 9

USAR UN TECLADO

MATRICIAL CON
ARDUINO

2 OCTUBRE, 2016

¿QUÉ ES UN TECLADO
MATRICIAL?
Un teclado matricial es un dispositivo que agrupa varios pulsadores y permite
controlarlos empleando un número de conductores inferior al que necesitaríamos al
usarlos de forma individual. Podemos emplear estos teclados como un controlador
para un autómata o un procesador como Arduino.
Estos dispositivos agrupan los pulsadores en filas y columnas formando una
matriz, disposición que da lugar a su nombre. Es frecuente una disposición
rectangular pura de NxM columnas, aunque otras disposiciones son igualmente
posibles.

Los teclados matriciales son frecuentes en electrónica e informática. De hecho,


los teclados de ordenador normales son teclados matriciales, siendo un buen ejemplo
de teclado matricial con disposición no rectangular.

Una de las desventajas de usar un teclado matricial es que pueden causar


problemas cuando se pulsa más de una tecla simultáneamente. Este es uno de los
motivos por el que los teclados de ordenador usan una disposición no rectangular,
agrupando ciertas teclas en circuitos diferentes (Ctrl, Alt, Shift…)

En el campo de la electrónica casera y Arduino, se venden múltiples modelos de


teclados matriciales en distintos soportes (rígidos o flexibles) y con distinto número
de teclas, siendo habituales configuraciones de 3×3, 3×4, y 4×4.

Podemos emplear teclados matriciales en nuestros proyectos de electrónica y


robótica, por ejemplo, para cambiar el modo de funcionamiento de un montaje, para
solicitar un password, como teclas de dirección para controlar un brazo robótico o un
vehículo, o proporcionar instrucciones a un robot.

PRECIO
Los teclados matriciales son dispositivos baratos. Podemos encontrar teclados
matriciales de 3×4 y 4×4 pulsadores por 0,45€ en vendedores internacionales de
AliExpress o eBay.
¿CÓMO FUNCIONA UN
TECLADO MATRICIAL?
Como hemos dicho, un teclado matricial agrupa los pulsadores en filas y
columnas formando una matriz, lo que permite emplear un número menor de
conductores para determinar las pulsación de las teclas.

La siguiente imagen muestra, a modo de ejemplo, una disposición rectangular de


4×4, aunque el funcionamiento es análogo en otras disposiciones. Al detectar la
pulsación en la columna X y la fila Y, sabremos que se ha pulsado la tecla (X,Y).

Internamente la disposición de los pulsadores es la siguiente, que es muy similar


a la disposición que vimos al tratar sobre displays LED matriciales.
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.

Para leer todas las teclas tendremos que hacer un barrido por filas. En primer
lugar ponemos todas las filas a 5V, y definimos todas las columnas como entradas con
resistencia de pull-up.

Progresivamente ponemos una fila a 0V, y leemos las entradas de la columna.


Una vez realizada la lectura volvemos a ponerla a 5V, pasamos a la siguiente fila, y
volvemos a realizar el progreso hasta recorrer todas las filas.

El papel de filas y columnas en la explicación es intercambiable, pudiendo realizar un


barrido por las columnas, y lectura en las filas.

Para detectar NxM pulsadores necesitamos sólo N+M conductores. Por tanto
ahorro de conductores es superior cuanto más grandes sean N y M, y más parecidos
entre sí. (ej: 16 pulsadores en 2×8 necesitan 10 conductores, y en 4×4 sólo 8
conductores.)
En consecuencia, los teclados de 1xM, Nx1 y 2×2 no suponen ningún ahorro en
conductores aunque, independientemente, puede que os resulten de utilidad
únicamente por agrupar en un mismo dispositivo la disposición que deseáis.

Como hemos comentado, la mayor desventaja de la disposición matricial es que


pueden dar problemas al detectar la pulsación de múltiples teclas de forma
simultánea.

ESQUEMA DE CONEXIÓN
El esquema de conexión es sencillo. Simplemente conectamos todos los pines a
entradas digitales de Arduino. Por ejemplo, en el ejemplo de un teclado de 4×4 el
esquema quedaría de la siguiente forma.
Que visto desde Arduino quedaría de la siguiente forma.
EJEMPLOS DE CÓDIGO

SIN LIBRERÍA
En el primer ejemplo, realizaremos la lectura sin emplear ninguna librería. Para
ello, realizamos un bucle poniendo a LOW secuencialmente las distintas filas, y
realizando la lectura por columnas. Si detectamos la pulsación de una tecla el valor se
muestra por el puerto serie.

1 const unsigned long period = 50;


2 unsigned long prevMillis = 0;
3
4 byte iRow = 0, iCol = 0;
5 const byte countRows = 4;
6 const byte countColumns = 4;
7
8 const byte rowsPins[countRows] = { 11, 10, 9, 8 };
9 const byte columnsPins[countColumns] = { 7, 6, 5, 4 };
10
11 char keys[countRows][countColumns] = {
12 { '1','2','3', 'A' },
13 { '4','5','6', 'B' },
14 { '7','8','9', 'C' },
15 { '#','0','*', 'D' }
16 };
17
18 bool readKeypad()
19 {
20 // Barrer todas las filas
21 for (byte r = 0; r < countRows; r++)
22 {
23 pinMode(rowsPins[r], OUTPUT);
24 digitalWrite(rowsPins[r], LOW); // Poner en LOW fila
25
26
// Comprobar la fila
27
for (byte c = 0; c < countColumns; c++)
28
{
29
if (digitalRead(columnsPins[c]) == LOW) // Pulsacion detectada
30
{
31
iRow = r;
32
iCol = c;
33 return true;
34 }
35 }
36
37 pinMode(rowsPins[r], HIGH); // Ponen en HIGH fila
38 digitalWrite(rowsPins[r], INPUT); // Poner en alta impedancia
39 }
40 return false;
41 }
42
43 // Iniciar valores
44 void setup()
45 {
46 Serial.begin(9600);
47
48 for (byte c = 0; c < countColumns; c++)
49 {
50 pinMode(columnsPins[c], INPUT_PULLUP);
51 }
52 for (byte r = 0; r < countRows; r++)
53 {
54 pinMode(rowsPins[r], OUTPUT);
55 digitalWrite(rowsPins[r], HIGH);
56 }
57 }
58
59 void loop()
60 {
61 if (millis() - prevMillis > period) // Espera no bloqueante
62 {
63 prevMillis = millis();
64 if (readKeypad()) // Detección de tecla pulsada
65 {
66 Serial.println(keys[iRow][iCol]); // Mostrar tecla
67 }
68 }
69 }

CON LIBRERÍA
Existen varias librerías diseñaras para facilitar la lectura de teclados matriciales
en Arduino. Por ejemplo, la librería Keypad, disponible en este enlace. La librería
proporciona ejemplos de código, que resulta aconsejable revisar.

El siguiente ejemplos es una modificación a partir de los disponibles en la


librería.
#include <Keypad.h>
1
2 const byte rowsCount = 4;
3 const byte columsCount = 4;
4
5 char keys[rowsCount][columsCount] = {
6 { '1','2','3', 'A' },
7 { '4','5','6', 'B' },
8 { '7','8','9', 'C' },
9 { '#','0','*', 'D' }
10 };
11
12
const byte rowPins[rowsCount] = { 11, 10, 9, 8 };
13
const byte columnPins[columsCount] = { 7, 6, 5, 4 };
14
15
Keypad keypad = Keypad(makeKeymap(keys), rowPins, columnPins, rowsCount,
16
columsCount);
17
18
19 void setup() {
20 Serial.begin(9600);
21 }
22
23 void loop() {
24 char key = keypad.getKey();
25
26 if (key) {
27 Serial.println(key);
28 }
}