Como configurar um teclado em um Arduino

Tempo de leitura: 8 minutes

Os teclados são uma ótima maneira de permitir que os usuários interajam com seu projeto. Você pode usá-los para navegar nos menus, inserir senhas e controlar jogos e robôs.

Neste tutorial, mostrarei como configurar um teclado no Arduino. Primeiro, explicarei como o Arduino detecta o pressionamento de teclas e mostrarei como encontrar a pinagem de qualquer teclado. Como exemplo simples, mostrarei como imprimir as teclas pressionadas no monitor serial e em um LCD. Por fim, mostrarei como ativar um relé de 5V quando uma senha for digitada corretamente.

Neste artigo, usarei um teclado de membrana matricial 4X4, mas também existem diagramas de código e fiação para os teclados matriciais 3X4. Gosto de teclados de membrana porque eles são finos e também têm adesivo para que você possa colá-los na maioria das superfícies planas. Você também pode obter teclados no estilo de telefone com botões mais grossos, se preferir esse estilo. Até os teclados recuperados de telefones antigos funcionarão com o Arduino.

Como funcionam os teclados

Os botões do teclado estão organizados em linhas e colunas. Um teclado 3X4 possui 4 linhas e 3 colunas e um teclado 4X4 possui 4 linhas e 4 colunas:

Teclado 4x4

Abaixo de cada chave há um interruptor de membrana. Cada chave em uma linha é conectada a outras chaves na linha por um traço condutivo embaixo do bloco. Cada chave em uma coluna é conectada da mesma maneira – um lado da chave é conectado a todas as outras chaves naquela coluna por um traço condutivo. Cada linha e coluna é trazida para um único pino, para um total de 8 pinos em um teclado 4X4:

Teclado 4x4

Pressing a button closes the switch between a column and a row trace, allowing current to flow between a column pin and a row pin.

O esquema de um teclado 4X4 mostra como as linhas e colunas estão conectadas:

Teclado 4x4

O Arduino detecta qual botão é pressionado, detectando o pino de linha e coluna que está conectado ao botão.

Isso acontece em quatro etapas:

1. Primeiro, quando nenhum botão é pressionado, todos os pinos da coluna são mantidos ALTOS e todos os pinos da linha são mantidos BAIXOS:

Teclado 4x4

2. Quando um botão é pressionado, o pino da coluna é puxado para BAIXO, pois a corrente da coluna ALTA flui para o pino da linha BAIXA:

Teclado 4x4

3. O Arduino agora sabe em qual coluna o botão está, então agora ele só precisa encontrar a linha em que o botão está. Ele faz isso mudando cada um dos pinos de linha HIGH e, ao mesmo tempo, lendo toda a coluna pinos para detectar qual pino de coluna retorna para ALTO:

Teclado 4x4

4. Quando o pino da coluna fica ALTO novamente, o Arduino encontrou o pino da linha que está conectado ao botão:

Teclado 4x4

No diagrama acima, você pode ver que a combinação da linha 2 e coluna 2 só pode significar que o botão número 5 foi pressionado.

Conecte o teclado ao Arduino

O layout do pino para a maioria dos teclados de membrana será semelhante a este:

Teclado 4x4

Siga os diagramas abaixo para conectar o teclado a um Arduino Uno, dependendo se você tem um teclado 3X4 ou 4X4:

Teclado 4x4

Como encontrar a pinagem do seu teclado

Se o layout dos pinos do seu teclado não corresponder aos anteriores, você pode sondar os pinos para descobrir. Você precisará construir um circuito de teste conectando um LED e um resistor limitador de corrente ao Arduino (ou qualquer fonte de alimentação de 5 V) como este:

Teclado 4x4

Primeiro, descubra quais pinos do teclado estão conectados às fileiras de botões. Insira o fio terra (preto) no primeiro pino à esquerda. Pressione qualquer botão na linha 1 e mantenha-o pressionado. Agora insira o fio positivo (vermelho) em cada um dos outros pinos. Se o LED acender em um dos pinos, pressione e segure outro botão na linha 1 e, em seguida, insira o fio positivo em cada um dos outros pinos novamente. Se o LED acender em um pino diferente, significa que o fio terra está inserido no pino da linha 1. Se nenhum dos botões da linha 1 acender o LED, o fio terra não está conectado à linha 1. Agora mova o fio terra para o próximo pino, pressione um botão em uma linha diferente e repita o processo acima até você encontrei o pino para cada linha.

