Arduino Nano - Encoder Rotativo
Este tutorial ensina você a usar o encoder rotativo com o Arduino Nano. Veja o que vamos abordar:
- Como o encoder rotativo funciona
- A diferença entre um encoder rotativo e um potenciômetro (outro tipo de botão giratório)
- Como conectar o encoder rotativo a um Arduino Nano
- Como escrever o código para o Arduino Nano ler a direção e a posição do encoder rotativo.
Hardware Necessário
Or you can buy the following kits:
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
Sobre o Encoder Rotativo
Um botão giratório chamado encoder rotativo pode transformar giros em um sinal. Ele mostra quanto algo girou e em que posição está. Existem dois tipos principais:
- Encoder incremental: Usa sinais rápidos para ver quanto algo se moveu.
- Encoder absoluto: Esse tipo fornece um código único para cada posição, o que ajuda a descobrir exatamente onde algo está, mesmo se a energia acabar.
Este guia é todo 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 botão em um clique (detent) em qualquer direção, o pino CLK emite um sinal que completa um ciclo inteiro (LOW → HIGH → LOW).
- Pino DT (Saída B): age como o pino CLK, mas emite um sinal que fica atrasado em relação ao sinal CLK em 90 graus. 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 nesse pino, o pino SW ficará HIGH quando o botão não estiver pressionado e LOW quando estiver pressionado.
- Pino VCC (+): precisa ser conectado ao VCC (entre 3,3 e 5 volts)
- Pino GND: precisa ser conectado ao GND (0V)
Encoder Rotativo vs Potenciômetro
Você pode confundir o encoder rotativo com o potenciômetro, mas essas são peças diferentes. Veja uma comparação entre eles:
- O encoder rotativo pode ser visto como a versão moderna de um potenciômetro, mas oferece mais recursos.
- O encoder rotativo pode girar completamente sem parar, enquanto o potenciômetro só consegue girar cerca de três quartos de volta.
- O encoder rotativo emite pulsos, enquanto o potenciômetro produz tensão analógica.
- Quando você só precisa saber quanto o botão se moveu, sem identificar sua posição exata, o encoder rotativo é conveniente. Por outro lado, o potenciômetro é valioso quando você precisa saber com precisão a posição de um botão.
Como o Encoder Rotativo Funciona

Dentro do encoder, há um disco com ranhuras conectado a um pino chamado C, que funciona como um terra compartilhado. Há mais dois pinos, A e B.
- Quando você gira o botão, os pinos A e B tocam o pino C do terra compartilhado, mas em uma certa ordem, dependendo do lado para o qual você gira o botão (sentido horário ou anti-horário).
- Esses toques criam dois sinais. Eles são um pouco diferentes no tempo, porque um pino toca o terra antes do outro. Os dois sinais estão defasados em 90 graus um do outro. Isso é chamado de codificação em quadratura.
- Quando você gira o botão no sentido horário, o pino A toca o terra antes do pino B. Quando você gira o botão no sentido anti-horário, o pino B toca o terra antes do pino A.
- Monitorando quando cada pino toca ou sai do terra, podemos descobrir para que lado o botão 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 está LOW, o botão foi girado no sentido horário.
- Se B está HIGH, o botão foi girado no sentido anti-horário.
※ Nota:
Os pinos A e B estão conectados aos pinos CLK e DT. No entanto, dependendo dos fabricantes, 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 botão foi girado no sentido anti-horário, aumente o contador em 1
- Se o estado do pino DT for LOW, o botão 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
Veja A melhor forma de alimentar o Arduino Nano e outros componentes.
Código Arduino Nano – Encoder Rotativo
O código Arduino Nano abaixo faz o seguinte:
- Detecta a direção e a quantidade de rotação do encoder.
- Se detectar que o botão foi girado em um clique (detent) no sentido horário, aumenta o contador em um.
- Se detectar que o botão foi girado em um clique (detent) no sentido anti-horário, diminui o contador em um.
- Detecta se o botão está pressionado.
Para simplificar o código de debounce do botão, a biblioteca ezButton é usada.
Passos Rápidos
- Instale a biblioteca ezButton na Arduino IDE. Veja Como Fazer
- Copie o código acima e abra com a Arduino IDE
- Clique no botão Upload na Arduino IDE para fazer upload do código para o Arduino Nano
- Gire o botão no sentido horário e depois no sentido anti-horário
- Pressione o botão
- Confira o resultado no Serial Monitor.
Explicação do Código
Confira os comentários linha por linha no código
Código Arduino Nano – Encoder Rotativo com Interrupção
No exemplo de código anterior, usamos o método de polling, que verifica continuamente o estado do pino. Isso tem duas desvantagens:
- Desperdiça recursos do Arduino Nano
- Alguns contadores podem ser perdidos se outro código demorar para executar.
Uma maneira de lidar com isso é usar interrupções. As interrupções eliminam a necessidade de verificar constantemente um determinado evento. Isso permite que o Arduino Nano execute outras tarefas sem perder um evento.
Aqui está um exemplo de como ler um encoder rotativo com interrupções.
Agora, ao girar o botão, você verá informações aparecendo no Serial Monitor, bem 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 Nano que suporte interrupções. Mas lembre-se: nem todos os pinos do Arduino Nano conseguem fazer isso. Por exemplo, no Arduino Nano, somente 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. Ignorar 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 Nano
Com o Encoder Rotativo, podemos fazer as seguintes aplicações, mas não só:
- Arduino Nano - Encoder Rotativo controla a Posição de um Servo Motor
- Arduino Nano - Encoder Rotativo controla o Brilho de um LED
- Arduino Nano - Encoder Rotativo controla a Velocidade de um Motor de Passo