Descrición
![[telefone keypad ]](https://tecnoloxia.org/robotica/wp-content/uploads/sites/5/2016/12/telephone_keypad.jpg)
Estes teclados permiten aforrar conexións á hora de capturar pulsacións. Imaxina que para o teu proxecto necesitaras 12 pulsadores. Xa terías ocupados case todos os pins dixitais do Arduíno!
Nos teclados matriciais as conexións están dispostas en filas e columnas. Desta maneira para 16 pulsadores só necesitamos 8 cables (4 filas e 4 columnas).
Para esta práctica podes utilizar unha botoneira, un teclado matricial de membrana (4×3 ou 4×4), ou construír ti mesmo o teclado conectando pulsadores en filas e columnas.



Conexión
Imos programar un teclado sonoro e un sistema de seguridade ao que hai que inserir unha clave. Para este exemplo utilizaremos un teclado de membrana 4×4.
- Conectamos o teclado nos primeiros pins dixitais (de 2 a 9)
- Conectamos un LED vermello (pin 13) e un verde (pin 12) con resistencias de 220Ω para visualizar o boqueo e desbloqueo.
- Conectamos tamén un zumbador (pin 11) para reproducir son.
Non se necesita conectar resistencias aos pulsadores, xa que a librería que imos utilizar (keypad.h) xa se atopa configurada para usar as resistencias pullup dos seus pins.
Librería
Podemos programar o teclado manualmente (primeiro exemplo) ou utilizar a librería keypad (exemplos seguintes). Descárgaa ao teu ordenador e, despois, desde o IDE seleccionamos Sketch → Incluír biblioteca → Engadir .zip. Despois inclúea no programa Sketch → Incluír biblioteca → keypad
Programas
1. Visualización Manual
Imos visualizar na consola serie a pulsación de cada unha das teclas para comprobar o funcionamento do teclado.
// Constantes e variables
byte pinsFila[] = { 9,8,7 };
byte pinsColumna[] = { 6,5,4,3};
const byte filas = 3;
const byte columnas = 4;
char teclas[filas][columnas] = {
{'#', '9', '6', '3'},
{'0', '8', '5', '2'},
{'*', '7', '4', '1'}
};
// Configuración
void setup(){
for (int nF = 0; nF < filas; nF++) {
pinMode(pinsFila[nF], OUTPUT);
digitalWrite(pinsFila[nF], HIGH);
}
for (int nC = 0; nC < columnas; nC++) {
pinMode(pinsColumna[nC], INPUT_PULLUP);
}
Serial.begin(9600);
Serial.println("Teclado 4x4");
Serial.println("Preme nunha tecla");
Serial.println();
}
void loop(){
for (int nF = 0; nF < filas; nF++){
digitalWrite(pinsFila[nF], LOW);
for (int nC = 0; nC < columnas; nC++) {
if (digitalRead(pinsColumna[nC]) == LOW){ // Detección dunha tecla
Serial.print("Tecla: ");
Serial.println(teclas[nF][nC]);
while(digitalRead(pinsColumna[nC]) == LOW){}
}
}
digitalWrite(pinsFila[nF], HIGH);
}
delay(10);
}
2. Visualización Librería
Este programa fai o mesmo có anterior, pero utiliza a librería Keypad.h. Adapta este programa ao teclado que esteas usando (por exemplo podes usar un 4×3 como no exemplo anterior) e comproba que o mostrado na pantalla se corresponde coa tecla que estás a pulsar.
#include <Keypad.h> // incluímos a librería keypad
// Definición
const byte filas = 4; // byte ocupa menos que int
const byte columnas = 4;
char teclas[filas][columnas] = { // Caracteres do teclado
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte pinsFila[filas] = {9, 8, 7, 6}; // Pins filas
byte pinsColumna[columnas] = {5, 4, 3, 2}; // Pins columnas
Keypad teclado = Keypad(makeKeymap(teclas),pinsFila,pinsColumna,filas,columnas); // Función de mapeo das teclas
// Configuración
void setup(){
Serial.begin(9600);
}
// Programa
void loop(){
char tecla = teclado.getKey(); // Función de quevolve a tecla que foi premida
if (tecla != 0){ // Se o valor é distinto de 0 (pulsouse unha tecla)
Serial.println(tecla); // mostrámola na consola
}
}
3. Música
Imos usar o teclado para reproducir música. Repasa as prácticas de “Xogando co son“.
Debemos engadir ao programa anterior un zumbador no pin 11 configurado como saída, e un array cos valores das diferentes notas.
Mentres o teclado estea premido soará a nota correspondente á tecla seleccionada, e parará o son cando deixemos de premer. Para iso utilizamos as condicións if (teclado.getState() == PRESSED){} e if (teclado.getState() == RELEASED) {}
#include <Keypad.h> // incluímos a librería keypad
// Definición
const int zumbador = 11; // zumbador no pin 11
// Creamos as notas mulicais
const int DO = 262;
const int RE = 294;
const int MI = 330;
const int FA = 349;
const int SOL = 392;
const int LA = 440;
const int SI = 494;
const int DO2 = 523;
int notas[] = {DO, RE, MI, FA, SOL, LA, SI, DO2};
// Definición do teclado matricial
const byte filas = 4;
const byte columnas = 4;
char teclas[filas][columnas] = { // Caracteres do teclado
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte pinsFila[filas] = {9, 8, 7, 6}; // Pins filas
byte pinsColumna[columnas] = {5, 4, 3, 2}; // Pins columnas
Keypad teclado = Keypad(makeKeymap(teclas), pinsFila, pinsColumna, filas, columnas); // Mapeo de teclas
// Configuración
void setup(){
Serial.begin(9600);
pinMode(zumbador, OUTPUT);
}
// Programa
void loop(){
char tecla = teclado.getKey(); // Función de quevolve a tecla que foi premida
if (tecla != 0){ // Se prememos unha tecla
if (teclado.getState() == PRESSED){ // Se o teclado está sendo pulsado
Serial.println(tecla); // mostramos a tecla na consola
switch (tecla) { // Reproducimos a nota correspondente
case '1': tone(zumbador, notas[0]); break;
case '2': tone(zumbador, notas[1]); break;
case '3': tone(zumbador, notas[2]); break;
case '4': tone(zumbador, notas[3]); break;
case '5': tone(zumbador, notas[4]); break;
case '6': tone(zumbador, notas[5]); break;
case '7': tone(zumbador, notas[6]); break;
case '8': tone(zumbador, notas[7]); break;
default: noTone(zumbador); break;
}
}
}
if (teclado.getState() == RELEASED) { // Se o teclado non está sendo pulsado
noTone(zumbador); // silencio
}
}
4. Clave
Inicialmente o sistema está bloqueado (led vermello aceso). Debemos introducir unha clave a través do teclado e pulsar #. Se a clave é correcta desbloquéase (LED verde aceso) e se non reseteamos e manda introducir de novo a clave.
#include <Keypad.h> // incluímos a librería keypad
// Definición
// LEDs e zumbador
const int ledVermello = 13;
const int ledVerde = 12;
const int zumbador = 11;
// Teclado matricial
const byte filas = 4; // byte ocupa menos que int
const byte columnas = 4;
char teclas[filas][columnas] = { // Caracteres do teclado
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte pinsFila[filas] = {9, 8, 7, 6}; // Pins filas
byte pinsColumna[columnas] = {5, 4, 3, 2}; // Pins columnas
Keypad teclado = Keypad(makeKeymap(teclas), pinsFila, pinsColumna, filas, columnas); // Mapeo de teclas
// Claves
String claveGardada = "1234"; // Clave de seguridade
String claveIntroducida; // Clave introducida polo usuario/a
int bloqueo = 1; // Estado
// Configuración
void setup(){
Serial.begin(9600);
while(!Serial);
pinMode(ledVermello, OUTPUT);
pinMode(ledVerde, OUTPUT);
pinMode(zumbador, OUTPUT);
Serial.println("Sistema bloqueado");
Serial.println("Introduce a clave e preme #");
Serial.println("para resetear ou bloquear preme *");
}
// Programa
// Función reset
void reset(){
Serial.println("reset.Sistema bloqueado");
Serial.println("Introduce de novo a clave");
claveIntroducida ="";
bloqueo =1;
}
// Función comprobar
void comprobar(){
if(claveIntroducida==claveGardada){
Serial.println("Clave correcta");
Serial.println("Desbloqueado!");
claveIntroducida ="";
bloqueo=0;
}
else{
Serial.println("Clave incorrecta");
reset();
}
}
// Programa loop
void loop(){
char tecla = teclado.getKey(); // Función de que devolve a tecla que foi premida
if (tecla != 0){ // Se pulsamos unha tecla
if(tecla == '*'){ // tecla * -> reseteamos
reset();
}
else if(tecla == '#'){ // tecla # -> comprobar
comprobar();
}
else{
claveIntroducida=claveIntroducida+tecla;
Serial.println(claveIntroducida);
}
}
if (bloqueo==1){
digitalWrite(ledVermello,HIGH);
digitalWrite(ledVerde,LOW);
}
if (bloqueo==0){
digitalWrite(ledVermello,LOW);
digitalWrite(ledVerde,HIGH);
}
}
Propostas
- Escintileos: Fai que un LED escintile o número de veces marcado polas teclas. É dicir, se prememos no 2 escintilara’2 veces, no 3 tres veces, etc. O programa “Faro2” da sección de bucles pode servirche de referencia.
- Melodías: Modifica o programa “música” engadindo melodías predefinidas para as teclas A, B, e C. Cada vez que prememos en ditas teclas debe soar a melodía completa.
- Clave mellorada: No programa da clave engade funcións de son para os diferentes eventos: pulsación, reset e desbloqueo. Despois invócaas no programa. Engade unha pantalla LCD e fai que se visualicen nela as mensaxes.