Teclados matriciales

Los teclados son una excelente manera de permitir que los usuarios interactúen con sus proyectos. Se pueden usar para navegar por los menús, introducir contraseñas o controlar los juegos y robots.
Básicamente un teclado matricial está compuesto por pulsadores organizados en filas y columnas formando una matriz.
¿Cómo funciona un teclado matricial?
Las teclas de un teclado están organizadas en filas y columnas. Existen múltiples teclados con diferente número de teclas, siendo los más habituales las configuraciones de 3×3, 3×4 y 4×4.
Este tipo de teclados están constituidos por 3 membranas superpuestas, dos membranas con material conductor y una en medio no conductora, para separarlas. En condiciones normales, el interruptor se encuentra abierto, pero al presionar la tecla, la membrana superior e inferior entran en contacto permitiendo la circulación de la corriente.
El esquema de conexión de un teclado 4×4 sería:

Como podemos observar los pulsadores están distribuidos en filas y columnas. Para detectar la pulsación de una tecla tendremos que conocer la posición (X, Y). Por ejemplo, la tecla del número 5 corresponde a la fila 2 y columna 2, por lo que se encuentra en la posición (2,2).

Conexión con Arduino.
Esquema:
Para el montaje, conectamos todos los pines a las salidas digitales de Arduino, por ejemplo, el esquema nos podría quedar de la siguiente forma:

Código sin utilizar librería:
byte pinesFilas[] = {11,10,9,8}; byte pinesColumnas[] = {7,6,5,4}; const byte numeroFilas = 4; const byte numeroColumnas = 4; char teclas[4][4] = {{'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'}}; void setup(){ for (int nF = 0; nF < numeroFilas; nF++) { pinMode(pinesFilas[nF], OUTPUT); digitalWrite(pinesFilas[nF], HIGH); } for (int nC = 0; nC < numeroColumnas; nC++) { pinMode(pinesColumnas[nC], INPUT_PULLUP); } Serial.begin(9600); Serial.println("Teclado 4x4"); Serial.println(); } void loop(){ for (int nF = 0; nF < numeroFilas; nF++){ digitalWrite(pinesFilas[nF], LOW); for (int nC = 0; nC < numeroColumnas; nC++) { if (digitalRead(pinesColumnas[nC]) == LOW){ Serial.print("Tecla: "); Serial.println(teclas[nF][nC]); while(digitalRead(pinesColumnas[nC]) == LOW){} } } digitalWrite(pinesFilas[nF], HIGH); } delay(10); }
Código utilizando la librería Keypad:
#include <Keypad.h> const byte filas = 4; const byte columnas = 4; char botones[filas][columnas] = { { '1','2','3', 'A' }, { '4','5','6', 'B' }, { '7','8','9', 'C' }, { '#','0','*', 'D' } }; const byte pinesFilas[filas] = { 11, 10, 9, 8 }; const byte pinesColumnas[columnas] = { 7, 6, 5, 4 }; Keypad teclado = Keypad(makeKeymap(botones), pinesFilas, pinesColumnas, filas, columnas); void setup() { Serial.begin(9600); Serial.println("Teclado 4x4"); Serial.println(); } void loop() { char tecla = teclado.getKey(); if (tecla) { Serial.print("Tecla: "); Serial.println(tecla); } }
Deja un comentario