Arduino - Encoder Rotativo
Neste tutorial, vamos aprender a usar o encoder incremental com o Arduino. Em detalhes, vamos aprender:
- Como um encoder rotativo funciona
- Encoder rotativo vs potenciômetro
- Como conectar o encoder rotativo ao Arduino
- Como programar o Arduino para ler a direção e a posição do encoder rotativo SEM interrupção
- Como programar o Arduino para ler a direção e a posição do encoder rotativo COM interrupção
Hardware Necessário
Or you can buy the following kits:
| 1 | × | DIYables STEM V3 Starter Kit (Arduino included) | |
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
Sobre o Encoder Rotativo
Um encoder rotativo é um dispositivo eletromecânico que converte o movimento de rotação em um sinal elétrico. Ele mede a rotação e a posição de um eixo ou knob. Existem dois tipos principais:
- Encoder incremental: gera pulsos para medir a mudança relativa
- Encoder absoluto: fornece um código digital único para cada posição, o que o torna ideal para posicionamento preciso mesmo após uma perda de energia.
Este guia é sobre o encoder incremental.
Pinagem do Módulo Encoder Rotativo

Um módulo encoder rotativo tem 4 pinos:
- Pino CLK (Saída A): é o pulso principal que nos diz quanta rotação ocorreu. Sempre que você gira o knob em um detent (clique) em qualquer direção, o pino CLK gera um sinal que completa um ciclo inteiro (LOW → HIGH → LOW).
- Pino DT (Saída B): funciona como o pino CLK, mas gera um sinal atrasado 90 graus em relação ao sinal CLK. Ele nos ajuda a descobrir a direção da rotação (sentido horário ou anti-horário).
- Pino SW: é a saída do botão de pressão dentro do encoder. Ele é normalmente aberto. Se usarmos um resistor de pull-up neste pino, o pino SW ficará em HIGH quando o knob não estiver pressionado e em LOW quando estiver pressionado.
- Pino VCC (+): deve ser conectado ao VCC (entre 3,3 e 5 volts)
- Pino GND: deve ser conectado ao GND (0V)
Encoder Rotativo vs Potenciômetro
Você pode confundir o encoder rotativo com o potenciômetro, mas eles são componentes diferentes. Veja uma comparação entre eles:
- O encoder rotativo é como a versão moderna do potenciômetro, mas pode fazer mais coisas.
- O encoder rotativo pode girar uma volta completa sem parar, enquanto o potenciômetro só gira cerca de três quartos da volta.
- O encoder rotativo gera pulsos, enquanto o potenciômetro gera uma tensão analógica.
- O encoder rotativo é útil quando você só precisa saber quanto o knob se moveu, e não exatamente onde ele está. O potenciômetro é útil quando você realmente precisa saber exatamente onde o knob está.
Como o Encoder Rotativo Funciona

Dentro do encoder, há um disco com ranhuras conectado a um pino chamado C, que funciona como um terra comum. Há mais dois pinos, A e B.
- Quando você gira o knob, os pinos A e B tocam o pino terra comum C, mas em uma certa ordem, dependendo do sentido em que você gira o knob (horário ou anti-horário).
- Esses toques criam dois sinais. Eles têm uma pequena diferença de tempo porque um pino toca o terra antes do outro. Os dois sinais ficam 90 graus fora de sincronia um com o outro. Isso se chama codificação em quadratura.
- Quando você gira o knob no sentido horário, o pino A toca o terra antes do pino B. Quando você gira o knob no sentido anti-horário, o pino B toca o terra antes do pino A.
- Monitorando quando cada pino toca ou deixa o terra, podemos descobrir para que lado o knob está girando. Fazemos isso verificando o que acontece com o pino B quando o pino A muda.

Quando A muda de estado de LOW para HIGH:
- Se B estiver em LOW, o knob foi girado no sentido horário.
- Se B estiver em HIGH, o knob foi girado no sentido anti-horário.
※ Nota:
Os pinos A e B estão conectados aos pinos CLK e DT. No entanto, dependendo do fabricante, a ordem pode ser diferente. Os códigos fornecidos abaixo foram testados com o encoder rotativo da DIYables
Como Programar o Encoder Rotativo
- Verifique o sinal do pino CLK
- Se o estado mudar de LOW para HIGH, verifique o estado do pino DT.
- Se o estado do pino DT for HIGH, o knob foi girado no sentido anti-horário; aumente o contador em 1
- Se o estado do pino DT for LOW, o knob foi girado no sentido horário; diminua o contador em 1
Diagrama de Ligação

This image is created using Fritzing. Click to enlarge image
Código Arduino – Encoder Rotativo sem Interrupção
O código Arduino abaixo faz o seguinte:
- Detecta a direção e a quantidade de rotação do encoder.
- Se detectar que o knob foi girado um detent (clique) no sentido horário, aumenta o contador em um.
- Se detectar que o knob foi girado um detent (clique) no sentido anti-horário, diminui o contador em um.
- Detecta se o botão foi pressionado.
Para simplificar o código de debounce do botão, usamos a biblioteca ezButton.
Passos Rápidos
- Instale a biblioteca ezButton no Arduino IDE. Veja Como Fazer
- Copie o código acima e abra-o no Arduino IDE
- Clique no botão Upload no Arduino IDE para carregar o código no Arduino
- Gire o knob no sentido horário e depois no sentido anti-horário
- Pressione o knob
- Veja o resultado no Serial Monitor.
Explicação do Código
Confira os comentários linha por linha no código
Código Arduino – Encoder Rotativo com Interrupção
No código de exemplo anterior, usamos o método de polling, que verifica continuamente o estado do pino. Isso tem duas desvantagens:
- Desperdiça recursos do Arduino
- Alguns pulsos do contador podem ser perdidos se outro trecho de código demorar muito para executar.
Uma forma de resolver isso é usar interrupções. As interrupções eliminam a necessidade de verificar constantemente um determinado evento. Isso permite que o Arduino realize outras tarefas sem deixar passar nenhum evento.
Veja um exemplo de como ler um encoder rotativo com interrupções.
Agora, ao girar o knob, você verá informações aparecendo no Serial Monitor, muito parecidas com as que você viu no código anterior.
※ Nota:
- Se você usar a interrupção, precisa conectar o pino CLK do encoder a um pino do Arduino que suporte interrupções. Mas lembre-se: nem todos os pinos do Arduino fazem isso. Por exemplo, no Arduino Uno, apenas os pinos 2 e 3 funcionam com interrupções.
- Você pode encontrar tutoriais em outros sites que usam duas interrupções para um único encoder, mas isso é desnecessário e um desperdício. Apenas uma interrupção é suficiente.
- É importante usar a palavra-chave volatile nas variáveis globais usadas na interrupção. Não fazer isso pode causar problemas inesperados.
- Mantenha o código dentro da interrupção o mais simples possível. Evite usar Serial.print() ou Serial.println() dentro da interrupção.
Aplicações do Encoder Rotativo com Arduino
Com o Encoder Rotativo, podemos fazer as seguintes aplicações, entre outras:
- Arduino - Encoder Rotativo controla a Posição do Servo Motor
- Arduino - Encoder Rotativo controla o Brilho do LED
- Arduino - Encoder Rotativo controla a Velocidade do Motor de Passo