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.

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!