O encoder rotativo parece um potenciômetro, mas o funcionamento é totalmente diferente. Como funciona e como usar no Arduino são os assuntos de hoje.
Como funciona o encoder rotativo?
É um componente eletromecânico, converte o movimento de rotação em pulsos elétricos de onda quadrada, estes podem ser lidos por microcontroladores. Dentro deste componente, há um disco opaco com ranhuras que permitem a passagem de luz.
Em um lado do disco, há uma fonte de luz, geralmente um LED infravermelho. No lado oposto, há um ou mais sensores de luz, geralmente fototransistores e um circuito eletrônico para transformar o sinal elétrico do sensor em onda quadrada.
O encoder pode enviar sinais de realimentação para sistemas de controle, mostrando informações como velocidade, sentido de rotação, posição e ângulo.
O encoder KY-040
O KY-040 possui 2 fototransistores (phototransistor) para detectar o sentido de rotação e um botão que é pressionado apertando o eixo do encoder (rotating shaft). Permite rotação contínua com uma resolução de 20 pulsos/revolução. Sua tensão de operação é de 5 Volts, com corrente máxima de 10 mA.
Os pinos do KY-040:
- + e GND: são a alimentação e o terra respectivamente.
- SW: o sinal que indica se o botão foi pressionado. Fica no nível “baixo” quando o eixo é pressionado.
- DT: de onde saem os pulsos de direção.
- CLK: é o clock, sinal que coordena as funções dos chips.
Usando o KY-040 com o Arduino
Testando o encoder
Para usar este encoder rotativo, é muito mais fácil baixar a biblioteca “RotaryEncoder.h”, cujo link se encontra aqui. Para este teste, são necessários apenas o módulo KY-040, 1 Arduino Uno e fios para ligar ambos.
- O pino CLK é ligado ao pino GND.
- + é conectado com 5 V.
- SW é ligado ao pino digital 7 do Arduino.
- DT com o pino analógico A2.
- CLK com o pino analógico A3.
O código fonte abaixo.
#include <RotaryEncoder.h>
RotaryEncoder encoder(A2,A3); //pinos de ligação.
int valor=0; //variável para o botão de encoder.
int newPos=0;
void setup() {
pinMode(7,INPUT);
Serial.begin(9600);
Serial.println("Gire o encoder...");
}
void loop() {
//O botão foi pressionado?
valor=digitalRead(7);
if(valor != 1){
Serial.println("Botão pressionado");
while(digitalRead(7)==0)
delay(10);
}
//Lê as informações do encoder
static int pos=0;
encoder.tick();
int newPos=encoder.getPosition();
//Se a posição foi alterada, mostra o valor no Monitor serial.
if(pos != newPos){
Serial.print(newPos);
Serial.println();
pos=newPos;
}
}
Inicialmente, o monitor serial deve mostrar a frase “Gire o encoder…”, girando em um sentido deve aparecer números positivos, negativos no sentido oposto. Se apertar o botão, aparece a mensagem “Botão pressionado”.
À medida que você gira o encoder em uma direção, a variável pos aumenta ou diminui de valor.
Projeto
Neste projeto são adicionados 2 conjuntos de 6 LEDs em série e um LED amarelo com um resistor de 470 Ω, este indica se o botão foi pressionado.
Lista de materiais:
- 1 Arduino Uno.
- Protoboard.
- 1 encoder KY-040.
- 13 LEDs, 6 de cada cor e 1 de uma cor diferente.
- 2 TIP 120.
- 5 resistores, 3 de 470 Ω e 2 de 1,5 kΩ.
- Placa de circuito impresso e/ou ponte de terminais.
O código fonte abaixo.
#include <RotaryEncoder.h>
RotaryEncoder encoder(A2,A3);
int redPin=9;
int yellowPin=5;
int greenPin=6;
int button=7;
int valor=0;
int newPos=0;
void setup() {
pinMode(button,INPUT);
pinMode(redPin,OUTPUT);
pinMode(yellowPin,OUTPUT);
pinMode(greenPin,OUTPUT);
Serial.begin(9600);
}
void loop() {
if(digitalRead(button)==LOW){
digitalWrite(yellowPin,HIGH);
}else{
digitalWrite(yellowPin,LOW);
}
static int pos=0;
encoder.tick();
int newPos=encoder.getPosition();
//se a posição foi alterada, mostra o valor no Serial.
if(pos != newPos){
Serial.print(newPos);
Serial.println();
if(pos<newPos){ //Verifica qual direção está girando.
digitalWrite(redPin,HIGH);
digitalWrite(greenPin,LOW);
}else if(pos>newPos){
digitalWrite(redPin,LOW);
digitalWrite(greenPin,HIGH);
}
pos=newPos;
}
}
O vídeo abaixo mostra as saídas de CLK e DT e como o projeto deve funcionar.