Como usar motor DC com encoder no Arduino

Neste post vamos mostrar um motor muito usado em projetos de robótica, que é um motor DC com encoder embutido. Esse tipo de motor permite que você possa calcular a distância percorrida pelo robô, ou ajustar a velocidade do motor de acordo com a leitura de sensores.

Motor DC com encoder embutido

O motor que vamos utilizar é o motor DC 6V com encoder embutido, o mesmo mostrado na imagem acima. Ele tem uma pequena placa na parte de trás onde estão instalados os sensores hall que vão ler as informações relativas à rotação do motor.

São 2 sensores na placa, e com ele podemos medir não só a velocidade como também o sentido de rotação. Isso pode ser muito útil na hora de configurar o robô para evitar obstáculos, virar para direita/esquerda, retornar, etc.

Conexões do motor DC com encoder embutido

Essa placa tem um conector com 6 pinos, onde vamos ligar tanto a alimentação do motor (pinos M- e M+), a alimentação dos sensores do encoder (GND e 3.3V) e onde teremos o sinal de saída, nos pinos C1 (canal A do encoder) e C2 (canal B do encoder):

Assim, precisamos de apenas dois pinos do Arduino para ler as informações dos sensores do encoder. O pino C1 será ligado ao pino 2 do Arduino (interrupção 0), e o pino C2 será ligado ao pino digital 4.

Ligação do Motor DC 6V 210 RPM no Arduino

Como esse motor exige mais corrente do que a suportada pelos pinos do Arduino, vamos usar no nosso circuito um módulo ponte H L298N (abaixo), controlando o sentido de rotação com um potenciômetro de 10K ligado ao pino digital A0. 

Ligamos então o motor em uma das saídas da ponte H (OUT1 e OUT2), os pinos GND e 3.3V da placa do encoder nos pinos correspondentes no Arduino, a saída C1 no pino digital 2, e a saída C2 no pino digital 4:

Os pinos 6 e 7 controlam o sentido de rotação do motor; sentido horário (pino 6 HIGH e pino 7 LOW) ou anti-horário (pino 6 LOW e pino 7 HIGH).

Programa motor com arduino

O programa abaixo não utiliza bibliotecas específicas, efetuando a leitura dos pinos 2 (interrupção 0 do Arduino, utilizado para a contagem de pulsos) e  4 (usado para identificar o sentido de rotação do motor). 

//Programa: Motor DC com encoder
//Autor: Arduino e Cia

const byte Encoder_C1 = 2;
const byte Encoder_C2 = 4;
byte Encoder_C1Last;
int duracao;
boolean Direcao;

//Pinos de ligacao ponte H L298N
#define pino_motor1 6
#define pino_motor2 7

void setup()
{
  Serial.begin(57600);
  //Pino potenciometro
  pinMode(A0, INPUT);
  //Definicao pinos ponte H
  pinMode(pino_motor1, OUTPUT);
  pinMode(pino_motor2, OUTPUT);
  //Definicao do encoder
  EncoderInit();
}

void loop()
{
  Serial.print("Pulso: ");
  Serial.print(duracao);
  int valor = analogRead(A0);
  if (valor >= 512)
  {
    digitalWrite(pino_motor1, LOW);
    digitalWrite(pino_motor2, LOW);
    //delay(1000);
    digitalWrite(pino_motor1, LOW);
    digitalWrite(pino_motor2, HIGH);
    Serial.println(" Sentido: Anti-horario");
  }
  else
  {
    digitalWrite(pino_motor1, HIGH);
    digitalWrite(pino_motor2, LOW);
    Serial.println(" Sentido: Horario");
  }
  duracao = 0;
  delay(100);
}

void EncoderInit()
{
  pinMode(Encoder_C2, INPUT);
  attachInterrupt(0, calculapulso, CHANGE);
}

void calculapulso()
{
  int Lstate = digitalRead(Encoder_C1);
  if ((Encoder_C1Last == LOW) && Lstate == HIGH)
  {
    int val = digitalRead(Encoder_C2);
    if (val == LOW && Direcao)
    {
      Direcao = false; //Reverse
    }
    else if (val == HIGH && !Direcao)
    {
      Direcao = true;  //Forward
    }
  }
  Encoder_C1Last = Lstate;

  if (!Direcao)  duracao++;
  else  duracao--;
}

Conforme o valor enviado pelo potenciômetro ligado na porta analógica A0, o sentido de rotação do motor é alterado. Essa alteração pode ser acompanhada no Serial Monitor, onde também é mostrada a quantidade de pulsos lida pelo encoder. Não esqueça de alterar a velocidade da serial para 57600:

Experimente incorporar ao circuito um potenciômetro para controlar também a velocidade do motor, assim você pode acompanhar a variação na quantidade de pulsos lidos.

Gostou? Confira outros posts usando motores aqui mesmo no Arduino e Cia!

3.8/5 - (6 votos)

Related posts

Controlando servo motor com o Motor Shield L293D

by Arduino e Cia
10 anos ago

Controlando motor de passo 28BYJ-48 utilizando CustomStepper

by Arduino e Cia
11 anos ago

Motor de passo 28BYJ-48 com arduino

by Arduino e Cia
11 anos ago
Sair da versão mobile