Como funciona o codificador rotativo e como usá-lo com o Arduino
Neste tutorial vamos aprender como funciona o codificador rotativo e como usá-lo com o Arduino. Você pode assistir ao vídeo a seguir ou ler o tutorial escrito abaixo.
Visão geral
Um codificador rotativo é um tipo de sensor de posição que é usado para determinar a posição angular de um eixo rotativo. Gera um sinal elétrico, analógico ou digital, de acordo com o movimento de rotação.

Existem muitos tipos diferentes de codificadores rotativos que são classificados por sinal de saída ou tecnologia de detecção. O codificador rotativo específico que usaremos neste tutorial é um codificador rotativo incremental e é o sensor de posição mais simples para medir a rotação.

Este codificador rotativo também é conhecido como codificador de quadratura ou codificador rotativo relativo e sua saída é uma série de pulsos de onda quadrada.
Como o Rotary Encoder funciona
Vamos dar uma olhada mais de perto no codificador e ver seu princípio de funcionamento. Veja como os pulsos de onda quadrada são gerados:O codificador possui um disco com zonas de contato uniformemente espaçadas que são conectadas ao pino comum C e dois outros pinos de contato separados A e B, conforme ilustrado abaixo.

Quando o disco começar a girar passo a passo, os pinos A e B começarão a fazer contato com o pino comum e os dois sinais de saída de onda quadrada serão gerados de acordo.
Qualquer uma das duas saídas pode ser usada para determinar a posição girada se contarmos apenas os pulsos do sinal. No entanto, se quisermos determinar também a direção de rotação, precisamos considerar os dois sinais ao mesmo tempo.
Podemos notar que os dois sinais de saída estão deslocados a 90 graus fora de fase um do outro. Se o encoder estiver girando no sentido horário, a saída A estará à frente da saída B.

Então, se contarmos os passos cada vez que o sinal muda, de Alto para Baixo ou de Baixo para Alto, podemos notar que nesse momento os dois sinais de saída têm valores opostos. Vice-versa, se o encoder estiver girando no sentido anti-horário, os sinais de saída terão valores iguais. Portanto, considerando isso, podemos programar facilmente nosso controlador para ler a posição do encoder e o sentido de rotação.
Exemplo de codificador rotativo Arduino
Vamos fazer um exemplo prático disso usando o Arduino. O módulo específico que vou usar para este exemplo vem em uma placa de fuga e tem cinco pinos. O primeiro pino é a saída A, o segundo pino é a saída B, o terceiro pino é o pino Button e, claro, os outros dois pinos são o VCC e o pino GND.

Podemos conectar os pinos de saída a qualquer pino digital da placa Arduino.
Você pode obter os componentes necessários para este tutorial do Arduino nos links abaixo:
- Módulo de codificador rotativo……………….
- Placa Arduino ………………………………
- Breadboard e jump wires ………
Código-fonte
Segue o código do Arduino:
/* Arduino Rotary Encoder Tutorial
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
*/
#define outputA 6
#define outputB 7
int counter = 0;
int aState;
int aLastState;
void setup() {
pinMode (outputA,INPUT);
pinMode (outputB,INPUT);
Serial.begin (9600);
// Reads the initial state of the outputA
aLastState = digitalRead(outputA);
}
void loop() {
aState = digitalRead(outputA); // Reads the "current" state of the outputA
// If the previous and the current state of the outputA are different, that means a Pulse has occured
if (aState != aLastState){
// If the outputB state is different to the outputA state, that means the encoder is rotating clockwise
if (digitalRead(outputB) != aState) {
counter ++;
} else {
counter --;
}
Serial.print("Position: ");
Serial.println(counter);
}
aLastState = aState; // Updates the previous state of the outputA with the current state
}
Code language: Arduino (arduino)
Descrição do código: Então primeiro precisamos definir os pinos aos quais nosso codificador está conectado e definir algumas variáveis necessárias para o programa. Na seção de configuração precisamos definir os dois pinos como entradas, iniciar a comunicação serial para imprimir os resultados no monitor serial, assim como ler o valor inicial da saída A e colocar o valor na variável aLastState.
Então, na seção de loop, lemos a saída A novamente, mas agora colocamos o valor na variável aState. Portanto, se girarmos o codificador e um pulso for gerado, esses dois valores serão diferentes e a primeira declaração “if” se tornará verdadeira. Logo em seguida, usando a segunda instrução “if”, determinamos a direção de rotação. Se o estado da saída B diferir do estado da saída A, o contador será aumentado em um, caso contrário, será diminuído. Ao final, após imprimir os resultados no monitor serial, precisamos atualizar a variável aLastState com a variável aState.
Isso é tudo o que precisamos para este exemplo. Se fizer o upload do código, inicie o Serial Monitor e comece a girar o codificador, começaremos a obter os valores no serial monitor. O módulo específico que tenho faz 30 contagens a cada ciclo completo.
Saiba mais:Sensor Ultrassônico HC-SR04 e Arduino – Guia Completo
Exemplo 2 – Controlando um motor de passo usando um codificador rotativo
Além deste exemplo básico, fiz mais um exemplo de controle de posição de um motor de passo usando o codificador rotativo.

Aqui está o código-fonte deste exemplo:
/* Stepper Motor using a Rotary Encoder
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
*/
#include <LiquidCrystal.h> // includes the LiquidCrystal Library
LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7)
// defines pins numbers
#define stepPin 8
#define dirPin 9
#define outputA 10
#define outputB 11
int counter = 0;
int angle = 0;
int aState;
int aLastState;
void setup() {
// Sets the two pins as Outputs
pinMode(stepPin,OUTPUT);
pinMode(dirPin,OUTPUT);
pinMode (outputA,INPUT);
pinMode (outputB,INPUT);
aLastState = digitalRead(outputA);
lcd.begin(16,2); // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display }
}
void loop() {
aState = digitalRead(outputA);
if (aState != aLastState){
if (digitalRead(outputB) != aState) {
counter ++;
angle ++;
rotateCW();
}
else {
counter--;
angle --;
rotateCCW();
}
if (counter >=30 ) {
counter =0;
}
lcd.clear();
lcd.print("Position: ");
lcd.print(int(angle*(-1.8)));
lcd.print("deg");
lcd.setCursor(0,0);
}
aLastState = aState;
}
void rotateCW() {
digitalWrite(dirPin,LOW);
digitalWrite(stepPin,HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin,LOW);
delayMicroseconds(2000);
}
void rotateCCW() {
digitalWrite(dirPin,HIGH);
digitalWrite(stepPin,HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin,LOW);
delayMicroseconds(2000);
}
Code language: Arduino (arduino)
Sinta-se à vontade para fazer qualquer pergunta na seção de comentários abaixo.
Processo de manufatura
- C# Queue com Exemplos:O que é C# Queue e como usar?
- Controle do Servo Motor com Arduino e MPU6050
- Roda de medição simples DIY com codificador rotativo
- u-blox LEA-6H 02 Módulo GPS com Arduino e Python
- Como ler a temperatura e umidade em Blynk com DHT11
- Quão fácil é usar um termistor ?!
- Como fazer música com um Arduino
- Como usar NMEA-0183 com Arduino
- Como usar o Modbus com Arduino
- Reconhecimento de fala com Arduino e BitVoicer Server