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...
Comentar
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...
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
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...
opa acabei de desmontar um video cassete sony e tem um desse ja vou testar
Obrigado
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 )]);
}
Verifique se a taxa de transferência da função Serial.begin(). é a mesma do terminal (barra inferior, como no exemplo acima).
alguem sabe dizer o que fazer quando nao aparece a mensagem start?
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?
incrementa e decrementa o valor de acordo com o sentido.
É um contador de pulso.
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?
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por
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)