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

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 Julio Pavei Furlanetto em 21 agosto 2012 às 18:14

Olá, sabe onde encontro esse encoder?? de preferencia em SC

mas procurei no Mercado livre e n encontrei esse modelo, apenas um outro que é grande...

Comentário de Geraldo Freitas Barbosa Filho em 14 agosto 2012 às 10:44

Eu ja havia feito essa alteracao...mas soh funcionou quando mudei as portas. As definicoes ficaram assim:

#define ENC_A A4
#define ENC_B A5
#define ENC_PORT PINF

Comentário de Jonatas Freitas em 13 agosto 2012 às 13:46
Sei lá porque o editor de texto do blog não pega os sinais de  MAIOR QUE e MENOR QUE

Tenta:
old_AB (MENOR QUE)(MENOR QUE)2 // as setas do lado do M do seu teclado, sem o parentes.

http://www.circuitsathome.com/mcu/programming/reading-rotary-encode...
Comentário de Eder em 13 agosto 2012 às 7:11

opa acabei de desmontar um video cassete sony e tem um desse ja vou testar

Obrigado

Comentário de Geraldo Freitas Barbosa Filho em 6 agosto 2012 às 11:12

eh a mesma sim. Fiz umas modificacoes, montei este mesmo circuito e acrescentei um display 2x16 LCD

o problema eh que ele conta ateh certo numero e depois paralisa neste numero...mesmo girando o encoder...segue o codigo que estou usando. Voce pode ver se tem algum erro ou incoerencia?

/* Rotary encoder read example */
#define ENC_A 8
#define ENC_B 9
#define ENC_PORT PINB
#include <LiquidCrystal.h>
 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
 
void setup()
{
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("Ex_Encoder");

  /* 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()
{
 // set the cursor to column 0, line 1
 // (note: line 1 is the second row, since counting begins with 0):  
 lcd.setCursor(0, 1);
 
 static uint8_t counter = 0;      //this variable will be changed by encoder input
 int8_t tmpdata;
 /**/
  tmpdata = read_encoder();
  if( tmpdata ) {
    lcd.print("Count value: ");
    lcd.print(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 Jonatas Freitas em 6 agosto 2012 às 10:50

Verifique se a taxa de transferência da função  Serial.begin(). é a mesma do terminal (barra inferior, como no exemplo acima).

Comentário de Geraldo Freitas Barbosa Filho em 6 agosto 2012 às 7:33

alguem sabe dizer o que fazer quando nao aparece a mensagem start?

Comentário de Geraldo Freitas Barbosa Filho em 2 agosto 2012 às 11:20

estou usando um encoder rotativo 24/360 e um arduino leonardo..difere alguma coisa?quando compilo ele apenas incrementa ateh certo ponto e depois para...nao acontece nada quando giro o encoder..outra pergunta:deveria contar continuamente ou soh quando eu girasse?

Comentário de Jonatas Freitas em 2 agosto 2012 às 10:03

incrementa e decrementa o valor de acordo com o sentido.

É um contador de pulso.

Comentário de Geraldo Freitas Barbosa Filho em 2 agosto 2012 às 9:59

estou testando esse circuito agora..e ainda aprendendo pra que serve e como se uso o encoder...

entao...o que eh pra acontecer na pratica quando voce girar o encoder? aumenta a velocidade de contagem ou coisa parecida?

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço