17 fevereiro 2016

Como medir a rotação de um motor com o sensor de velocidade LM393

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 Arduino

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:

LM393 Speed Sensor Arduino


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.


Encoder Disc


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.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//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.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//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.

18 comentários:

  1. Eu tenho o Sensor de Velocidade (não o módulo completo); 1) o que teria de ser mudado no circuito para eu poder ligá-lo no Arduino?
    2) Era possível fazer um circuito com esse Sensor e um LCD para mostrar os dados? Obrigado

    ResponderExcluir
    Respostas
    1. Boa noite,

      Não fiz nenhum teste ainda apenas com o sensor, mas olhando o módulo, são poucos componentes que você vai precisar.

      Quanto ao LCD, atualmente eu recomendo um módulo I2C para display LCD, assim você economiza várias portas do Arduino.

      Abraço!

      Excluir
  2. Olá estou fazendo o diagrama do meu projeto no Fritzing. Estou utilizando este sensor, porém não consegui ele no Fritzing, poderia me ajudar ?

    ResponderExcluir
    Respostas
    1. Oi Alvanir,

      Eu também não consegui achar esse componente no Fritzing, então pedi para desenharem separadamente...

      Abraço!

      Excluir
  3. boa noite, onde acho os discos para acoplar nos motores?

    ResponderExcluir
    Respostas
    1. Oi Arthur,

      No Mercado Livre tem algumas opções de disco. Faça uma procura por "disco encoder".

      Abraço!

      Excluir
  4. boa noite. amigo gostei muito da sua explicação, porém gostaria de saber se você pode me ajudar a tirar uma dúvida. estou com um projeto aqui em que tenho que usar esse sensor para registrar a velocidade de um carro. minha pergunta é: se este disco ficar na roda do carro o sensor consegue fazer a leitura?

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Isso depende de testes, mas pela velocidade do sensor, creio que funcionaria sem problemas.

      Abraço!

      Excluir
  5. Ola. Teria como utilizar este sensor como um anemometro?

    ResponderExcluir
  6. Como ficaria o programa para Arduino Mega 2560?

    ResponderExcluir
    Respostas
    1. Oi Ricardo,

      Você pode usar o mesmo programa.

      Abraço!

      Excluir
  7. Olá, vi apenas exemplos usando a saída digital que seria apenas o pulso do sensor... Porém no caso da saída analógica a saída seria o que? Possuo um projeto que necessita da leitura da velocidade de forma analógica (0-X Volts)

    ResponderExcluir
  8. Boa noite,
    Gostaria de saber que tipo de sensor poderia utilizar para medir a velocidade de um carrinho sem motor.

    ResponderExcluir
  9. ola, uma duvida, eu tendo um sensor hall, tres fios na roda de um carro com sistema de airbag, o que teria que mudar no projeto acima para conseguir captar a velocidade da roda. Desde já obrigado :)

    ResponderExcluir
  10. Onde posso obter o arquivo (Fritzing encoder FC-03)?

    ResponderExcluir