Para descobrir a quais pinos as colunas estão conectadas, insira o fio terra no pino que você sabe que é a linha 1. Agora pressione e segure qualquer um dos botões dessa linha. Agora insira o fio positivo em cada um dos pinos restantes. O pino que faz o LED acender é o pino que está conectado à coluna desse botão. Agora pressione outro botão na mesma linha e insira o fio positivo em cada um dos outros pinos. Repita esse processo para cada uma das outras colunas até que cada uma seja mapeada.

Programando o teclado

Para uma demonstração básica de como configurar o teclado, mostrarei como imprimir cada tecla pressionada no monitor serial.

Instale a Biblioteca

Usaremos a biblioteca do teclado de Mark Stanley e Alexander Brevig. Esta biblioteca se encarrega de configurar os pinos e consultar as diferentes colunas e linhas. Para instalar a biblioteca do teclado, vá para Sketch> Incluir biblioteca> Gerenciar bibliotecas e pesquise “keypad”. Clique na biblioteca e em instalar.

O código para um teclado 4X4

Depois que a biblioteca do teclado estiver instalada, você pode fazer upload desse código para o Arduino se estiver usando um teclado 4X4:

#include <Keypad.h>

const byte ROWS = 4; 
const byte COLS = 4; 

char hexaKeys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

byte rowPins[ROWS] = {9, 8, 7, 6}; 
byte colPins[COLS] = {5, 4, 3, 2}; 

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);
  }
}

O código para um teclado 3X4

Se estiver usando um teclado 3X4, você pode usar este código:

#include <Keypad.h>

const byte ROWS = 4; 
const byte COLS = 3; 

char hexaKeys[ROWS][COLS] = {
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};

byte rowPins[ROWS] = {9, 8, 7, 6}; 
byte colPins[COLS] = {5, 4, 3}; 

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);
  }
}

As linhas 3 e 4 no código acima definem o número de linhas e colunas no teclado.

As linhas 6-11 definem quais caracteres são impressos quando um botão específico é pressionado no teclado. Os caracteres são dispostos exatamente como aparecem no teclado. Se o seu teclado tiver um layout diferente, você pode definir quais caracteres são impressos quando você pressiona um botão. Por exemplo, digamos que seu teclado tenha uma coluna de letras à esquerda em vez de à direita. Você apenas mudaria para este:

char hexaKeys[ROWS][COLS] = {
 {'A', '1', '2', '3'},
 {'B', '4', '5', '6'},
 {'C', '7', '8', '9'},
 {'D', '*', '0', '#'}
}; 

Depois de carregar o código, abra o monitor serial. Ao pressionar uma tecla, o valor será impresso:

Teclado 4x4

Usando um LCD com o teclado

Agora vamos ver como imprimir as teclas pressionadas em um LCD. Os teclados 4X4 usam 8 pinos e os teclados 3X4 usam 7 pinos. Isso ocupa muitos pinos, então vou usar um LCD habilitado para I2C porque ele só precisa de 4 fios para se conectar ao Arduino.

Instale a Biblioteca LiquidCrystal_I2C

Para usar um LCD habilitado para I2C no Arduino, você precisará instalar a biblioteca LiquidCrystal I2C de Marco Schwartz. Esta biblioteca é boa porque inclui a maioria das funções disponíveis na biblioteca LiquidCrystal padrão. Para instalá-lo, baixe o arquivo ZIP abaixo e vá para Sketch> Incluir Biblioteca> Adicionar Biblioteca .ZIP:

A Library Wire

A biblioteca Wire é necessária para adicionar suporte para comunicação I2C. Ele vem empacotado com o IDE do Arduino, portanto, não há necessidade de instalá-lo. Mas se por algum motivo ele não estiver instalado em seu sistema, vá para Sketch> Incluir Biblioteca> Gerenciar Bibliotecas e pesquise “wire” para instalá-lo.

Conecte o teclado e o LCD

