Guia do Rotary Encoder com Arduino

Tempo de leitura: 4 minutes

Neste guia, mostrarei como usar um Codificador Rotativo Quadrature com Arduino.

O que é um Codificador Rotativo?

Muitos de vocês têm um som automotivo no carro, alguns rádios automotivos (especialmente modelos de marcas famosas e marcas de médio/alto padrão) têm um botão giratório para ajustar o volume e os tons. Os mais atentos já sabem que aquele botão não é absolutamente o potenciômetro clássico (senão como ele gira continuamente, sem blocos? Ok, alguém também poderia objetar que existem potenciômetros de rotação contínua, mas como eles custam tanto, não é absolutamente o caso ) Esse botão é um dispositivo realmente simples, mas engenhoso em alguns aspectos: é um codificador rotativo. No entanto, podemos encontrar esse “botão” em quase todos os lugares: alguns fornos de micro-ondas o possuem, mesmo que seu uso mais “em voga” atualmente seja o de ajustar o volume do áudio em sistemas de alta fidelidade.

Sabemos que um codificador, em um sentido geral, é um dispositivo usado para codificar um tipo de sinal em outra “forma”. Um codificador rotativo é precisamente um dispositivo que permite codificar a rotação de um eixo em um sinal elétrico.

Os codificadores rotativos são usados, especialmente no campo industrial, para calcular as velocidades dos eixos de rotação. Eles foram usados ​​nos ratos antigos com a “bola” para fazer o ponteiro se mover, eles também são usados ​​na robótica para determinar a velocidade das rodas do robô e, portanto, corrigir sua trajetória e, como acabamos de dizer, há também esse uso mais “lúdico” para controle de volume em um sistema de áudio ou para definir a temperatura do forno de microondas.

Um codificador rotativo nada mais é do que uma série de “contatos” (operados de várias maneiras: mecanicamente, via infravermelho ou usando o efeito Hall) que fecham ciclicamente um contato quando o eixo conectado a eles gira. Dependendo da quantidade de contatos e de como são fechados, temos vários tipos de codificadores. Neste artigo, trataremos apenas dos chamados codificadores de quadratura.

Agora vamos ver como usar um Codificador Rotativo com Arduino. Em primeiro lugar, você precisa obter um codificador semelhante a este:

ou para este:

Como você notará na primeira imagem, o módulo com codificador é composto de cinco pinos nomeados (CLK, DT, SW, VCC, GND), conecte esses pinos no Arduino conforme mostrado na tabela a seguir:

Encoder Arduino
CLK  -> 2
DT  -> 3
SW
VCC  -> +5V
GND  -> GND

Os pinos CLK e DT correspondem aos dois contatos que fornecem dois sinais de deslocamento de 90 °. O pino SW corresponde ao botão interno (se você pressionar o botão, notará). Enquanto VCC e GND são os dois pinos de alimentação.

Se, por outro lado, você não possui um módulo com Codificador, mas apenas o Codificador (segunda imagem), terá que fazer as seguintes conexões:

Para fazer o melhor uso do codificador de quadratura, usaremos as interrupções de pino 0 e 1 do Arduino correspondentes aos pinos digitais 2 e 3.

Depois de completar as conexões, passamos para o sketch a ser carregado no arduino.

 

Sketch (Monitor Serial)

int encoderPin1 = 2;
int encoderPin2 = 3;
 
volatile int lastEncoded = 0;
volatile long encoderValue = 0;
 
long lastencoderValue = 0;
 
int lastMSB = 0;
int lastLSB = 0;
 
void setup() {
  Serial.begin (9600);
 
  pinMode(encoderPin1, INPUT_PULLUP);
  pinMode(encoderPin2, INPUT_PULLUP);
 
  attachInterrupt(0, updateEncoder, CHANGE);
  attachInterrupt(1, updateEncoder, CHANGE);
 
}
 
void loop(){
  Serial.println(encoderValue); 
}
 
void updateEncoder(){
  int MSB = digitalRead(encoderPin1); //MSB = bit mais significativo
  int LSB = digitalRead(encoderPin2); //LSB = bit menos significativo
 
  int encoded = (MSB << 1) |LSB; // convertendo o valor de 2 pinos em um único número
  int sum  = (lastEncoded << 2) | encoded; // adicionando-o ao valor codificado anterior
 
  if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++;
  if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --;
 
  lastEncoded = encoded; //store this value for next time
}

Ao abrir o Serial Monitor e girar o codificador, você notará um aumento ou diminuição na variável encoderValue de acordo com o sentido de rotação.

 

Sketch (Display)

Neste guia, usaremos um LCD em vez do monitor serial para exibir o valor da variável encoderValue. Para quem não sabe conectar um display lcd ao Arduino, convido você a ler meu guia AQUI.

#include <Wire.h> 
// Biblioteca para comunicação I2C 
#include <LiquidCrystal_I2C.h> 
// Biblioteca para LCD 
// Ligação: o pino SDA está conectado ao A4 e o pino SCL ao A5.
// Conecte ao LCD via I2C, endereço padrão 0x27 (A0-A2 sem jumpers) 
// Inicializa o display no endereço 0x27
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

int encoderPin1 = 2;
int encoderPin2 = 3;
 
volatile int lastEncoded = 0;
volatile long encoderValue = 0;
 
long lastencoderValue = 0;
 
int lastMSB = 0;
int lastLSB = 0;
 
void setup() {
  
  //lcd.begin (16, 2); para 16x2
  // Inicializa o display LCD 20x4
  lcd.begin (20, 4);
  // Liga a luz de fundo do LCD
  lcd.setBacklight(HIGH); 

  pinMode(encoderPin1, INPUT_PULLUP);
  pinMode(encoderPin2, INPUT_PULLUP);
 
  attachInterrupt(0, updateEncoder, CHANGE);
  attachInterrupt(1, updateEncoder, CHANGE);

   // Limpa
  lcd.clear(); 

  lcd.setCursor(0,0);
  lcd.print("Valor de leitura  ");
  lcd.setCursor(0,1);
  lcd.print("Codificador rotativo ");
  delay(2000);
  lcd.clear(); 
}
 
void loop(){
  
  lcd.setCursor(0,0);
  lcd.print("Valor: ");
  lcd.print(encoderValue);
  lcd.print("        "); 
  
}
 
void updateEncoder(){
  int MSB = digitalRead(encoderPin1); //MSB = bit mais significativo
  int LSB = digitalRead(encoderPin2); //LSB = bit menos significativo
 
  int encoded = (MSB << 1) |LSB; // convertendo o valor de 2 pinos em um único número
  int sum  = (lastEncoded << 2) | encoded; // adicionando-o ao valor codificado anterior 
  if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++;
  if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --;
 
  lastEncoded = encoded; // armazene este valor para a próxima vez
}

 

 

 

Conclusão

Neste guia, mostrei como usar um Encoder Rotativo para Arduino. Espero que você tenha achado útil e informativo. Se sim, compartilhe com um amigo que também gosta de eletrônica e de fazer coisas!

Eu adoraria saber quais projetos você planeja construir (ou já construiu) com esses Encoder Rotativo. Se você tiver alguma dúvida, sugestão ou se achar que falta algo neste tutorial, por favor, deixe um comentário abaixo.

Visits: 3 Visits: 1199200