Descrición
Os teclados matriciais son os que atopas nas calculadoras, caixeiros automáticos, máquinas expendedoras, mandos a distancia ou teléfonos. Consisten nunha serie de pulsadores conectados en forma de matriz.
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.