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

Domine Encoders Rotativos com Arduino: Como Funcionam e Integração Passo a Passo

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

Visão Geral

Um encoder rotativo é um tipo de sensor de posição usado para determinar a posição angular de um eixo rotativo. Ele gera um sinal elétrico, analógico ou digital, de acordo com o movimento rotacional.

Domine Encoders Rotativos com Arduino: Como Funcionam e Integração Passo a Passo

Existem muitos tipos diferentes de encoders rotativos, classificados por Sinal de Saída ou Tecnologia de Sensoriamento. O encoder rotativo específico que usaremos neste tutorial é um encoder rotativo incremental e é o sensor de posição mais simples para medir rotação.

Domine Encoders Rotativos com Arduino: Como Funcionam e Integração Passo a Passo

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

Como o Encoder Rotativo Funciona

Vamos examinar mais de perto o encoder e ver seu princípio de funcionamento. Aqui está como os pulsos de onda quadrada são gerados: O encoder tem um disco com zonas de contato espaçadas uniformemente que estão conectadas ao pino comum C e a dois outros pinos de contato separados A e B, como ilustrado abaixo.

Domine Encoders Rotativos com Arduino: Como Funcionam e Integração Passo a Passo

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 rotacionada se apenas contarmos os pulsos do sinal. No entanto, se quisermos determinar a direção de rotação também, precisamos considerar ambos os sinais ao mesmo tempo.

Podemos notar que os dois sinais de saída estão deslocados em 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.

Domine Encoders Rotativos com Arduino: Como Funcionam e Integração Passo a Passo

Então, se contarmos os passos cada vez que o sinal muda, de Alto para Baixo ou de Baixo para Alto, podemos notar que, naquele 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 têm valores iguais. Considerando isso, podemos facilmente programar nosso controlador para ler a posição do encoder e a direção de rotação.

Exemplo Arduino com Encoder Rotativo

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

Domine Encoders Rotativos com Arduino: Como Funcionam e Integração Passo a Passo

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

Você pode obter os componentes necessários para este tutorial Arduino nos links abaixo:

  • Módulo Encoder Rotativo
  • Placa Arduino
  • Protoboard e Jumpers

Código Fonte

Aqui está o código Arduino:

/* Tutorial Arduino Encoder Rotativo
 * por 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);
  // Lê o estado inicial da saída A
  aLastState = digitalRead(outputA);
}

void loop() {
  aState = digitalRead(outputA); // Lê o estado "atual" da saída A

  // Se o estado anterior e o atual da saída A são diferentes, significa que ocorreu um pulso
  if (aState != aLastState) {
    // Se o estado da saída B é diferente do estado da saída A, significa que o encoder está girando no sentido horário
    if (digitalRead(outputB) != aState) {
      counter++;
    } else {
      counter--;
    }
    Serial.print("Posição: ");
    Serial.println(counter);
  }
  aLastState = aState; // Atualiza o estado anterior da saída A com o estado atual
}

Descrição do código: Primeiro, definimos os pinos aos quais nosso encoder está conectado e definimos algumas variáveis necessárias para o programa. Na seção setup, definimos os dois pinos como entradas, iniciamos a comunicação serial para imprimir os resultados no monitor serial, bem como lemos o valor inicial da saída A e colocamos o valor na variável aLastState.

Então, na seção loop, lemos a saída A novamente, mas agora colocamos o valor na variável aState. Se girarmos o encoder e um pulso for gerado, esses dois valores diferirão e a primeira declaração "if" se tornará verdadeira. Logo após, usando a segunda declaraçã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. No 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 fizermos upload do código, iniciarmos o Monitor Serial e começarmos a girar o encoder, começaremos a obter os valores no monitor serial. 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 Encoder Rotativo

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

Domine Encoders Rotativos com Arduino: Como Funcionam e Integração Passo a Passo

Aqui está o código fonte deste exemplo:

/* Motor de Passo usando Encoder Rotativo
 * por Dejan Nedelkovski, www.HowToMechatronics.com
 */
#include <LiquidCrystal.h> // inclui a biblioteca LiquidCrystal
LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // Cria objeto LC. Parâmetros: (rs, enable, d4, d5, d6, d7)

// define pinos
#define stepPin 8
#define dirPin 9
#define outputA 10
#define outputB 11

int counter = 0;
int angle = 0;
int aState;
int aLastState;

void setup() {
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  pinMode(outputA, INPUT);
  pinMode(outputB, INPUT);
  aLastState = digitalRead(outputA);
  lcd.begin(16,2); // Inicializa a interface para a tela LCD
}

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("Posição: ");
    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);
}

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

Processo de manufatura

  1. Dominando Queues em C#: Enqueue, Dequeue e Operações First-In-First-Out Explicadas
  2. Arduino e MPU6050: Controle Preciso de Servomotores SG90 e MG996R
  3. Roda de Medição Precisa DIY com Arduino Nano e Encoder Rotativo
  4. Módulo GPS u-blox LEA‑6H 02: Guia de Integração com Arduino e Python
  5. Leitura de Temperatura e Umidade com DHT11 no Blynk – Tutorial Arduino Passo a Passo
  6. Usando Termistor Facilmente: Guia Passo a Passo com Arduino
  7. Criar Tons Musicais com Arduino: Um Guia Passo a Passo
  8. Conectando Arduino ao NMEA‑0183: Guia Passo a Passo
  9. Dominando Modbus no Arduino: Guia Passo a Passo
  10. Projeto LED Controlado por Voz: Arduino Micro + BitVoicer Server para Reconhecimento de Fala