Framework Arduino II: Aula 23 Encoders

imagem meramente ilustrativa


Introdução

    Quando explicamos sobre o funcionamento de um servo motor citamos o uso de encoders ao falar do controle de posicionamento. No entanto não havíamos explicado o que é um encoder. Esse tópico foi feito para corrigir essa falha.

Entendendo o que é um Encoder

    Encoder é um dispositivo eletromecânico que converte o movimento rotativo em pulsos elétricos, o que permite controlar posicionamento, medir velocidade angular e contar rotações de dispositivos giratórios. Para isso podem utilizar diversos mecanismos. O mais comum é o óptico rotativo.

    Um encoder de mecanismo óptico rotativo basicamente é composto por um conjunto emissor e receptor de luz, geralmente do tipo IR. Entre esse conjunto gira um disco movido por um eixo ligado ao dispositivo a ser controlado. Esse disco é perfurado com marcações regulares que interrompem a passagem da luz. 

Funcionamento de um encoder óptico
Funcionamento de um encoder óptico


    Através dessas marcações podemos identificar a posição do eixo, para um controle de posicionamento. O número de interrupções permite contar o quanto de voltas foi realizado em um dado período, dando a velocidade angular ou o número de voltas.

    O mesmo princípio era utilizado nos antigos mouses de bolinha para traduzir a movimentação do dispositivo sobre a mesa, através de dois encoders, um para controlar o movimento do eixo x e outro para o eixo y.

Encoders em antigos mouses
Encoders em antigos mouses


Componentes principais de um Encoder Rotativo
Componentes principais de um Encoder Rotativo


    São muito utilizados na indústria em diversas operações, principalmente no controle de motores. São encontrados tanto na forma de encoders rotativos, como também lineares onde ao invés de um disco temos uma régua perfurada com marcações.

Onde usar nos projetos makers?

    O principal uso de encoders nos projetos makers está na forma de sensores de velocidade que são baseados em encoders rotativos. Geralmente são vendidos sem o disco perfurado, que deverá ser comprado separadamente ou "fabricado" pelo maker, no tamanho desejado, conforme a necessidade do projeto.

Sensor de velocidade e disco
Sensor de velocidade e disco


    Esse sensor de velocidade pode ser adaptado a diversas aplicações como, por exemplo, em anemômetros para medir a velocidade e direção do vento. Como a montagem pode ser relativamente complicada, muitos fornecedores oferecem anemômetros prontos para aquisição.

    Outro exemplo de uso de encoder são os Encoder/Decoder Rotacionais, que podem ser utilizados no lugar de potenciômetros com a vantagem de possuir rotação contínua e ter um botão quando acionamos o seu eixo. O mais popular é o KY-40 que usaremos na montagem do Wokwi, na falta de um sensor de velocidade.

Um KY-40 com botão
Um KY-40 com botão


    Ele tem cinco terminais: 

  • VCC para ligar no 5V do Arduino
  • GND para ligar em um dos GND do Arduino
  • CLK que controla o clock para ligar em um pino 2 ou 3 do Arduino UNO*
  • DT que controla o sentido da rotação
  • SW que controla o acionamento do botão do eixo do KY-40 em LOW
Nota*: Os pinos 2 e 3 no Arduino Uno são utilizados para controles mais avançados de interrupção que não veremos nesse curso.

Montagem

    Vou disponibilizar uma montagem pronta no Wokwi mostrando o uso básico de um KY-40 para indicar o sentido da rotação, a contagem de pulsos e acionar o botão do eixo. Ao iniciar a simulação, teste clicando nos elementos assinalados em vermelho na figura.

Simulação do KY-40 destacando em vermelho os pontos a serem clicados
Simulação do KY-40 destacando em vermelho os pontos a serem clicados


    Link: https://wokwi.com/projects/415385217740076033

