- Descrição: O Sensor de Proximidade Infravermelho E18-D80NK é ideal para ser…
Como usar com Arduino – Módulo Encoder Rotativo KY-040
– Descrição:
O Módulo Encoder Rotativo KY-040 é um componente de medição regular desenvolvido com a finalidade de converter movimentos rotativos (ou lineares) em impulsos elétricos de onda quadrada. Os impulsos elétricos produzidos pelo encoder podem ser interpretados por plataformas microcontroladas e estes impulsos produzem uma quantidade exata (de 20 pulsos por rotação) em cada volta.
O Módulo Encoder Rotativo KY-040 tem a aparência de um potenciômetro, contudo seu funcionamento é diferente. Além disso, este encoder possui rotação contínua e tem um botão embutido em seu eixo, bastando pressionar o eixo para acionamento do botão.
– Especificações e características:
– Modelo: KY-040
– Tensão máxima: 5VDC
– Corrente máxima: 10mA
– Pulsos por rotação: 20
– Tipo de rotação: contínua
– Comprimento do eixo: 10mm
– Diâmetro do eixo: 5mm
– Aplicações:
Projetos com Arduino ou outras plataformas microcontroladas em que seja necessário converter movimentos rotativos (ou lineares) em impulsos elétricos de onda quadrada.
– Proposta da prática:
Utilizar o Módulo Encoder Rotativo KY-040 em conjunto com o Arduino e mostrar no monitor serial do ambiente de programação do Arduino o sentido do giro do eixo e a posição atual do encoder.
– Lista dos itens necessários:
01 – Arduino com Cabo USB
01 – Módulo Encoder Rotativo KY-040
05 – Cabos Jumper macho-fêmea
– Esquema de ligação da prática:
– Tutorial de instalação e configuração do ambiente de programação do Arduino:
Arduino – Instalação e Configuração da IDE no Windows
– Código:
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 39 40 41 42 43 44 |
const int pinoCLK = 3; //PINO DIGITAL (CLK) const int pinoDT = 4; //PINO DIGITAL (DT) const int pinoSW = 5; //PINO DIGITAL (SW) int contadorPos = 0; //CONTADOR DE POSIÇÕES DO ENCODER int ultPosicao; //REGISTRA A ÚLTIMA POSIÇÃO DO ENCODER int leituraCLK; //VARIÁVEL PARA ARMAZENAR LEITURA DO PINO CLK boolean bCW; //VARIÁVEL DE CONTROLE DO SENTIDO (HORÁRIO / ANTI-HORÁRIO) void setup() { Serial.begin (9600); //INICIALIZA A SERIAL pinMode (pinoCLK,INPUT); //DEFINE O PINO COMO ENTRADA pinMode (pinoDT,INPUT); //DEFINE O PINO COMO ENTRADA pinMode (pinoSW,INPUT_PULLUP); //DEFINE O PINO COMO ENTRADA / "_PULLUP" É PARA ATIVAR O RESISTOR INTERNO //DO ARDUINO PARA GARANTIR QUE NÃO EXISTA FLUTUAÇÃO ENTRE 0 (LOW) E 1 (HIGH) ultPosicao = digitalRead(pinoCLK); //VARIÁVEL RECEBE A LEITURA DO PINO CLK } void loop() { leituraCLK = digitalRead(pinoCLK); //VARIÁVEL RECEBE A LEITURA DO PINO CLK if (leituraCLK != ultPosicao){ //SE VALOR DA VARIÁVEL FOR DIFERENTE DO VALOR DE "ultPosicao", FAZ if (digitalRead(pinoDT) != leituraCLK) { //SE LEITURA DO PINO FOR DIFERENTE DA LEITURA DE "leituraCLK", //SIGNIFICA QUE O EIXO ESTÁ SENDO GIRADO NO SENTIDO HORÁRIO E FAZ contadorPos++; //INCREMENTA CONTAGEM DA VARIÁVEL EM +1 bCW = true; //VARIÁVEL BOOLEANA RECEBE VERDADEIRO (SENTIDO HORÁRIO) } else { //SENÃO, SIGNIFICA QUE O EIXO ESTÁ SENDO GIRADO NO SENTIDO ANTI-HORÁRIO E FAZ bCW = false; //VARIÁVEL BOOLEANA RECEBE FALSO (SENTIDO ANTI-HORÁRIO) contadorPos--; //DECREMENTA CONTAGEM DA VARIÁVEL EM -1 } Serial.print("Giro no "); //IMPRIME O TEXTO NA SERIAL if (bCW){ //SE VARIÁVEL FOR IGUAL A VERDADEIRO, FAZ Serial.print("sentido horário"); //IMPRIME O TEXTO NA SERIAL }else{ //SENÃO, FAZ Serial.print("sentido anti-horário"); //IMPRIME O TEXTO NA SERIAL } Serial.print(" / Posição do encoder: "); //IMPRIME O TEXTO NA SERIAL Serial.println(contadorPos); //IMPRIME NO MONITOR SERIAL A POSIÇÃO ATUAL DO ENCODER } if(digitalRead(pinoSW) == LOW){ //SE LEITURA DO PINO FOR IGUAL A LOW, FAZ Serial.println ("Botão pressionado"); //IMPRIME O TEXTO NA SERIAL delay(200); //INTERVALO DE 200 MILISSEGUNDOS } ultPosicao = leituraCLK; //VARIÁVEL RECEBE O VALOR DE "leituraCLK" } |
– Resultado final:
Gostou desta prática? Então deixa seu comentário, dúvida ou sugestão aí embaixo!
Loja online: https://www.masterwalkershop.com.br
Fan page no Facebook: https://www.facebook.com/masterwalkershop
Nos ajude a espalhar conhecimento clicando no botão de compartilhar (f Like) que está mais abaixo.
Obrigado e até a próxima!
Seu feedback é muito importante! Que tal dar uma nota para esta postagem?! Faça sua avaliação aqui embaixo.
Postagem anterior: Como usar com Arduino – Sensor Microondas RCWL-0516 (Detector) de Movimento
Próxima postagem: Como usar com Arduino – Interruptor Óptico (Fototransistor) TCST2103
Primeiramente, obrigado por colocar o exemplo no seu site Euler Oliveira! Ajudou bastante no iníco das minhas tentativas. Você colocou de forma bem clara e tudo muito direto, sem lenga lenga! show de bola.
Eu testei o código em um arduino Duemilanove com as ligações sugeridas aqui e também enfrentei o mesmo problema de duplicação… ou seja, eu girava para o sentido horário e eu sempre recebia duas mensagens: Sentido Horario + Sentido Anti Horario.
Depois de pesquisar um pouco eu encontrei um material interessante e uma biblioteca bastante intuitiva para se usar esse decoder.
Acho que o principal problema na abordagem proposta aqui é o uso dos pinos digitais para ler as portas DT e CLK. Eventualmente essa abordagem funciona, porém não é muito robusta (gera alguns comportamentos imprevisiveis).
Nos outros materiais eu encontrei as portas DT e CLK sendo lidas como portas analógicas e apenas a porta do botão de click (SW) sendo lida como porta digital.
Não sei se é permitido compartilhar link aqui, porém vou preferir desculpas depois do que pedir permissão agora.
Os materiais que encontrei são os seguintes:
http://www.mathertel.de/Arduino/RotaryEncoderLibrary.aspx (Explicação do desenvolvedor que criou a bilbioteca para o Rotary Encoder)
https://www.arduinoecia.com.br/como-usar-encoder-rotativo-ky-040-arduino/ (Uma outra referência de uso do KY-040)
Olá, tudo bem sou estudante de Eng. De software, ainda no começo e já revirei a internet para descobrir como fazer para, um motor conectado a um encoder incremental no eixo com ponte H, a ideia séria a seguinte, motor girar para o lado direito, depois para o outro esquerdo, e somaria estes dois valores indicado pelo encoder , e depois dividiria por dois, e então o motor se moveria para o resultado, o valor dividido, a posição de acordo com o encoder indicado, e possível isso,nem sei por onde começar
Não sei se é o código acima ou se é o Arduino, mas fica duplicando os valores
Olá C3bola.
Agradeço pelo comentário!
O código está OK.
Todo material postado aqui no Blog é verificado e testado antes de ser disponibilizado na postagem. Inclusive no final da postagem tem um vídeo mostrando o resultado final da prática.
Oi Euler, eu uso muito o material aqui do blog e realmente funciona. Eu comprei o Arduino Mega 2560 e o comportamento foi diferente, no simulador funciona perfeitamente.
OBS. não é critica o comentário é mais para um help, eu fiz ctrl+c ctrl+v
Nesse caso teria que testar um outro encoder e ver se vai ocorrer o mesmo problema, pois em teoria independente se a placa é Uno ou mega, o funcionamento tem que ser igual ao mostrado no vídeo.
Valeu Euler, vou pegar outro que tenho e fazer o teste, o ruim é que comprei um monte desse aqui na MasterWalker também
OK.
Qualquer coisa é só retornar aqui e informar o resultado ou novas dúvidas se surgirem.
@C3bola
Existe um erro de sintaxe na linha 24. Não deve ter espaço em “contadorPos++;”
Assim o código funciona perfeitamente. Se o problema persistir deve ser no seu circuito.