Tutorial: como utilizar encoder rotativo com Arduino

Adquira estes componentes na Loja do Lab de Garagem

O encoder rotativo é um dispositivo de medição angular. Com ele é possível medir com precisão a rotação de motores. Alguns deles contém um botão pressionando o eixo. Neste tutorial, vamos mostrar como utilizá-lo com Arduino. Este encoder rotativo contém 7 pinos: dois para fixação, dois para o botão e três para medição de rotação. Vamos apenas utilizar os três pinos para medição de rotação. Para maiores informações sobre o encoder, clique aqui!

Primeiramente, faça a ligação abaixo:

Abra a IDE do Arduino e conecte seu Arduino no PC. Passe a programação abaixo:

/* Rotary encoder read example */
#define ENC_A 8
#define ENC_B 9
#define ENC_PORT PINB

void setup()
{
/* Setup encoder pins as inputs */
pinMode(ENC_A, INPUT);
digitalWrite(ENC_A, HIGH);
pinMode(ENC_B, INPUT);
digitalWrite(ENC_B, HIGH);
Serial.begin (9600);
Serial.println("Start");

}

void loop()
{
static uint8_t counter = 0; //this variable will be changed by encoder input
int8_t tmpdata;
/**/
tmpdata = read_encoder();
if( tmpdata ) {
Serial.print("Counter value: ");
Serial.println(counter, DEC);

counter += tmpdata;

}

}

/* returns change in encoder state (-1,0,1) */
int8_t read_encoder()
{
static int8_t enc_states[] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0};
static uint8_t old_AB = 0;
/**/
old_AB = old_AB 2; //remember previous state
old_AB |= ( ENC_PORT & 0x03 ); //add current state
return ( enc_states[( old_AB & 0x0f )]);
}

Selecione a versão do seu Arduino (UNO, Duemilanove, etc) e a porta (COMx, ttyUSBx, ttyACMx, etc) e clique em UPLOAD.

Abra o Serial Monitor e configure o baud para 9600. A palavra "Start" aparecerá. Gire o encoder para um lado e para o outro. A imagem abaixo mostra os dados que chegam do encoder:

Ao girar o encoder, o Arduino detecta a variação de pulso (-1,0,1) que chega dos pinos 8 e 9 e os converte em inteiro e mostra no Serial Monitor.

E é isso! Esperamos que tenha gostado! Se tiver dúvidas, poste aqui neste blog! Para sugestões de tutoriais, clique aqui! Para ver outros tutoriais e projetos desenvolvidos pela equipe LdG e por outros garagistas, clique aqui e aqui! Até a próxima!

Referências:

http://en.wikipedia.org/wiki/Rotary_encoder

http://www.circuitsathome.com/mcu/programming/reading-rotary-encode...

http://www.sparkfun.com/products/9117

http://arduino.cc/playground/Main/RotaryEncoders

Exibições: 39125

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de Rodrigo Alves Nunes em 5 setembro 2015 às 15:24

Estou tentando utilizar um encoder de 400ppr. ele possui 4 fios, um Vcc, Outro 0V, outro dois A e B e uma malha.

Nenhum dos códigos que eu tentei funcionaram.

Alguém pode me dar uma dica?

Comentário de Ticyfjsk nogueira em 24 maio 2015 às 23:40

Não compila por causa desta linha "old_AB = old_AB 2; //remember previous state".

Comentário de Paula Parahyba em 17 setembro 2014 às 15:38

O que fazer quando não aparece a mensagem "start" no serial monitor?

Comentário de J.A Assunção em 28 agosto 2014 às 2:15

não vai 5v nesse encoder? soh 2 saidas analogicas msm? eu tenho um aqui de 3 pernas apenas

Comentário de Judenilson Araujo em 12 agosto 2013 às 20:41

Como sempre as explicações são muito boas, mas para quem quiser um encoder com giro mais diâmico aumentando os valores de acordo com as velocidade q o mesmo é girado. Segue esse link q achei na net, onde vc pode baixar uma biblioteca q deixa a implementação bem fácil. Observe, que as portas usadas não são digitais mais analógicas.

https://code.google.com/p/arduino-rotary-encoder-with-velocity/

Comentário de Rafael Luqueta em 27 março 2013 às 17:20

Ola estou  desenvolvendo um projeto para faculdade e gostaria de saber se a aplicação do codigo que você postou funciona em um Sensor de fluxo de água como  este (http://lojabrasilrobotics.blogspot.com.br/2012/03/sensor-de-fluxo-d...), tenho que computar a rotação de água e mandar a informação para o arduino que mostra em um display, gostaria de saber se esse código me ajudaria com essa duvida ?

Comentário de Jonatas Freitas em 8 novembro 2012 às 15:18

equivale a SE == a TRUE

Comentário de Geraldo Freitas Barbosa Filho em 8 novembro 2012 às 13:16

alguem pode me explicar a linha:

if( tmpdata ) {

o que significa?quais sao os criterios que o ''if'' utiliza nesse caso?

Comentário de Jonatas Freitas em 18 setembro 2012 às 22:21

Pessoal,

E no caso de múltiplos encoders?

Alguem já implementou algo do tipo, e qual experiências quanto a necessidade de interrupções?

Comentário de Geraldo Freitas Barbosa Filho em 17 setembro 2012 às 17:37

oi, consegue me ajudar? eu gravei esse programa no arduino leonardo e funcionou de boa...o problema eh que estou querendo mandar outro programa pro micro, mas ele continua rodando este do encoder, mesmo dando o upload. Eu preciso limpar a memoria do microcontrolador ou coisa parecida?como faco o arduino rodar o codigo atual e nao o anterior?

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço