Manual
do
Maker
.
com
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:
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:
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!
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.