Teclado 4×4 cómo Interfaz de entrada con Arduino Uno
Introducción
El teclado se utiliza como dispositivo de entrada para leer la tecla pulsada por el usuario y procesarla. El teclado 4×4 consta de 4 filas y 4 columnas. Los conmutadores se colocan entre las filas y columnas.
Una pulsación de tecla establece una conexión entre la fila y la columna correspondiente, entre las que se encuentra el conmutador.
Cuando queremos conectar una llave al microcontrolador, necesita un pin GPIO. Pero cuando queremos interconectar muchas teclas como 9, 12 o 16 etc., entonces puede adquirir todos los pines GPIO del microcontrolador.
Para guardar algunos pines GPIO del microcontrolador, podemos utilizar el teclado de matriz. El teclado Matrix no es nada más que teclas dispuestas en filas y columnas. Por ejemplo, si queremos conectar 16 teclas al microcontrolador, necesitaremos 16 pines GPIO, pero si utilizamos un teclado de matriz 4×4, sólo necesitaremos 8 pines GPIO del microcontrolador.
Diagrama de las conexiones
Ejemplo
Lectura de la tecla pulsada en el teclado 4×4 y visualización en el terminal serie de Arduino.
Aquí usaremos la librería de teclados de Mark Stanley y Alexander Brevig que puedes descargar desde aquí.
Extrae la librería y añádela a la ruta de la carpeta de librerías del Arduino IDE.
Para más información sobre cómo añadir una biblioteca personalizada al IDE de Arduino y usar ejemplos de él, consulta Añadir biblioteca al IDE de Arduino.
Una vez que la librería ha sido añadida al IDE de Arduino, abre el IDE y abre el sketch de ejemplo para CustomKeypad desde la librería añadida.
En el ejemplo de sketch Custom Keypad incluido en la librería de teclados, los pines digitales 0 y 1 se utilizan para conectar filas. Esto resultará en que esas filas no funcionen para algunas personas.
La placa Arduino Uno tiene los pines digitales 0 y 1 conectados a los pines Tx y Rx que se utilizan para la comunicación serie. Dado que el sketch utiliza comunicación serie para mostrar la tecla pulsada en el terminal serie, esto provocará un comportamiento erróneo.
Para evitar esto, utiliza clavijas distintas a las clavijas 0 y 1. Puede consultar el esquema que se muestra a continuación para hacerse una idea de cómo hacerlo.
byte rowPins[ROWS] = {R1, R2, R3, R4}; /* conectar a las salidas de fila del teclado *//
byte colPins[COLS] = {C1, C2, C3, C4}; /* conectar a las salidas de columna del teclado *//
Si no conectas los pines de acuerdo con esta función, la identificación de la pulsación de la tecla no dará resultados de acuerdo con el teclado que ha definido.
Código para teclado 4×4
/* @file CustomKeypad.pde
|| @version 1.0
|| @author Alexander Brevig
|| @contact alexanderbrevig@gmail.com
||
|| @description
|| | Demonstrates changing the keypad size and key values.
|| #
*/
#include
const byte ROWS = 4; /* four rows */
const byte COLS = 4; /* four columns */
/* define the symbols on the buttons of the keypads */
char hexaKeys[ROWS][COLS] = {
{'0','1','2','3'},
{'4','5','6','7'},
{'8','9','A','B'},
{'C','D','E','F'}
};
byte rowPins[ROWS] = {10, 11, 12, 13}; /* connect to the row pinouts of the keypad */
byte colPins[COLS] = {6, 7, 8, 9}; /* connect to the column pinouts of the keypad */
/* initialize an instance of class NewKeypad */
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void setup(){
Serial.begin(9600);
}
void loop(){
char customKey = customKeypad.getKey();
if (customKey){
Serial.println(customKey);
}
}
Funciones utilizadas
1. makeKeymap(keys)
Esta función se utiliza para inicializar el mapa de teclas interno para que sea igual al mapa de teclas definido por el usuario (en la sintaxis de funciones que se indica más arriba, las teclas).
2. Keypad customKeypad = Keypad( makeKeymap(keys), rowPins, colPins, rows, cols)
Esto define un objeto customKeypad de la clase Keypad y lo inicializa.
rowPins y colPins son los pines de Arduino a los que se conectan las filas y columnas del teclado.
rows y cols son el número de filas y columnas que tiene el teclado.
3. customKeypad.getKey()
Esta función se utiliza para identificar qué tecla se pulsa en el teclado.
Interfaz 1-Conexión del teclado con Arduino
La interfaz anterior consume 8 pines GPIO de la placa Arduino. Utilizando el método de interfaz de 1 hilo para un teclado, podemos lograr el mismo resultado que el anterior utilizando sólo 1 pin GPIO.
Este método utiliza un sencillo concepto de divisor de tensión para generar diferentes tensiones para cada tecla pulsada.
Código
void setup() {
Serial.begin(9600); /* Define baud rate for serial communication */
}
void loop() {
int adc_val;
adc_val = analogRead(A1); /* Read input from keypad */
if (adc_val>850)
{
Serial.print("Key Pressed : ");
Serial.println("0");
delay(100);
}
else if ( adc_val>450 && adc_val<510) { Serial.print("Key Pressed : "); Serial.println("1"); delay(100); } else if ( adc_val>300 && adc_val<350) { Serial.print("Key Pressed : "); Serial.println("2"); delay(100); } else if ( adc_val>230 && adc_val<270) { Serial.print("Key Pressed : "); Serial.println("3"); delay(100); } else if ( adc_val>160 && adc_val<180) { Serial.print("Key Pressed : "); Serial.println("4"); delay(100); } else if ( adc_val>145 && adc_val<155) { Serial.print("Key Pressed : "); Serial.println("5"); delay(100); } else if ( adc_val>125 && adc_val<135) { Serial.print("Key Pressed : "); Serial.println("6"); delay(100); } else if ( adc_val>105 && adc_val<120) { Serial.print("Key Pressed : "); Serial.println("7"); delay(100); } else if ( adc_val>92 && adc_val<99) { Serial.print("Key Pressed : "); Serial.println("8"); delay(100); } else if ( adc_val>82 && adc_val<90) { Serial.print("Key Pressed : "); Serial.println("9"); delay(100); } else if ( adc_val>77 && adc_val<81) { Serial.print("Key Pressed : "); Serial.println("A"); delay(100); } else if ( adc_val>72 && adc_val<76) { Serial.print("Key Pressed : "); Serial.println("B"); delay(100); } else if ( adc_val>63 && adc_val<68) { Serial.print("Key Pressed : "); Serial.println("C"); delay(100); } else if ( adc_val>60 && adc_val<62) { Serial.print("Key Pressed : "); Serial.println("D"); delay(100); } else if ( adc_val>57 && adc_val<59) { Serial.print("Key Pressed : "); Serial.println("E"); delay(100); } else if( adc_val>52 && adc_val<56)
{
Serial.print("Key Pressed : ");
Serial.println("F");
delay(100);
}
else
{
}
delay(100);
}
Los valores de ADC utilizados para decidir las pulsaciones de teclas se han averiguado prácticamente. Es posible que tengas que averiguar los valores de ADC prácticamente. Estos valores han sido encontrados para la combinación de resistencias mostrada en el diagrama de interfaz. Si utilizas otros valores de resistencia, el código anterior dará una salida defectuosa. Si decides utilizar otros valores de resistencia, tendrás que averiguar los valores de ADC para cada tecla pulsada y realizar los cambios correspondientes en el código.
Debe estar conectado para enviar un comentario.