++Leer botones es algo que ya no tiene secretos para nosotros, pero si conectáramos cada tecla a un pin digital de nuestro Arduino, pronto estaríamos en apuros.
El teclado de nuestro ordenador suele ser de alrededor de 106 teclas, así que el método de fuerza bruta va a entrar en apuros rápidamente. Necesitamos otra solución.
Y como el mundo está lleno de gente ingeniosa se les ocurrió una solución de lo más elegante, una matriz de teclas.
Vamos a ver un ejemplo con un pequeño teclado numérico de 16 teclas tipo los de los teléfonos móviles o los de los cajeros automáticos.
Conecta los pines del teclado a los pines digitales del Arduino de la siguiente manera:
- Pin 1 del teclado a Pin 2 del Arduino
- Pin 2 del teclado a Pin 3 del Arduino
- Pin 3 del teclado a Pin 4 del Arduino
- Pin 4 del teclado a Pin 5 del Arduino
- Pin 5 del teclado a Pin 6 del Arduino
- Pin 6 del teclado a Pin 7 del Arduino
- Pin 7 del teclado a Pin 8 del Arduino
Código de Arduino
#include
// Define el tamaño de la matriz del teclado
const byte FILAS = 4; // Cuatro filas
const byte COLUMNAS = 3; // Tres columnas
// Definir los caracteres del teclado en una matriz 2D
char teclas[FILAS][COLUMNAS] = {
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'},
{'*', '0', '#'}
};
// Conectar los pines del teclado a los pines del Arduino
byte pinesFilas[FILAS] = {2, 3, 4, 5}; // Pines conectados a las filas
byte pinesColumnas[COLUMNAS] = {6, 7, 8}; // Pines conectados a las columnas
// Crear una instancia de la clase Keypad
Keypad teclado = Keypad(makeKeymap(teclas), pinesFilas, pinesColumnas, FILAS, COLUMNAS);
void setup() {
Serial.begin(9600); // Iniciar la comunicación serial a 9600 bps
}
void loop() {
char tecla = teclado.getKey(); // Obtener la tecla presionada
if (tecla) { // Si se ha presionado una tecla
Serial.println(tecla); // Imprimir la tecla en el monitor serial
}
}
Preguntas Frecuentes
¿Cómo funciona internamente una «matriz de teclas»?
Una matriz de teclas es una forma muy eficiente de leer múltiples botones usando un número reducido de pines. En lugar de conectar cada uno de los 12 botones a un pin, el teclado los organiza en una cuadrícula de 4 filas y 3 columnas.
El microcontrolador (como un Arduino) «escanea» el teclado: activa una fila a la vez (poniéndola en bajo, LOW) y luego lee el estado de las tres columnas. Si una columna también está en bajo, significa que el botón en la intersección de esa fila y esa columna ha sido presionado. Este proceso se repite muy rápidamente para todas las filas.
Gracias a esto, puedes leer 12 botones usando solo 7 pines (4 filas + 3 columnas), en lugar de los 12 pines que necesitarías en una conexión directa.
¿Qué tipo de conector tiene y cómo lo conecto a un protoboard?
Este teclado utiliza un conector de cable plano flexible (FPC) con 7 pines. Este tipo de conector no se puede enchufar directamente en un protoboard estándar.
La solución más común y sencilla es usar una tira de pines macho (pin header). Puedes insertar el extremo del cable plano en un conector de 7 pines y luego soldarlo o usarlo a presión para una conexión temporal. La forma más robusta es usar un conector FPC/FFC específico para PCB, soldándolo a una placa de prototipos, lo que te da una conexión muy segura. También es común insertar directamente los pines de cables Dupont macho en los huecos del conector del teclado para prototipar rápidamente.
¿Es necesario usar una librería de Arduino como «Keypad.h»? ¿Qué ventajas ofrece?
Si bien es posible escribir tu propio código de escaneo de matriz, usar una librería como Keypad.h es altamente recomendable por varias razones técnicas:
- Manejo del «Debouncing»: Los botones mecánicos, al ser presionados, rebotan internamente, generando múltiples señales rápidas. La librería maneja este «rebote» (debouncing) por ti, asegurando que cada pulsación se registre como un único evento.
- Gestión de Pulsaciones Múltiples: La librería puede gestionar la detección de varias teclas presionadas simultáneamente (si el hardware lo permite).
- Eventos de Teclado: Facilita la detección de diferentes estados, como cuando una tecla es presionada, cuando se mantiene presionada y cuando se suelta.
- Simplificación del Código: Abstrae toda la complejidad del escaneo de bajo nivel, permitiéndote simplemente pedir
teclado.getKey()
y concentrarte en la lógica de tu aplicación.
¿Qué es el «ghosting» en un teclado matricial y puede afectar a este modelo?
El «ghosting» es un problema inherente a los teclados matriciales simples que ocurre cuando se presionan tres o más teclas simultáneamente en una configuración específica (formando las esquinas de un rectángulo en la matriz). Esto puede hacer que el microcontrolador detecte una cuarta tecla «fantasma» que en realidad no ha sido presionada.
Este teclado, al ser una matriz simple sin diodos, es susceptible al ghosting. Para la mayoría de las aplicaciones (introducir un PIN, marcar un número), donde solo se presiona una tecla a la vez, esto no es un problema. Sin embargo, si tu proyecto requiere presionar múltiples teclas a la vez (como en un videojuego o un instrumento musical), necesitarías un teclado con «N-Key Rollover» (NKRO), que incluye un diodo en cada interruptor para evitar este fenómeno.
¿Qué tan duradero es un teclado de membrana y para qué entornos es adecuado?
Los teclados de membrana son sorprendentemente duraderos para su costo y delgadez. Sus características los hacen ideales para ciertos entornos:
- Resistencia a Salpicaduras y Polvo: La superficie plástica sellada protege los contactos internos de la suciedad, la humedad y las salpicaduras accidentales, haciéndolos más robustos que los teclados con botones expuestos en entornos de taller o cocina.
- Bajo Perfil: Al ser extremadamente delgados y flexibles, se pueden montar fácilmente en paneles y carcasas con su respaldo adhesivo, creando interfaces de usuario limpias y compactas.
- Vida Útil: Tienen una vida útil finita, generalmente especificada en cientos de miles o millones de pulsaciones por tecla, lo cual es más que suficiente para la mayoría de los proyectos.
¿Puedo leer este teclado usando menos de 7 pines?
Sí, es posible para usuarios más avanzados que necesiten ahorrar pines en su microcontrolador. Un método común es usar un circuito divisor de voltaje con resistencias.
La idea es conectar cada columna a un punto diferente de una cadena de resistencias, de modo que cada botón, al ser presionado, cree una ruta a tierra que genere un voltaje único en una sola entrada analógica del microcontrolador. Luego, en tu código, lees el valor de la entrada analógica y lo comparas con rangos de valores predefinidos para determinar qué tecla fue presionada.
Esta técnica, conocida como «lectura de teclado por ADC», te permite leer las 12 teclas usando solo un pin analógico y 4 pines digitales para las filas, pero requiere una calibración cuidadosa y es más susceptible al ruido.
Valoraciones
No hay valoraciones aún.