Vamos ver como utilizar em seu projeto uma forma simples e barata de entrada de dados com o teclado matricial membrana 4x3 (4 linhas x 3 colunas). Além do uso mais comum, que é a digitação de senhas, este teclado pode também ser usado para inserir coordenadas em uma máquina CNC, ou valores em uma máquina automática de vendas, por exemplo.
Internamente esse teclado possui uma sequência de chaves (nesse teclado especificamente são 12), dispostas em forma de matriz. Cada chave quando acionada faz a ligação entre uma linha e uma coluna, e essa informação é enviada ao microcontrolador, que por meio do programa interpreta qual tecla foi pressionada.
A imagem abaixo ilustra essa ligação linha x coluna no teclado 4x3 que estamos usando.
A imagem abaixo ilustra essa ligação linha x coluna no teclado 4x3 que estamos usando.
Na parte central da imagem temos, em azul, a representação das conexões das linhas, e no lado direito, em vermelho, a representação das conexões das colunas.
No conector de 7 pinos do teclado, temos o sinal das linhas sendo enviado pelos pinos 1, 2, 3 e 4, e o sinal das colunas enviado pelos pinos 5, 6 e 7.
No conector de 7 pinos do teclado, temos o sinal das linhas sendo enviado pelos pinos 1, 2, 3 e 4, e o sinal das colunas enviado pelos pinos 5, 6 e 7.
Seguindo a imagem acima, vemos que se acionarmos, por exemplo, a tecla 5, será feita uma conexão entre a linha 2 (pino 2) e a coluna 2 (pino 6). Acionando a tecla 3, a conexão será entre as linhas 1 (pino 1) e a coluna 3 (pino 7).
Ligação do teclado matricial ao Arduino
Para ligar esse teclado ao Arduino você vai precisar de 7 portas digitais: quatro para as linhas (portas 4, 5, 6 e 7), e três para as colunas (portas 8, 9 e 10) :
Como estamos trabalhando com chaves, podemos usar no circuito três resistores nos pinos 8, 9 e 10, ou ativar os resistores pull-up do Arduino via software.
Programa teclado matricial 4x3
Nesse primeiro programa não vamos usar nenhuma biblioteca, definindo manualmente os pinos de saída (linhas) e entrada (colunas), e a ativação dos resistores pull-up.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | //Programa : Teclado matricial 4x3 Arduino //Autor : Arduino e Cia void setup() { //Pinos ligados aos pinos 4, 5, 6 e 7 do teclado - Linhas pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); //Pinos ligados aos pinos 8, 9, e 10 do teclado - Colunas pinMode(8, INPUT); //Ativacao resistor pull-up digitalWrite(8, HIGH); pinMode(9, INPUT); digitalWrite(9, HIGH); pinMode(10, INPUT); digitalWrite(10, HIGH); Serial.begin(9600); Serial.println("Teclado 4x3 - Exemplo 1"); Serial.println("Aguardando acionamento das teclas..."); Serial.println(); } void loop() { for (int porta = 4; porta<8; porta++) { //Alterna o estado dos pinos das linhas digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(porta, LOW); //Verifica se alguma tecla da coluna 1 foi pressionada if (digitalRead(8) == LOW) { imprime_linha_coluna(porta-3, 1); while(digitalRead(8) == LOW){} } //Verifica se alguma tecla da coluna 2 foi pressionada if (digitalRead(9) == LOW) { imprime_linha_coluna(porta-3, 2); while(digitalRead(9) == LOW){}; } //Verifica se alguma tecla da coluna 3 foi pressionada if (digitalRead(10) == LOW) { imprime_linha_coluna(porta-3, 3); while(digitalRead(10) == LOW){} } } delay(10); } void imprime_linha_coluna(int x, int y) { //Mostra informacoes no serial monitor Serial.print("Linha : "); Serial.print(x); Serial.print(" x Coluna : "); Serial.print(y); delay(10); Serial.println(); } |
O programa faz uma varredura nas portas e mostra, no serial monitor, a informação sobre qual linha e coluna foi acionada:
Temos também um segundo programa, utilizando a biblioteca Keypad (download). Com ela, o programa fica bem mais enxuto, pois a biblioteca se encarrega de definir quais pinos são de entrada e saída, como é feita a ativação dos resistores pull-up, etc.
No programa, devemos informar apenas quantas linhas e quantas colunas tem o nosso teclado (linhas 9 e 10 do programa), quais os pinos utilizados (linhas 22 e 24), e também alterar a matriz de caracteres, entre as linhas 15 e 18.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | //Programa : Teclado matricial 4x3 - Biblioteca Keypad //Autor : Arduino e Cia //Baseado no programa original de Alexander Brevig //Carrega a biblioteca Keypad #include <Keypad.h> //Definicao da quantidade de linhas e colunas const byte LINHAS = 4; const byte COLUNAS = 3; //Matriz de caracteres char matriz_teclas[LINHAS][COLUNAS] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'*','0','#'} }; //Definicao dos pinos das linhas byte PinosLinhas[LINHAS] = {4, 5, 6, 7}; //Definicao dos pinos das colunas byte PinosColunas[COLUNAS] = {8, 9, 10}; //Inicializa o teclado Keypad meuteclado = Keypad( makeKeymap(matriz_teclas), PinosLinhas, PinosColunas, LINHAS, COLUNAS); void setup() { Serial.begin(9600); Serial.println("Teclado 4x3 - Exemplo biblioteca Keypad"); Serial.println("Aguardando acionamento das teclas..."); Serial.println(); } void loop() { //Verifica se alguma tecla foi pressionada char tecla_pressionada = meuteclado.getKey(); //Mostra no serial monitor o caracter da matriz, //referente a tecla que foi pressionada if (tecla_pressionada) { Serial.print("Tecla pressionada : "); Serial.println(tecla_pressionada); } } |
Esse programa mostra no serial monitor qual tecla foi pressionada, de acordo com o que foi definido na matriz de caracteres matriz_teclas:
Com pequenas alterações, podemos usar esses programas com outros tipos de teclado, como por exemplo teclados matriciais 4x4.
Olá amigo !!! Vc teria alguma solução para um código em que vc pudesse digitar numeros nesse teclado tipo 123 e o arduino entendesse como cento e vinte e três e não como 1, 2 e 3 ? Grande abraço !!! Michel Ferrari.
ResponderExcluirBoa tarde Michel,
ExcluirVocê pode simplesmente “somar” o valor lido de cada tecla, usando strings, por exemplo:
String1 = “1”;
String2 = “2”;
String3 = “3”;
String_agrupada = String1 + String2 + String3;
Serial.println(String_agrupada);
O resultado final exibido no Serial Monitor será 123, como você precisa. Claro, você precisa programar quantos dígitos você vai precisar, porque nesse exemplo que eu mostrei, para obter o número 1 você vai precisar de 3 digitos: 001. Outra opção é você utilizar um caractere para indicar o final do número que você está digitando, como a cerquilha (#), por exemplo.
Abraço
Olá, pode dar um exemplo de codigo que utilize o (#) para finalizar um número digitado?
ExcluirOi gostaria de saber como faço para usar o teclado para ligar e desligar Leds..assim como o controle remoto
ResponderExcluirOlá!Boa noite!
ResponderExcluirSaberia me dizer se esse teclado contém internamente resistores para proteção das portas, ou se ele precisa de um circuito pull up para efetuar a conexão com um Kit de Desenvolvimento, no meu caso estou usando o Mclab.Teria o esquemático dele pra fornecer!
Desde já agradeço!
e-mail: rdias.vinicius@gmail.com
é bom ter pois tentei no meu sem não deu
ExcluirOlá amigo baixei a biblioteca e copiei o segundo código mais enxuto mas quando mando compilar da o seguinte erro:
ResponderExcluirsketch_apr01a:27: error: 'Keypad' does not name a type
sketch_apr01a.ino: In function 'void loop()':
sketch_apr01a:40: error: 'meuteclado' was not declared in this scope
sabe o que é isso?
ola amigos gostaria de saber como faço um codigo para chamar um outro codigo
ResponderExcluirex; digitar 1 e faz um tipo de leitura no lcd dita 2 e faz outro tipo de leitura no lcd
Como resolver quando aparece seguinte erro, ao mandar dar Upload do arquivo avrdude: stk500_getsync(): not in sync: resp=0x00
ResponderExcluirOla! Gostaria de saber se posso utilizar sua programação em um trabalho escolar e se utilizo o nome "Arduino e cia" para identificar o autor?
ResponderExcluirOi Davi,
ExcluirPode referenciar o Arduino e Cia sim.. se precisar do nome do autor dos posts, é Adilson Thomsen, ok ? :)
Abraço!
Adilson
olá, estou começando agora com arduino, e estou com dificuldade em alguns esquemas de ligações, tenho uma placa Uno R3, uma lcd shild 16x2, um teclado membrana 4x, um speak e mais dois reles, o lcd e o teclado consigo usa los apenas separadamente, tenho uma esquema de ligação que não funciona e preciso de ajuda, gostaria de saber se alguem pode me dar uma força,desde de já agradeço dela atenção. Email é e.f.a.t.rr@gmail.com
ResponderExcluirCom essa biblioteca consigo ler mais de uma tecla simultaneamente? Sabe me dizer se são utilizados diodos zener nessa matriz?
ResponderExcluirola,
ResponderExcluirgostaria de saber como faço no código para que seja lido um valor de entrada como senha e login e verificar se esta correta com o valor cadastrado!
desde já agradeço.
ATT.