Componentes eletrônicos, Hobby, Microcontroladores, Projetos, Tutorial

Arduino com o módulo LCD Keypad

O assunto deste post é o módulo LCD Keypad, que permite usar um display LCD com botões sem a necessidade de fios e protoboard.

Post sobre o funcionamento do LCDClique aqui

Post sobre a fabricação do LCDClique aqui

Funcionamento e uso

Arduino e LCD Keypad.
Para ligar ao Arduino, basta ligar os pinos do módulo diretamente com os terminais do Arduino.
Recomendo que solde barras de pinos nos buracos que ligam às portas do Arduino. Para que não precise soldar componentes externos, apenas ligar com fios.
LCD Keypad
O potenciômetro azul ajusta o contraste no LCD. Os seis terminais no lado direito do potenciômetro são os pinos ICSP, que também têm na placa Arduino. Estes pinos precisam de um post dedicado, que será publicado futuramente.
Esquemático do LCD Keypad.
O esquemático do LCD Keypad. Todos os botões, exceto o reset (RST), estão ligados à porta analógica A0, com resistores pull-up de diferentes valores. Desta forma, há um valor diferente de tensão em A0 para cada botão pressionado. O LED de fundo no LCD serve para poder enxergar o que está escrito e é conectado no pino digital 10. Fonte: arduino.cc.

Em alguns módulos, o LED de fundo não funciona. Eu tenho um com este problema e ainda não descobri como resolver.

Exemplos de projeto

Testando o LCD Keypad

Simplesmente testa o display LCD e os botões. É preciso usar a biblioteca ‘LiquidCrystal.h’. A parte 7 do tutorial de Arduino mostra como usar esta biblioteca. O algoritmo abaixo para testar o módulo.

#include <LiquidCrystal.h>
 
//**Configurações do projeto**/**Project settings**
//Estão de acordo com a shield./They are according to shield.
#define allButtons A0

#define Nobtpressed 0
#define btSELECT 1
#define btLEFT   2
#define btUP     3
#define btDOWN   4
#define btRIGHT  5

//Define as conexões e cria o objeto para acesso.
const int rs = 8, en = 9, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
const int backLight = 10;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup(){
  pinMode(backLight,OUTPUT);
  lcd.begin(16,2);
  digitalWrite(backLight,HIGH); //Para o LED de fundo ficar aceso.
}

void loop(){
  int valButton=analogRead(allButtons); //Leitura analógica de A0.
  if ((valButton < 800) && (valButton >= 600)) {
     lcd.clear();
     lcd.print("Select");   
  } else if ((valButton < 600) && (valButton >= 400)) {
     lcd.clear();
     lcd.print("Left");
  } else if ((valButton < 400) && (valButton >= 200)) {
     lcd.clear();
     lcd.print("Down");
  } else if ((valButton < 200) && (valButton >= 60)) {
     lcd.clear();
     lcd.print("Up");
  } else if  (valButton < 60) {
     lcd.clear();
     lcd.print("Right");
  } 
}

Ao pressionar um botão, deve aparecer o nome deste no LCD. O botão reset (RST) reinicia o programa.

Simulador de roda fônica

O que é uma roda fônica? É uma roda dentada, que é ligada ao virabrequim e possui um sensor indutivo ou de efeito Hall para medir o ângulo de rotação do virabrequim. O sensor envia sinais elétricos para uma central eletrônica ou ECU, informando sobre os estágios do motor a combustão e os pontos onde as válvulas abrem e fecham.

Um motor de carro com roda fônica. Esta tem algumas “falhas”, espaços na roda onde não há dentes. Fonte: lathenes.

Atendendo a pedidos, este é um projeto que gera um sinal de uma roda fônica com um sensor de efeito Hall a 5 volts.

O esquemático bastante simples do projeto. O fio laranja é a saída do sinal, que é ligada à ponta do osciloscópio e os fios pretos são ligado ao GND.

Neste projeto, você escolhe o número de dentes e falhas da roda fônica. O número máximo de dentes é 58 e o número de falhas não deve ser maior que o número de dentes. O potenciômetro varia a frequência do sinal de 1Hz a 170Hz. 170Hz é a frequência de um motor a 10.200 rpm (rotações por minuto).

#include <LiquidCrystal.h>
 
//**Configurações do projeto**/**Project settings**
//Estão de acordo com a shield./They are according to shield.
#define allButtons A0

#define Nobtpressed 0
#define btSELECT 1
#define btLEFT   2
#define btUP     3
#define btDOWN   4
#define btRIGHT  5

// Define as conexões e cria o objeto para acesso
const int rs = 8, en = 9, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
const int backLight = 10;
int signal=11; 
unsigned int Tnumber=0; //Número de dentes.
unsigned int Fnumber=1; //Número de falhas.

const int pot=A1;
int potstate=0;
int frequency=0;
int halfPeriod=0;

int running=0;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup(){
  pinMode(backLight,OUTPUT);
  pinMode(signal,OUTPUT);
  pinMode(pot,INPUT);
  lcd.begin(16,2);
  lcd.print("Phonic wheel:");
  digitalWrite(backLight,HIGH);
  Serial.begin(9600);//só para testar o potenciômetro.
}

void loop(){
  lcd.setCursor(0,1);
  lcd.print("Teeth:");
  lcd.print(Tnumber);//Mostra o número de dentes.
  lcd.setCursor(8,1);
  lcd.print("Fails:");
  lcd.print(Fnumber);//Mostra o número de falhas.
  potstate=analogRead(pot);
  frequency=map(potstate,0,1023,1,170);//A função map faz com que a variação do //potenciômetro seja de 1Hz a 170Hz.
  halfPeriod=1000000/(2*frequency); //Calculando o meio periodo.
  int valButton=analogRead(allButtons);
  if ((valButton < 800) && (valButton >= 600)) { //Botão SELECT
    running=1;  //Transmite o sinal ao apertar SELECT.
  } else if ((valButton < 600) && (valButton >= 400)) { //Botão LEFT
     Tnumber=Tnumber-1;   
     delay(500);
  } else if ((valButton < 400) && (valButton >= 200)) {//Botão DOWN
     Tnumber=Tnumber-1;
     delay(500);
  } else if ((valButton < 200) && (valButton >= 60)) {//Botão UP
     Fnumber=Fnumber+1;
     delay(500);
  } else if  (valButton < 60) { //Botão RIGHT
     Tnumber=Tnumber+1;
     delay(500);
  } 
  if(Fnumber>=Tnumber){
     Tnumber=1;
     Fnumber=0;
  }
  if(Tnumber>58){
    Tnumber=0;
    lcd.setCursor(7,1);
    lcd.print(" ");
  }
  if(running==1){
     phonicwheel();
  }
}
void phonicwheel(){
  lcd.setCursor(0,1);
  lcd.print("Running...     ");
    for(int i=0;i<(Tnumber-Fnumber);i++){
     digitalWrite(signal,HIGH);
     delayMicroseconds(halfPeriod);
     digitalWrite(signal,LOW);
     delayMicroseconds(halfPeriod);
    }
}

Eu não testei este simulador em uma ECU de um veículo. Fiz este projeto apenas para fins didáticos. Portanto, não sei se funcionaria em uma ECU de verdade. Se quiser, você pode testar por sua conta e risco.

Vídeo de demonstração dos projetos com LCD Keypad

About Pedro Ney Stroski

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *