Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Como funciona o codificador rotativo e como usá-lo com o Arduino


Neste tutorial vamos aprender como funciona o codificador rotativo e como usá-lo com o Arduino. Você pode assistir ao vídeo a seguir ou ler o tutorial escrito abaixo.

Visão geral


Um codificador rotativo é um tipo de sensor de posição que é usado para determinar a posição angular de um eixo rotativo. Gera um sinal elétrico, analógico ou digital, de acordo com o movimento de rotação.

Existem muitos tipos diferentes de codificadores rotativos que são classificados por sinal de saída ou tecnologia de detecção. O codificador rotativo específico que usaremos neste tutorial é um codificador rotativo incremental e é o sensor de posição mais simples para medir a rotação.

Este codificador rotativo também é conhecido como codificador de quadratura ou codificador rotativo relativo e sua saída é uma série de pulsos de onda quadrada.

Como o Rotary Encoder funciona


Vamos dar uma olhada mais de perto no codificador e ver seu princípio de funcionamento. Veja como os pulsos de onda quadrada são gerados:O codificador possui um disco com zonas de contato uniformemente espaçadas que são conectadas ao pino comum C e dois outros pinos de contato separados A e B, conforme ilustrado abaixo.

Quando o disco começar a girar passo a passo, os pinos A e B começarão a fazer contato com o pino comum e os dois sinais de saída de onda quadrada serão gerados de acordo.

Qualquer uma das duas saídas pode ser usada para determinar a posição girada se contarmos apenas os pulsos do sinal. No entanto, se quisermos determinar também a direção de rotação, precisamos considerar os dois sinais ao mesmo tempo.

Podemos notar que os dois sinais de saída estão deslocados a 90 graus fora de fase um do outro. Se o encoder estiver girando no sentido horário, a saída A estará à frente da saída B.

Então, se contarmos os passos cada vez que o sinal muda, de Alto para Baixo ou de Baixo para Alto, podemos notar que nesse momento os dois sinais de saída têm valores opostos. Vice-versa, se o encoder estiver girando no sentido anti-horário, os sinais de saída terão valores iguais. Portanto, considerando isso, podemos programar facilmente nosso controlador para ler a posição do encoder e o sentido de rotação.

Exemplo de codificador rotativo Arduino


Vamos fazer um exemplo prático disso usando o Arduino. O módulo específico que vou usar para este exemplo vem em uma placa de fuga e tem cinco pinos. O primeiro pino é a saída A, o segundo pino é a saída B, o terceiro pino é o pino Button e, claro, os outros dois pinos são o VCC e o pino GND.

Podemos conectar os pinos de saída a qualquer pino digital da placa Arduino.

Você pode obter os componentes necessários para este tutorial do Arduino nos links abaixo:
  • Módulo de codificador rotativo……………….
  • Placa Arduino ………………………………
  • Breadboard e jump wires ……… 

Código-fonte


Segue o código do Arduino:
/*     Arduino Rotary Encoder Tutorial
 *      
 *  by Dejan Nedelkovski, www.HowToMechatronics.com
 *  
 */
 
 #define outputA 6
 #define outputB 7

 int counter = 0; 
 int aState;
 int aLastState;  

 void setup() { 
   pinMode (outputA,INPUT);
   pinMode (outputB,INPUT);
   
   Serial.begin (9600);
   // Reads the initial state of the outputA
   aLastState = digitalRead(outputA);   
 } 

 void loop() { 
   aState = digitalRead(outputA); // Reads the "current" state of the outputA
   // If the previous and the current state of the outputA are different, that means a Pulse has occured
   if (aState != aLastState){     
     // If the outputB state is different to the outputA state, that means the encoder is rotating clockwise
     if (digitalRead(outputB) != aState) { 
       counter ++;
     } else {
       counter --;
     }
     Serial.print("Position: ");
     Serial.println(counter);
   } 
   aLastState = aState; // Updates the previous state of the outputA with the current state
 }Code language: Arduino (arduino)

