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.


frequência do pulso de saída. Fonte: UWE.
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.

ondas Output A e Output B. Fonte: Mytechtutor.

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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #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.