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 aqui 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:

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:

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 video está horrível, mas enfim:

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 16×2, desse post e desse outro 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 Do bit Ao Byte Brasil no YouTube.

Prefere seguir-nos pelo facebook? Basta curtir aqui.

Prefere twitter? @DobitAoByte.

Próximo post a caminho!


Comments

comments

Djames Suhanko

Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.

Deixe uma resposta