Manual

do

Maker

.

com

Eletrônica digital - keypad utilizando apenas 1 pino (Arduino)

Eletrônica digital - keypad utilizando apenas 1 pino (Arduino)

Adquiri esse keypad na RoboCore para um projeto pessoal, mas nos materiais de exemplo que vi achei um bocado dispendioso a utilização de 7 pinos para reconhecimento de cada tecla, além da utilização de uma lib específica para Arduino. Então pensei:

  • Por que utilizar 7 pinos digitais se posso utilizar apenas 1 analógico?

Para entender um pouco sobre o porquê dessa idéia, pegue o datasheet. Nele está descrito o seguinte (linhas):
Linha 1, pino 2
Linha 2, pino 7
Linha 3, pino 6
Linha 4, pino 4

As colunas são assim:
Coluna 1, pino 3
Coluna 2, pino 1
Coluna 3, pino 5

O keypad é uma matriz de contatos. Quando você aperta por exemplo, o botão 2, está gerando contato entre a coluna 2 com a linha 1, saindo no pino 1.

Assim, as diversas combinações possíveis utilizam diversos pinos da MCU. Para evitar o disperdicio de recursos, pode-se criar uma matriz de resitência, gerando frequências diferentes conforme a resistência de cada combinação.

Primeiramente, reduzi a quantidade de combinações necessárias analisando onde variar os resistores; nas linhas ou nas colunas. Claro, as linhas estão em maior número, então coloquei resistores de diferentes valores nos pinos 2,4,6 e 7, precedendo a alimentação de +5v nesses pinos. Assim, nos pinos 1,3 e 5 lê-se já o valor de cada linha com diferentes frequencias.

No meu teste inicial utilizei um LED para comprovar, posteriormente tendo feito a leitura analógica no Arduino. Até esse ponto cada linha devolve a intensidade de luz igual para 1,2, e 3, outra intensidade para 4,5 e 6, outra para 7,8 e 9 e outra para asterisco, 0 e cerquilha.

Já sabendo qual linha está sendo pressionada, resta saber qual a coluna em questão. Para isso, coloquei também uma resistência diferente para pino correspondente à coluna, de forma que mais uma vez haverá queda de tensão, consequentemente variando a frequência e dessa forma pude identificar todos os botões!

Para não haver retorno, coloquei um diodo na saída de cada pino correspondente a cada coluna, assegurando o fluxo de energia em uma única direção.

A montagem na protoboard deve ser feita dessa maneira:

keypad_fritz.webp

O código a seguir é apenas para comprovar o teste, necessitando de aperfeiçoamento e/ou melhores ajustes dos resistores . Além do mais, o código está porcamente implementado, dispensando comentários sobre sua baixa qualidade. Tendo tudo às claras:


int i;
int samples[10];
char number[34];
int val;
void setup(){
Serial.begin(9600);
for (i=0;i<10;i++){
samples[i] = 0;
}
for (i=0;i<34;i++){
number[i] = 'X';
}
number[27] = '1';
number[8] = '2';
number[31] = '3';
number[32] = '3';
number[33] = '3';
number[16] = '4';
number[17] = '4';
number[18] = '4';
number[7] = '5';
number[22] = '6';
number[10] = '7';
number[5] = '8';
number[11] = '9';
number[13] = '*';
number[6] = '0';
number[14] = '#';
number[15] = '#';
i = 0;
val = 0;
}

void loop(){
if (samples[9] > 0){
for (i=0;i<10;i++){
val += samples[i];
samples[i] = 0;
}
val = val/10;
val = val/10;
i = 0;
if (number[val] != 'X' && val <34){
Serial.println(number[val]);
}
}
samples[i] = analogRead(0);
i = i>9 ? 0 : i+1;
//Serial.println(i);
delay(10);
}

O video descreve o estado real. Repare que se mexer a base do teclado haverá ruído, o que causará uma leitura apodrecida e afetará o resultado. De resto é bastante estável, se devidamente aterrado, como exemplificado no desenho em fritzing.
O vídeo está horrível, mas enfim, está feito. E veja os vídeos mais novos do canal, são um espetáculo, é que em 2012 eu era bem ruim de edição.

Para meu uso, ainda vou implementar validação do número pressionado, com uma função que compara o resultado e não permita repetir o número em um intervalo menor que N ms. Para implementar em PIC utilizando MikroC, obviamente existem diferenças por questão das configurações de porta, além de implementação UART para impressão serial, mas a lógica é basicamente a mesma.
Farei um post desse keypad para PIC utilizando o display LCD 16x2, desse post.

Sugiro também que faça a 'calibração' do seu keypad. Ainda vou aumentar a dispersão entre os números. No desenho em fritzing utilizei resistores de valores fixos, mas na protoboard eu coloquei sensores em série e em paralelo para atingir os valores que queria, mas basta seguir o desenho e validar os valores no terminal serial do Arduino.

Estou prestes a publicar um post muito interessante, mas ainda estou sofrendo um bocado devido a pequenos ajustes técnicos, mas aguardem que vem coisa boa por ai!

Se gostou, não deixe de compartilhar; dê seu like no video e inscreva-se no nosso canal Manual do Maker Brasil no YouTube.

Próximo post a caminho!

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.