วันอาทิตย์ที่ 15 กรกฎาคม พ.ศ. 2561

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.


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();
}

ไม่มีความคิดเห็น:

แสดงความคิดเห็น