Sketch

    Nesse código não estamos utilizando nenhuma biblioteca especializada. Nas linhas iniciais estamos declarando constantes para definir os pinos que controlarão o KY-40. Depois temos as declarações de quatro variáveis:

  • leituradt para pegar a leitura do terminal DT do encoder
  • leituraclk para pegar a leitura do terminal CLK do encoder
  • ultimo para pegar a última leitura do terminal CLK
  • contador para contar os pulsos do CLK.

    Na função setup temos a configuração do pinos como entrada, sendo que o pino do botão do eixo do encoder (SW) está configurado como pull up, isto é, desligado quando HIGH e acionado quando LOW e também iniciamos o monitor serial.

    Na função loop lemos o estado do CLK. Se ele for diferente da última leitura, testamos se o encoder foi acionado no sentido horário ou anti-horário pelo usuário. Dependendo do sentido alteramos o contador para mais ou para menos.

    Se o botão do eixo for pressionado, o contador é resetado para zero.

  1. int const clk=2;
  2. int const dt=3;
  3. int const sw=4;
  4. int ultimo=1;
  5. int leituradt=0;
  6. int leituraclk=0;
  7. int contador=0;
  8. void setup() {
  9.   Serial.begin(9600);
  10.   pinMode(clk, INPUT);
  11.   pinMode(dt, INPUT);
  12.   pinMode(sw, INPUT_PULLUP);
  13. }
  14. void loop() {
  15.   leituraclk = digitalRead(clk);
  16.   if (leituraclk != ultimo) {
  17.     ultimo = leituraclk;
  18.     leituradt = digitalRead(dt);
  19.     if (leituraclk == LOW && leituradt == HIGH) {
  20.       Serial.println("Sentido horário");
  21.       contador++;
  22.       Serial.print("Aumentou o contador: ");
  23.       Serial.println(contador);  
  24.     }
  25.     if (leituraclk == LOW && leituradt == LOW) {
  26.       Serial.println("Sentido anti-horário");
  27.       contador--;
  28.       Serial.print("Diminuiu o contador: ");
  29.       Serial.println(contador);  
  30.     }
  31.   }
  32.   if (digitalRead(sw) == LOW) {
  33.     contador=0;
  34.     Serial.print("resetou o contador: ");
  35.     Serial.println(contador);  
  36.   }
  37. }

    Caso tenha curiosidade sobre o uso de bibliotecas com o KY-40 você pode dar uma olhada em um post interessante do site Arduino e CIA. Tem um vídeo também interessante em inglês com outras utilizações do KY-40 que podem te dar novas ideias. Para ver clique aqui.

Próxima Aula                                                                                                                        Aula Anterior

Referências

AUTO CORE ROBOTICA. Módulo Encoder Decoder Rotacional KY-040. Disponível em <https://www.autocorerobotica.com.br/modulo-encoder-decoder-rotacional-ky-040> Acesso em 23 nov 2024.

ENCODER ROTATIVO. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2020. Disponível em: <https://pt.wikipedia.org/w/index.php?title=Encoder_rotativo&oldid=59219052>. Acesso em: 23 nov 2024.

EPC. What is an encoder? Disponível em <https://www.encoder.com/article-what-is-an-encoder> Acesso em 23 nov 2024.

HI TECNOLOGIA. O que é Encoder? Disponível em <https://materiais.hitecnologia.com.br/blog/o-que-%C3%A9-encoder-para-que-serve-como-escolher-como-interfacear/> Acesso em 23 nov 2024.

INDMALL. How Do Rotary Encoders Work? Disponível em <https://www.indmall.in/faq/how-do-rotary-encoders-work/> Acesso em 23 nov 2024.

MAKER HERO. Medindo a rotação de Motor DC com Sensor de velocidade e Arduino. Disponível em <https://www.makerhero.com/blog/rotacao-de-motor-dc-sensor-de-velocidade-arduino/> Acesso em 23 nov 2024.

MAKER HERO. Encoder Decoder KY-040 Rotacional. Disponível em <https://www.makerhero.com/produto/encoder-decoder-ky-040-rotacional/> Acesso em 23 nov 2024.

WOKWI. Referência do wokwi-ky-040. Disponível em <https://docs.wokwi.com/pt-BR/parts/wokwi-ky-040> Acesso em 23 nov 2024.