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!