Assim que as bibliotecas estiverem instaladas, conecte os pinos terra e Vcc do LCD ao Arduino, em seguida, conecte os pinos SDA e SCL do LCD de acordo com a tabela abaixo para as diferentes placas Arduino:

Teclado 4x4

Em seguida, conecte o teclado ao Arduino. Deve ser parecido com isto (para um Arduino Uno):

Teclado 4x4

Código para saída para um LCD

Depois que tudo estiver conectado, faça upload deste código para o Arduino:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>

const byte ROWS = 4;
const byte COLS = 4;

char hexaKeys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};

Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

LiquidCrystal_I2C lcd(0x21, 16, 2);  

void setup(){
  lcd.backlight();
  lcd.init(); 
}

void loop(){
  char customKey = customKeypad.getKey();
  if (customKey){
    lcd.clear();
    lcd.setCursor(0, 0); 
    lcd.print(customKey);
  }
}

Você precisará adicionar o endereço I2C do seu LCD na linha 20:

LiquidCrystal_I2C lcd(0x21, 16, 2);  

O endereço I2C do meu LCD é 0x21, mas o seu provavelmente será diferente. O endereço I2C de seu LCD deve ser fornecido na folha de dados, mas se não, você pode encontrá-lo executando este sketch I2C_Scanner.

Use uma senha para ativar um relé

Uma das aplicações mais úteis de um teclado é usá-lo para entrada com teclado. Você pode configurar uma senha e fazer com que o Arduino ative um relé ou algum outro módulo se a senha estiver correta. O código a seguir ativará um relé de 5 V quando a senha for inserida corretamente:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>

#define Password_Length 8 

int signalPin = 12;

char Data[Password_Length]; 
char Master[Password_Length] = "123A456"; 
byte data_count = 0, master_count = 0;
bool Pass_is_good;
char customKey;

const byte ROWS = 4;
const byte COLS = 4;

char hexaKeys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};

Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

LiquidCrystal_I2C lcd(0x21, 16, 2);  

void setup(){
  lcd.init(); 
  lcd.backlight();
  pinMode(signalPin, OUTPUT);
}

void loop(){

  lcd.setCursor(0,0);
  lcd.print("Enter Password:");

  customKey = customKeypad.getKey();
  if (customKey){
    Data[data_count] = customKey; 
    lcd.setCursor(data_count,1); 
    lcd.print(Data[data_count]); 
    data_count++; 
    }

  if(data_count == Password_Length-1){
    lcd.clear();

    if(!strcmp(Data, Master)){
      lcd.print("Correct");
      digitalWrite(signalPin, HIGH); 
      delay(5000);
      digitalWrite(signalPin, LOW);
      }
    else{
      lcd.print("Incorrect");
      delay(1000);
      }
    
    lcd.clear();
    clearData();  
  }
}

void clearData(){
  while(data_count !=0){
    Data[data_count--] = 0; 
  }
  return;
}

Você pode alterar a senha na linha 10 substituindo o texto 123A456 por sua própria senha:

char Master[Password_Length] = "123A456";

O comprimento da senha deve ser definido na linha 5:

#define Password_Length 8

A senha no exemplo acima tem apenas 7 caracteres, mas o comprimento da senha é maior que 7 porque há um caractere nulo adicionado ao final da string. Por exemplo, se sua senha tiver 5 caracteres, você deverá inserir 6 para o comprimento da senha.

O pino de saída que ativa o relé é definido na linha 7:

int signalPin = 12;

Depois de conectar tudo ao Arduino, você deve ter algo parecido com isto:

Teclado 4x4

Bem, é sobre isso. Não é difícil configurar um teclado. Acho que, com um pouco de tentativa e erro, você conseguirá modificar o código acima para trabalhar com a maioria dos projetos para os quais deseja usar um teclado. Mas se você tiver problemas, deixe-nos saber nos comentários e nós tentaremos ajudá-lo.

TAG : Teclado 4×4 Membrana, Teclado 4×3 Membrana, Arduino, Arduino IDE, Rele 5V, LCD 16×2 i2c, I2C Module, LCD 16×2, Fios, ProtoBoard, Sketch

Visits: 2 Visits: 1198914