Curso Arduino Nível II – #5 – Teclado e Sistema de Alarme

Ao realizarmos os exercícios previstos neste artigo do curso Arduino, vamos verificar como é que, na prática, é mais conveniente ligar um teclado ao nosso projeto.

Através da utilização de todos os elementos abordados até agora, vamos construir um painel de controlo de alarme, cujo cérebro será o Arduino.

Teclado Matricial para Arduino

Até agora, para ligarmos um botão ao Arduino utilizámos uma entrada. Com um, dois ou três botões não há problema. No entanto, por vezes, pretendemos inserir mais dados no sistema. Inserir um código PIN num alarme requer, no mínimo, a declaração de 10 dígitos (0 a 9). Para além destes, é preferível ter mais alguns botões à nossa disposição para, por exemplo, cancelar ou aprovar uma operação. Ou seja, vamos precisar de um teclado numérico:

teclado

É claro que ligar cada botão a um pino diferente seria complicado e, por vezes, impossível (especialmente com teclados maiores). Felizmente, existe uma solução que permite reduzir significantemente o número de pinos necessários.

Estrutura do Teclado Matricial

Nos teclados matriz, os fabricantes combinam os botões em colunas e filas. Graças a isto, é criada uma matriz de conexões, que tem este aspeto:

teclado matricial

Como pode verificar, conseguimos utilizar 16 botões com apenas 8 linhas de dados.

Com isto, ao pressionarmos um botão, vamos estar a dar indicação de uma coluna e de uma linha. Por exemplo, se pressionarmos o botão “1”, na verdade, estamos a dar indicação ao sistema de que clicamos na tecla que coincide simultaneamente com a linha P1 e com a coluna P5. No fundo, a deteção do botão pressionado provém das correspondências estabelecidas entre as linhas P1-P4 e as colunas P5-P8.

Teclado Matricial na Prática

Durante os exercícios, vamos utilizar um teclado simples, sem painel frontal.

teclado 4x4

Vamos lá passar à prática!

Biblioteca Keyboard

É claro que, no caso do Arduino, vamos encontrar uma biblioteca pronta, que facilita ainda mais o uso dos teclados. Neste caso, o nome é Keyboard. Pode encontrá-la diretamente no Arduino IDE, basta seguir os seguintes passos:

Rascunho > Incluir Biblioteca > Keyboard

Exercício Prático – Teclado Numérico

Material necessário:

De início, vamos escrever um programa de teste que irá verificar se um botão é pressionado. Se for o caso, o caracter correspondente será enviado para o computador via UART.

Primeiro, ligue o teclado ao Arduino através dos pinos de 2 a 9, como mostra a imagem abaixo. A ordem dos pinos é importante para que possamos ler os botões corretamente.

teclado 4x4

O teclado pode ser ligado à breadboard, porém ira significar que os botões ficassem virados para baixo, o que não é desejável. Portanto vamos usar os cabos jumper para ligá-lo diretamente ao Arduino. Para este fim deverá utilizar cabos macho-fêmea, como mostra na figura:

Após as ligações, o layout deverá ter este aspeto:

Inserir Imagem do Esquema de Ligação

Agora podemos passar à programação. Inicialmente, inserimos a biblioteca e fornecemos todas as informações necessárias acerca do teclado e das conexões:

#include <Keyboard.h> //Biblioteca do teclado
const byte ROWS = 4; // Quantidade de linhas
const byte COLS = 4; // Quantidade de colunas

byte rowPins[ROWS] = {5, 4, 3, 2}; //Pinos responsáveis pelas filas
byte colPins[COLS] = {6, 7, 8, 9}; //Pinos responsáveis pelas colunas

Este fragmento é tão claro que, provavelmente, não há necessidade de o explicar. Somente os pinos escolhidos por nós (ou melhor, a sua ordem) podem dar origem a algum questionamento. Isto irá ser evidente mais para a frente.

O passo seguinte é mapear o teclado, isto é, atribuir caracteres específicos aos botões. O mais conveniente é fazer a definição seguindo um formato padrão. Nós adotámos esta ordem:

teclado

Declaramos esta definição da seguinte forma:

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

Pode não parecer muito intuitivo, mas permite organizar o programa.

O passo final da configuração é criar um novo objeto Keyboard, ao qual vamos denominar teclado.

Keypad teclado = KeyPad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); //Inicialização do Teclado

Quando o teclado está declarado, podemos passar à leitura dos caracteres. O código completo é o seguinte:

#include <Keyboard.h> //Biblioteca do teclado

const byte ROWS = 4; //Quantidade de linhas
const byte COLS = 4; //Quantidade de colunas

byte rowPins[ROWS] = {5, 4, 3, 2}; //Pinos responsáveis pelas filas
byte colPins[COLS] = {6, 7, 8, 9}; //Pinos responsáveis pelas colunas

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

Keypad teclado = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); //inicialização do teclado

void setup(){
Serial.begin(9600);
}

void loop(){
char chave = teclado.getKey();

if (chave){
Serial.println(chave);
}
}

No loop principal do programa, criamos uma variável para armazenar o caracter (tipo char) e, em seguida, atribuímos-lhe um valor lido no teclado. Vamos obter este valor depois de chamarmos a função keyboard.getKey (). De seguida, verificamos se o caracter foi recebido e, em caso afirmativo, será encaminhado para o computador via UART.

Depois de carregar o programa, e após pressionar nos botões, poderá ver algo semelhante à imagem abaixo no seu monitor série:

Inserir Imagem Monitor Série

Se o computador mostrar outros caracteres diferentes dos declarados no mapeamento, deverá verificar as conexões.

Pode encontrar outros programas nos exemplos fornecidos no IDE. Encorajámo-lo a experimentá-los.