Teclados matriciales
| Actualizado:
Comentarios: 0
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);
}
}