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: 39135

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 Jonatas Freitas em 1 agosto 2012 às 22:34

Testa essas variações:

E verifica possíveis mal contatos".

------------------------------------

/* Rotary encoder read example */
#define ENC_A 14
#define ENC_B 15
#define ENC_PORT PINC
 
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 (115200);
  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 = 2;                   //remember previous state
  old_AB |= ( ENC_PORT & 0x03 );  //add current state
  return ( enc_states[( old_AB & 0x0f )]);
}

Comentário de Guilherme Campos Farias em 1 agosto 2012 às 22:12

Obrigado pela ajudo, compilo certinho,

Estou usando um scroll de um mouse com 3 pinos, o do meio ligado no gnd e os laterais um no 8 e outro no 9.

Porem quando dou um passo no scroll “giro” ele começa a contar e ate o 255 e continia em 0 ate 255 sem parar.

Ele inicia a contagem no primeiro passo e para no próximo, reiniciando novamente no passo seguinte.

Resumindo, não esta contanto as voltas ou partes dela.

Será q estou fazendo algo errado ou esse código é assim mesmo?

Quero usar um encoder para “controlar um motor”

Comentário de Jonatas Freitas em 1 agosto 2012 às 20:55

Tem um errinho no código.

Esta sobrando um "old_AB" ali na função de leitura.

----------------------------------------------
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 = 2; //remember previous state
old_AB |= ( ENC_PORT & 0x03 ); //add current state
return ( enc_states[( old_AB & 0x0f )]);
}
----------------------------------------------

Fonte: http://www.circuitsathome.com/mcu/programming/reading-rotary-encode...
Comentário de Guilherme Campos Farias em 31 julho 2012 às 23:34

ola, so novato por aqui, e tentei fazer o ex. acima e deu o seguite erro:

sera que fiz algo errado?

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço