- Módulo sensor de velocidade óptico LM-393 com fenda infravermelha
- Medir a velocidade e distância percorrida para calcular a tarifa
Hoje, os medidores digitais estão substituindo os analógicos em todos os setores, sejam medidores de eletricidade ou taxímetros. A principal razão para isso é que os medidores analógicos têm partes mecânicas que tendem a se desgastar quando usados por muito tempo e não são tão precisos quanto os medidores digitais.
Um bom exemplo disso é o velocímetro analógico e o hodômetro usados em motos antigas para medir a velocidade e a distância percorrida. Eles têm peças especiais chamadas pinhão e arranjo de cremalheira em que um cabo é usado para girar o pino do velocímetro quando a roda é girada. Isso se desgastará ao usar por um longo período e também precisa de substituição e manutenção.
No medidor digital, em vez de usar peças mecânicas, alguns sensores como interruptor óptico ou sensor Hall são usados para calcular a velocidade e distância. Isso é mais preciso do que os medidores analógicos e não requer nenhuma manutenção por um longo período de tempo. Anteriormente, construímos muitos projetos de velocímetro digital usando diferentes sensores:
- Velocímetro DIY usando Arduino e aplicativo de processamento para Android
- Velocímetro digital e circuito de odômetro usando microcontrolador PIC
- Medição de velocidade, distância e ângulo para robôs móveis usando o sensor LM393 (H206)
Hoje, neste tutorial, faremos um protótipo de Medidor Digital de Tarifas de Táxi usando o Arduino. Este projeto calcula a velocidade e a distância percorrida pelo volante do táxi e as exibe continuamente em um display LCD 16x2. E com base na distância percorrida, ele gera o valor da tarifa quando pressionamos o botão.
A imagem abaixo mostra a configuração completa do Projeto de Medidor Digital de Táxi
Este protótipo possui um chassi de carro RC com um módulo sensor de velocidade e uma roda codificadora acoplada ao motor. Uma vez que a velocidade é medida, podemos medir a distância percorrida e encontrar o valor da tarifa pressionando o botão. Podemos definir a velocidade da roda usando o potenciômetro. Para saber mais sobre como usar o módulo Sensor de velocidade LM-393 com Arduino, siga o link. Vamos ver uma breve introdução ao módulo do sensor de velocidade.
Módulo sensor de velocidade óptico LM-393 com fenda infravermelha
Este é um módulo do tipo slot que pode ser usado para medir a velocidade de rotação das rodas codificadoras. Este módulo de sensor de velocidade funciona com base em um interruptor óptico tipo slot, também conhecido como sensor de fonte óptica. Este módulo requer uma tensão de 3,3 V a 5 V e produz saída digital. Portanto, ele pode ser conectado a qualquer microcontrolador.
O sensor de luz infravermelha consiste em uma fonte de luz (IR-LED) e um sensor fototransistor. Ambos são colocados com uma pequena lacuna entre eles. Quando um objeto é colocado entre a lacuna do LED IV e do fototransistor, ele interrompe o feixe de luz, fazendo com que o fototransistor pare de passar a corrente.
Assim, com este sensor é utilizado um disco com fenda (Roda Codificadora) que pode ser acoplado a um motor e quando a roda gira com o motor interrompe o feixe de luz entre o LED IV e o fototransistor que liga e desliga a saída (Criando Pulsos).
Portanto, ele produz uma saída ALTA quando há interrupção entre a fonte e o sensor (quando qualquer objeto é colocado no meio) e produz uma saída BAIXA quando não há nenhum objeto colocado. No módulo temos um LED para indicar a interrupção óptica causada.
Este módulo vem com LM393 Comparator IC que é usado para produzir sinais HIGH e LOW precisos na OUTPUT. Portanto, esse módulo às vezes é chamado de sensor de velocidade LM393.
Medir a velocidade e distância percorrida para calcular a tarifa
Para medir a velocidade de rotação, precisamos saber o número de slots presentes na roda codificadora. Eu tenho uma roda codificadora com 20 slots. Quando eles giram uma rotação completa, temos 20 pulsos na saída. Portanto, para calcular a velocidade, precisamos do número de pulsos produzidos por segundo.
Por exemplo
Se houver 40 pulsos em um segundo, então
Velocidade = Não. De pulsos / Nº de slots = 40/20 = 2 RPS (revolução por segundo)
Para calcular a velocidade em RPM (Revoluções por Minuto), multiplique por 60.
Velocidade em RPM = 2 X 60 = 120 RPM (Revoluções por Minuto)
Distância de medição
Medir a distância percorrida pela roda é muito simples. Antes de calcular a distância, a circunferência da roda deve ser conhecida.
Circunferência da roda = π * d
Onde d é o diâmetro da roda.
O valor de π é 3,14.
Eu tenho uma roda (roda de carro RC) de diâmetro 6,60 cm então a circunferência é (20,7 cm).
Assim, para calcular a distância percorrida, basta multiplicar o não dos pulsos detectados pela circunferência.
Distância percorrida = Circunferência da roda x (nº de pulsos / nº de slots)
Então, quando uma roda de circunferência de 20,7 cm leva 20 pulsos, que é uma rotação da roda do codificador, a distância percorrida pela roda é calculada por
Distância percorrida = 20,7 x (20/20) = 20,7 cm
Para calcular a distância em metros, divida a distância em valores de cm por 100.
Nota: Esta é uma roda de carro RC pequena, em tempo real os carros têm rodas maiores do que esta. Portanto, estou assumindo que a circunferência da roda é de 230 cm neste tutorial.
Calculando a tarifa com base na distância percorrida
Para obter o valor total da tarifa, multiplique a distância percorrida pela taxa de tarifa (valor / metro).
Timer1.initialize (1000000); Timer1.attachInterrupt (timerIsr);
Em seguida, anexe duas interrupções externas. A primeira interrupção transforma o pino 2 do Arduino em pino de interrupção e chama ISR (contagem) quando há RISING (LOW TO HIGH) detectado no pino 2. Este pino 2 é conectado à saída D0 do módulo sensor de velocidade.
E o segundo torna o pino 3 do Arduino como pino de interrupção e chama ISR (generatefare) quando HIGH é detectado no pino 3. Este pino é conectado ao botão de pressão com um resistor pull down.
attachInterrupt (digitalPinToInterrupt (2), contagem, RISING); attachInterrupt (digitalPinToInterrupt (3), generatefare , HIGH);
5. A seguir, vamos ver o ISR que usamos aqui:
ISR1- count () ISR é chamado quando ocorre um RISING (LOW TO HIGH) no pino 2 (conectado ao sensor de velocidade).
void count () // ISR para contagens do sensor de velocidade { counter ++; // aumenta o valor do contador em uma rotação ++; // Aumenta o valor de rotação em um atraso (10); }
ISR2- timerIsr () ISR é chamado a cada segundo e executa as linhas presentes dentro do ISR.
void timerIsr () { detachInterrupt (digitalPinToInterrupt (2)); Timer1.detachInterrupt (); lcd.clear (); velocidade flutuante = (contador / 20,0) * 60,0; rotações flutuantes = 230 * (rotação / 20); rotaçãoinm = rotações / 100; lcd.setCursor (0,0); lcd.print ("Dist (m):"); lcd.print (rotaçãoinm); lcd.setCursor (0,1); lcd.print ("Velocidade (RPM):"); lcd.print (velocidade); contador = 0; int analogip = analogRead (A0); int motorspeed = map (analogip, 0,1023,0,255); analogWrite (5, velocidade do motor); Timer1.attachInterrupt (timerIsr); attachInterrupt (digitalPinToInterrupt (2), contagem, RISING); }
Esta função contém as linhas que realmente separam primeiro o Timer1 e Interrupt pin2 porque temos instruções de impressão LCD dentro do ISR.
Para calcular a VELOCIDADE em RPM, usamos o código abaixo, onde 20.0 é o número de slots predefinidos na roda do codificador.
velocidade flutuante = (contador / 20,0) * 60,0;
E para calcular a distância o código abaixo é usado:
rotações flutuantes = 230 * (rotação / 20);
Aqui, a circunferência da roda é considerada como 230 cm (já que isso é normal para carros em tempo real)
Em seguida, converta a distância em m dividindo a distância por 100
rotaçãoinm = rotações / 100;
Depois disso, exibimos a VELOCIDADE e a DISTÂNCIA no display LCD
lcd.setCursor (0,0); lcd.print ("Dist (m):"); lcd.print (rotaçãoinm); lcd.setCursor (0,1); lcd.print ("Velocidade (RPM):"); lcd.print (velocidade);
IMPORTANTE: Temos que zerar o contador para 0 porque precisamos obter o número de sinais de mais detectados por segundo, então usamos esta linha
contador = 0;
Em seguida, leia o pino analógico A0 e converta-o em valor digital (0 a 1023) e mapeie posteriormente esses valores para 0-255 para a saída PWM (configuração da velocidade do motor) e, finalmente, escreva esses valores PWM usando a função analogWrite que está conectada ao ULN2003 Motor IC.
int analogip = analogRead (A0); int motorspeed = map (analogip, 0,1023,0,255); analogWrite (5, velocidade do motor);
ISR3: generatefare () ISR é usado para gerar o valor da tarifa com base na distância percorrida. Este ISR é chamado quando a interrupção do pino 3 é detectada como HIGH (quando o botão é pressionado). Esta função desconecta a interrupção no pino 2 e a interrupção do temporizador e, em seguida, limpa o LCD.
void generatefare () { detachInterrupt (digitalPinToInterrupt (2)); pino em 2 Timer1.detachInterrupt (); lcd.clear (); lcd.setCursor (0,0); lcd.print ("FARE Rs:"); rúpias flutuantes = rotaçãoinm * 5; lcd.print (rúpias); lcd.setCursor (0,1); lcd.print ("Rs 5 por metro"); }
Depois, essa distância percorrida é multiplicada por 5 (usei 5 para a taxa INR 5 / metro). Você pode mudar de acordo com seu desejo.
rúpias flutuantes = rotaçãoinm * 5;
Após calcular o valor da quantidade, exiba-o no display LCD conectado ao Arduino.
lcd.setCursor (0,0); lcd.print ("FARE Rs:"); lcd.print (rúpias); lcd.setCursor (0,1); lcd.print ("Rs 5 por metro");
O código completo e o vídeo de demonstração são fornecidos abaixo.
Você pode melhorar ainda mais este protótipo, aumentando a precisão, robustez e adicionando mais recursos como app Android, pagamento digital, etc. e desenvolvê-lo como um produto.