Publicidade:

sexta-feira, 1 de maio de 2015

Arduino - Teclado 4x4 com Pino Analógico








Esquema

Os botões devem ser ligados conforme imagem abaixo, de forma que um dos terminais de cada um dos botões estejam em um linha e o outro terminal em uma coluna.



Montagem do circuito na PCB

Atenção!!

O teclado que eu utilizei, foi retirado de um ponto eletrônico portátil que não estava mais sendo usado. Não sei se ele tem a mesma construção de outros teclados, principalmente destes vendidos para ser utilizado com o Arduino, portanto, talvez sejam necessárias algumas alterações, para rodar com outros teclados.

Inicialmente a placa foi feita sem o capacitor representado no circuito acima, mas durante os testes percebi que ainda haviam oscilações que retornavam leituras com valores errados. Pra tentar minimizar as leituras erradas inclui o capacitor de 100nF.








Para testar a placa primeiramente rodei o código abaixo para identificar o valor lido em cada uma das teclas. Ao executar é verificada uma oscilação entre leituras de um mesmo botão, não sendo possível identificar o valor correto para cada botão.


Código 01


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

void loop() {
   Serial.println(analogRead(A5));
   delay(100);
}





Para tentar chegar em um valor mais aproximado do real, rodeio o código abaixo, no qual faço a leitura 200 vezes, e depois faço a média de todos esses valores, chegando então em um valor que dá um retorno com menos variações.

código 02:

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

void loop() {
  const int LEITURAS = 200;
  long soma = 0;
  long media = 0;
  int leitura = analogRead(A5);
  
  for (int i=0;i < LEITURAS; i++){ soma += leitura; }
  
  media = soma / LEITURAS;
  
  Serial.println(media);
  delay(100);
}




Abaixo está o código que foi mostrado no vídeo. Mas quem for tentar reproduzir, é necessário fazer vários testes, já que eventualmente é possível que falhas ocorram, portanto, essa solução ainda não é 100% confiável, mas ainda sim serve como base para algumas aplicações. 


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

char getTecla(){
  const int LEITURAS = 300;
  long soma = 0;
  long media = 0;
  int maior = 0;
  int menor = 1023;
  
  for (int i = 0; i < LEITURAS; i++) { 
    int leitura = analogRead(A5);                //PINO ANALOGICO A5. MUDAR AQUI
    if (leitura <= 368) { soma=0; break; }
    
    menor = (menor > leitura) ? leitura : menor;
    maior = (maior < leitura) ? leitura : maior;
    soma += leitura;
    
    if ((maior-menor) >= 4){ soma=0; break; }
  }
    
  
  
  media = soma / LEITURAS;
  
  char c = ' ';
  if (media <= 1023 && media >= 971) {c = '1'; }
  if (media <= 970 && media >= 886)  {c = '2'; }
  if (media <= 885 && media >= 814)  {c = '3'; }
  if (media <= 813 && media >= 739)  {c = 'A'; }
  if (media <= 738 && media >= 673)  {c = '4'; }
  if (media <= 672 && media >= 631)  {c = '5'; }
  if (media <= 630 && media >= 595)  {c = '6'; }
  if (media <= 594 && media >= 552)  {c = 'B'; }
  if (media <= 551 && media >= 513)  {c = '7'; }
  if (media <= 512 && media >= 489)  {c = '8'; }
  if (media <= 488 && media >= 466)  {c = '9'; }
  if (media <= 465 && media >= 438)  {c = 'C'; }
  if (media <= 437 && media >= 413)  {c = '*'; }
  if (media <= 412 && media >= 398)  {c = '0'; }
  if (media <= 397 && media >= 383)  {c = '#'; }
  if (media <= 382 && media >= 369)  {c = 'D'; }
  
  
  //somente para testes, retirar ao ser usado
  if (c != ' '){
    Serial.print(media);
    Serial.print(" - ");
    Serial.print(maior);
    Serial.print(" - ");
    Serial.print(menor);
    Serial.print(" - ");
    Serial.print(maior-menor);
    Serial.print(" - ");
  }
  
  return c;
}

void loop() {
  
  char c = getTecla();
  if (c != ' '){
     Serial.println(c);
     delay(150);
  }
}


3 comentários:

  1. Olá Boa noite.
    Estou tentando montar seu teclado na prática com o PIC 18F4550. Na simulação pelo PROTEUS ele funciona perfeitamente, utilizei 16 pushbuttons para isso e fiz a leitura com os exatos valores que vc disponibilizou. Porém na prática as teclas da última linha se confundem e se misturam. Como fiz um controle básico de acesso mediante senha, na hora de validar a senha com a tecla ENTER (equivalente ao # do seu teclado) ele dá como se tivesse digitado 0. Já tentei modificar os valores do conversor AD (0 a 1023) das últimas teclas, porém sem sucesso. Acha que poderia ser os valores dos resistores de 1k que poderiam ser modificados? Desde já agradeço.

    ResponderExcluir
    Respostas
    1. Olá Jonathan, esse teclado eu montei com a finalidade apenas de teste, não cheguei usar ele em nenhum projeto, pois apesar de em meus testes ter funcionado com poucos erros de leitura de tecla, ainda assim, mesmo que um único erro de leitura em mil leituras que seja, já é algo que pode causar transtorno para o usuário. Porém mesmo assim eu mantive o artigo, há outros exemplos na internet, a maioria em inglês, que utilizam outros valores de resistores e esquemas um pouco diferente, talvez funcionem melhores pra você.

      em um outro artigo meu, montei um teclado 4x4 a partir da placa de um teclado ps2. o que exigiu apenas 2 pinos. não sei se te atenderia, mas segue o link ai:

      http://fabianoallex.blogspot.com.br/2015/11/arduino-teclado-ps2-com-keypad-4x4.html

      Excluir
    2. Vi o vídeo, muito bom. Mas eu preciso usar no meu TCC, vou entregá-lo no fim do semestre que vem. Utilizar uma placa reutilizada talvez não seja muito bom pra minha nota. Pensei em fazer um teclado I2C utilizando o CI PCF8574, expansor de I/O. Ou um teclado serial por RS232 e usar interrupções para quando forem digitadas as teclas. Aparentemente tem muito erro num teclado analógico, mas eu preciso economizar pinos, tem outras aplicações no meu projeto.

      Excluir