Teclados matriciais

Descrición

[telefone keypad ]
[telefone keypad By GuidoBCC BY-SA from Wikimedia]
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.

teclado_botoneirakeypad  botoneira

keypad_fritzing
[tecnoloxia.org CC By-SA from fritzing]

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.

 


Deixa un comentario