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.

Sensor de velocidade LM393

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).

Sensor de velocidade LM393 Pinagem

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:

Circuito Arduino Sensor de Velocidade LM393

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.

Disco Encoder

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:

Arduino - Motor de passo 28BYJ-48 e Sensor de velocidade

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!

5/5 - (1 vote)