Descrição do código: Então primeiro precisamos definir os pinos aos quais nosso codificador está conectado e definir algumas variáveis ​​necessárias para o programa. Na seção de configuração precisamos definir os dois pinos como entradas, iniciar a comunicação serial para imprimir os resultados no monitor serial, assim como ler o valor inicial da saída A e colocar o valor na variável aLastState.

Então, na seção de loop, lemos a saída A novamente, mas agora colocamos o valor na variável aState. Portanto, se girarmos o codificador e um pulso for gerado, esses dois valores serão diferentes e a primeira declaração “if” se tornará verdadeira. Logo em seguida, usando a segunda instrução “if”, determinamos a direção de rotação. Se o estado da saída B diferir do estado da saída A, o contador será aumentado em um, caso contrário, será diminuído. Ao final, após imprimir os resultados no monitor serial, precisamos atualizar a variável aLastState com a variável aState.

Isso é tudo o que precisamos para este exemplo. Se fizer o upload do código, inicie o Serial Monitor e comece a girar o codificador, começaremos a obter os valores no serial monitor. O módulo específico que tenho faz 30 contagens a cada ciclo completo.

Saiba mais:Sensor Ultrassônico HC-SR04 e Arduino – Guia Completo

Exemplo 2 – Controlando um motor de passo usando um codificador rotativo


Além deste exemplo básico, fiz mais um exemplo de controle de posição de um motor de passo usando o codificador rotativo.

Aqui está o código-fonte deste exemplo:
/*     Stepper Motor using a Rotary Encoder
 *      
 *  by Dejan Nedelkovski, www.HowToMechatronics.com
 *  
 */

 #include <LiquidCrystal.h> // includes the LiquidCrystal Library 
 LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7) 

// defines pins numbers
 #define stepPin 8 
 #define dirPin  9
 #define outputA 10
 #define outputB 11

 int counter = 0;
 int angle = 0; 
 int aState;
 int aLastState;  
 
void setup() {
  // Sets the two pins as Outputs
  pinMode(stepPin,OUTPUT); 
  pinMode(dirPin,OUTPUT);
  pinMode (outputA,INPUT);
  pinMode (outputB,INPUT);
  
  aLastState = digitalRead(outputA);
  lcd.begin(16,2); // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display } 

}
void loop() {

  aState = digitalRead(outputA);
  
  if (aState != aLastState){     
     if (digitalRead(outputB) != aState) { 
       counter ++;
       angle ++;
       rotateCW();  
     }
     else {
       counter--;
       angle --;
       rotateCCW(); 
     }
     if (counter >=30 ) {
      counter =0;
     }
     
     lcd.clear();
     lcd.print("Position: ");
     lcd.print(int(angle*(-1.8)));
     lcd.print("deg"); 
     lcd.setCursor(0,0);
     
   }
  aLastState = aState;
}

void rotateCW() {
  digitalWrite(dirPin,LOW);
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(2000);
    digitalWrite(stepPin,LOW);
    delayMicroseconds(2000); 
}
void rotateCCW() {
  digitalWrite(dirPin,HIGH);
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(2000);
    digitalWrite(stepPin,LOW);
    delayMicroseconds(2000);   
}
Code language: Arduino (arduino)

Sinta-se à vontade para fazer qualquer pergunta na seção de comentários abaixo.

Processo de manufatura

  1. C# Queue com Exemplos:O que é C# Queue e como usar?
  2. Controle do Servo Motor com Arduino e MPU6050
  3. Roda de medição simples DIY com codificador rotativo
  4. u-blox LEA-6H 02 Módulo GPS com Arduino e Python
  5. Como ler a temperatura e umidade em Blynk com DHT11
  6. Quão fácil é usar um termistor ?!
  7. Como fazer música com um Arduino
  8. Como usar NMEA-0183 com Arduino
  9. Como usar o Modbus com Arduino
  10. Reconhecimento de fala com Arduino e BitVoicer Server