Medir a velocidade de um motor pode ser muito útil em projetos de robótica, e você pode fazer isso utilizando o sensor de velocidade encoder LM393. Com ele você pode medir a rotação de motores, calcular a velocidade de robôs, definir limites de deslocamento, entre outras aplicações.

Esse módulo pode também ser utilizado para contagem de pulsos ou como chave de fim de curso. Ele utiliza o chip comparador LM393 (datasheet), e na sua extremidade tem um optointerruptor com um vão de 5 mm no qual você pode utilizar um disco encoder ou algum outro dispositivo para interromper o feixe de luz.
Módulo sensor de velocidade LM393
O módulo possui 4 pinos, sendo dois de alimentação (3 à 5V e GND), uma saída digital (DO) e uma analógica (A0).
O optointerruptor MOCH22A tem de um lado um led infravermelho, e no outro lado um fototransistor. Quando o feixe de luz infravermelha é interrompido, a saída digital D0 envia o sinal 1, caso contrário, o saída permanece em nível 0.
Vamos testar esse sensor utilizando dois programas: um para medir a velocidade de um motor, e outro como uma chave de fim de curso. Nesses dois exemplos vamos usar apenas a saída digital D0 do módulo.
Medindo a rotação de um motor
Para medir a rotação de um motor, ligue o sensor de velocidade no Arduino com o pino D0 ligado à porta digital 2:
Para testar o circuito, usamos um disco encoder ligado ao motor. O disco possui várias “aberturas” por onde o feixe de luz vai passar e gerar um pulso na saída digital.
O disco que estamos usando tem 20 aberturas, e esse número deve ser colocado no programa (linha 11), que vai usar essa informação para calcular a rotação do motor.
//Programa: Sensor de velocidade Arduino LM393
//Autor: Arduino e Cia
//Pino ligado ao pino D0 do sensor
int pino_D0 = 2;
int rpm;
volatile byte pulsos;
unsigned long timeold;
//Altere o numero abaixo de acordo com o seu disco encoder
unsigned int pulsos_por_volta = 20;
void contador()
{
//Incrementa contador
pulsos++;
}
void setup()
{
Serial.begin(9600);
//Pino do sensor como entrada
pinMode(pino_D0, INPUT);
//Interrupcao 0 - pino digital 2
//Aciona o contador a cada pulso
attachInterrupt(0, contador, FALLING);
pulsos = 0;
rpm = 0;
timeold = 0;
}
void loop()
{
//Atualiza contador a cada segundo
if (millis() - timeold >= 1000)
{
//Desabilita interrupcao durante o calculo
detachInterrupt(0);
rpm = (60 * 1000 / pulsos_por_volta ) / (millis() - timeold) * pulsos;
timeold = millis();
pulsos = 0;
//Mostra o valor de RPM no serial monitor
Serial.print("RPM = ");
Serial.println(rpm, DEC);
//Habilita interrupcao
attachInterrupt(0, contador, FALLING);
}
}
Carregue o programa no Arduino e utilize o serial monitor para visualizar a velocidade de rotação do motor.
Utilizando o módulo como chave de fim de curso
Você pode utilizar esse módulo também como chave de fim de curso, para indicar o correto posicionamento de um motor ou alguma estrutura, como por exemplo uma porta, janela, uma guia linear ou outra estrutura móvel.
Nesse caso, o sensor de velocidade funciona como se fosse uma chave liga/desliga, fazendo com que o programa execute uma rotina específica caso o feixe de luz do optointerruptor seja bloqueado.
Testamos essa configuração acrescentando no circuito anterior um motor de passo 28BYJ-48:
O programa usa a biblioteca Customstepper (download), que já usei anteriormente no post Controlando motor de passo 28BYJ-48 utilizando CustomStepper.
É feita uma monitoração simples da porta digital 2, e cada vez que é recebido o valor 1, a variável sentido tem o seu valor invertido.
//Programa: Sensor de velocidade LM393 - Chave de fim de curso
//Autor: Arduino e Cia
#include <CustomStepper.h>
//Pino ligado ao pino D0 do sensor
int pino_D0 = 2;
//Define os parametros de ligacao do motor de passo
CustomStepper stepper(8, 9, 10, 11, (byte[])
{
8, B1000, B1100, B0100,
B0110, B0010, B0011, B0001, B1001
}, 4075.7728395, 12, CW);
int sentido = 0;
void setup()
{
Serial.begin(9600);
//Pino do sensor como entrada
pinMode(pino_D0, INPUT);
//Define a velocidade do motor
stepper.setRPM(12);
//Define o numero de passos por rotacao
stepper.setSPR(4075.7728395);
}
void loop()
{
int valor = digitalRead(pino_D0);
if (valor != 0)
{
while (digitalRead(pino_D0) != 0)
{
delay(100);
}
//Inverte o sentido de rotacao
sentido = !sentido;
}
delay(1);
if (sentido == 0)
{
//Gira motor no sentido horario
stepper.setDirection(CW);
stepper.rotate();
}
if (sentido == 1)
{
//Gira motor no sentido anti-horario
stepper.setDirection(CCW);
stepper.rotate();
}
stepper.run();
}
Usando o programa acima, à cada vez que o feixe de luz do sensor é interrompido, o sentido de rotação do motor é alterado.
Gostou? Confira outros posts usando encoder aqui mesmo no Arduino e Cia!