- Infrarood gleuf optische LM-393 snelheidssensormodule
- Het meten van snelheid en afgelegde afstand om de ritprijs te berekenen
Tegenwoordig vervangen digitale meters analoge meters in elke sector, of het nu gaat om elektriciteitsmeter of taxikostenmeter. De belangrijkste reden hiervoor is dat analoge meters mechanische onderdelen hebben die bij langdurig gebruik de neiging hebben te slijten en dat ze niet zo nauwkeurig zijn als digitale meters.
Een goed voorbeeld hiervan is de analoge snelheidsmeter en kilometerteller die wordt gebruikt in oude motoren voor het meten van snelheid en afgelegde afstand. Ze hebben een speciaal onderdeel dat rondsel en tandheugel wordt genoemd, waarbij een kabel wordt gebruikt om de pin van de snelheidsmeter te draaien wanneer het wiel wordt gedraaid. Dit slijt bij langdurig gebruik en heeft ook vervanging en onderhoud nodig.
In een digitale meter worden in plaats van mechanische onderdelen, sommige sensoren zoals optische onderbreker of hall-sensor gebruikt om de snelheid en afstand te berekenen. Dit is nauwkeuriger dan de analoge meters en vereist geen onderhoud gedurende lange tijd. We hebben eerder veel digitale snelheidsmeterprojecten gebouwd met verschillende sensoren:
- DIY-snelheidsmeter met Arduino en Android-app verwerken
- Digitale snelheidsmeter en kilometertellercircuit met behulp van PIC-microcontroller
- Snelheids-, afstands- en hoekmeting voor mobiele robots met LM393-sensor (H206)
Vandaag maken we in deze tutorial een prototype van een digitale taxitariefmeter met Arduino. Dit project berekent de snelheid en afgelegde afstand door het wiel van de taxi en geeft deze continu weer op een 16x2 LCD-scherm. En op basis van de afgelegde afstand genereert het tariefbedrag wanneer we op de drukknop drukken.
Onderstaande afbeelding toont de volledige installatie van Digital Taxi Meter Project
Dit prototype heeft een RC-autochassis met een snelheidssensormodule en een encoderwiel dat aan de motor is bevestigd. Zodra de snelheid is gemeten, kunnen we de afgelegde afstand meten en het tariefbedrag vinden door op de knop te drukken. We kunnen de snelheid van het wiel instellen met een potentiometer. Volg de link voor meer informatie over het gebruik van de LM-393 Speed Sensor-module met Arduino. Laten we eens kijken naar een korte introductie van de snelheidssensormodule.
Infrarood gleuf optische LM-393 snelheidssensormodule
Dit is een sleufmodule die kan worden gebruikt voor het meten van de rotatiesnelheid van encoderwielen. Deze snelheidssensormodule werkt op basis van een optische onderbreker van het sleuftype, ook wel optische bronsensor genoemd. Deze module vereist een spanning van 3.3V tot 5V en produceert digitale output. Het kan dus op elke microcontroller worden aangesloten.
De infraroodlichtsensor bestaat uit een lichtbron (IR-LED) en een fototransistorsensor. Beide zijn geplaatst met een kleine opening ertussen. Wanneer een object tussen de opening van IR LED en fototransistor wordt geplaatst, zal het de lichtstraal onderbreken waardoor de fototransistor stopt met het passeren van stroom.
Dus met deze sensor wordt een sleufschijf (encoderwiel) gebruikt die aan een motor kan worden bevestigd en wanneer het wiel met de motor draait, onderbreekt het de lichtstraal tussen IR-LED en fototransistor die de uitvoer aan en uit maakt (pulsen creëren).
Het produceert dus een HOGE output wanneer er een onderbreking is tussen de bron en de sensor (wanneer een object ertussen wordt geplaatst) en produceert een LAGE output wanneer er geen object is geplaatst. In de module hebben we een LED om de veroorzaakte optische onderbreking aan te geven.
Deze module wordt geleverd met LM393 Comparator IC die wordt gebruikt om nauwkeurige HOGE en LAGE signalen te produceren bij de OUTPUT. Daarom wordt deze module ook wel LM393-snelheidssensor genoemd.
Het meten van snelheid en afgelegde afstand om de ritprijs te berekenen
Om de rotatiesnelheid te meten, moeten we het aantal slots in het encoderwiel weten. Ik heb een encoderwiel met 20 sleuven erin. Als ze een volledige omwenteling draaien, hebben we 20 pulsen aan de uitgang. Dus om de snelheid te berekenen, hebben we het aantal pulsen per seconde nodig.
Bijvoorbeeld
Als er 40 pulsen in één seconde zijn, dan
Snelheid = Nee. Aantal pulsen / aantal slots = 40/20 = 2RPS (revolutie per seconde)
Om de snelheid in RPM (omwentelingen per minuut) te berekenen, vermenigvuldigt u met 60.
Snelheid in RPM = 2 X 60 = 120 RPM (omwentelingen per minuut)
Afstand meten
Het meten van de door het wiel afgelegde afstand is zo eenvoudig. Voordat u de afstand berekent, moet de omtrek van het wiel bekend zijn.
Omtrek van het wiel = π * d
Waar d de diameter van het wiel is.
Waarde van π is 3,14.
Ik heb een wiel (RC autowiel) met een diameter van 6,60 cm dus de omtrek is (20,7 cm).
Dus om de afgelegde afstand te berekenen, vermenigvuldigt u het aantal gedetecteerde pulsen met de omtrek.
Afgelegde afstand = omtrek van wiel x (aantal pulsen / aantal slots)
Dus als een wiel met omtrek 20,7 cm 20 pulsen nodig heeft, dat is één rotatie van het encoderwiel, dan wordt de afstand die door het wiel wordt afgelegd berekend door
Afgelegde afstand = 20,7 x (20/20) = 20,7 cm
Om de afstand in meter te berekenen, deelt u de afstand in cm door 100.
Opmerking: dit is een klein RC-autowiel, in realtime hebben auto's grotere wielen dan dit. Dus ik ga er in deze tutorial van uit dat de omtrek van het wiel 230 cm is.
Het tarief berekenen op basis van de afgelegde afstand
Om het totale tarief te krijgen, vermenigvuldigt u de afgelegde afstand met het tarief (bedrag / meter).
Timer1. Initialiseren (1000000); Timer1.attachInterrupt (timerIsr);
Koppel vervolgens twee externe interrupts. Eerste interrupt maakt de Arduino pin 2 als interrupt pin en roept ISR (count) op als er RISING (LOW TO HIGH) gedetecteerd wordt op pin 2. Deze pin 2 is verbonden met de D0 output van de snelheidssensormodule.
En de tweede maakt de Arduino pin 3 als interrupt pin en roept ISR (generatefare) op wanneer HIGH wordt gedetecteerd op pin3. Deze pin is met een pull-down weerstand verbonden met de drukknop.
attachInterrupt (digitalPinToInterrupt (2), count, RISING); attachInterrupt (digitalPinToInterrupt (3), generatefare , HIGH);
5. Laten we nu eens kijken naar de ISR die we hier hebben gebruikt:
ISR1-count () ISR wordt aangeroepen wanneer een RISING (LOW TO HIGH) plaatsvindt op pin 2 (verbonden met snelheidssensor).
void count () // ISR voor tellingen van de snelheidssensor { counter ++; // verhoog de tellerwaarde met één rotatie ++; // Verhoog de rotatiewaarde met één vertraging (10); }
ISR2- timerIsr () ISR wordt elke seconde aangeroepen en voert de lijnen uit die aanwezig zijn in de ISR.
leegte timerIsr () { detachInterrupt (digitalPinToInterrupt (2)); Timer1.detachInterrupt (); lcd.clear (); vlottersnelheid = (teller / 20,0) * 60,0; vlotterrotaties = 230 * (rotatie / 20); rotatieinm = rotaties / 100; lcd.setCursor (0,0); lcd.print ("Dist (m):"); lcd.print (rotatieinm); lcd.setCursor (0,1); lcd.print ("Snelheid (RPM):"); lcd.print (snelheid); teller = 0; int analogip = analogRead (A0); int motorspeed = kaart (analogip, 0,1023,0,255); analogWrite (5, motorsnelheid); Timer1.attachInterrupt (timerIsr); attachInterrupt (digitalPinToInterrupt (2), count, RISING); }
Deze functie bevat de regels die eigenlijk eerst de Timer1 en Interrupt pin2 als eerste loskoppelen, omdat we LCD-afdrukinstructies in de ISR hebben.
Voor het berekenen van SPEED in RPM gebruiken we onderstaande code, waarbij 20.0 het aantal slots is dat is ingesteld in het encoderwiel.
vlottersnelheid = (teller / 20,0) * 60,0;
En voor het berekenen van de afstand wordt onderstaande code gebruikt:
vlotterrotaties = 230 * (rotatie / 20);
Hier wordt aangenomen dat de omtrek van het wiel 230 cm is (aangezien dit normaal is voor realtime auto's)
Converteer vervolgens de afstand in m door de afstand te delen door 100
rotatieinm = rotaties / 100;
Daarna tonen we de SPEED en DISTANCE op het LCD-scherm
lcd.setCursor (0,0); lcd.print ("Dist (m):"); lcd.print (rotatieinm); lcd.setCursor (0,1); lcd.print ("Snelheid (RPM):"); lcd.print (snelheid);
BELANGRIJK: we moeten de teller terugzetten op 0 omdat we het aantal plussen per seconde moeten detecteren, dus we gebruiken deze regel
teller = 0;
Lees vervolgens de analoge pin A0 en converteer deze naar een digitale waarde (0 tot 1023) en wijs die waarden verder toe aan 0-255 voor PWM-uitvoer (Instelling motortoerental) en schrijf ten slotte die PWM-waarden met behulp van de analogWrite- functie die is verbonden met de ULN2003 Motor IC.
int analogip = analogRead (A0); int motorspeed = kaart (analogip, 0,1023,0,255); analogWrite (5, motorsnelheid);
ISR3: generatefare () ISR wordt gebruikt om het tariefbedrag te genereren op basis van de afgelegde afstand. Deze ISR wordt aangeroepen wanneer onderbrekingspin 3 HOOG wordt gedetecteerd (wanneer drukknop wordt ingedrukt). Deze functie koppelt de interrupt op pin 2 en de timer-interrupt los en wist vervolgens het LCD-scherm.
void generatefare () { detachInterrupt (digitalPinToInterrupt (2)); pin op 2 Timer1.detachInterrupt (); lcd.clear (); lcd.setCursor (0,0); lcd.print ("FARE Rs:"); zwevende roepies = rotatieinm * 5; lcd.print (roepies); lcd.setCursor (0,1); lcd.print ("Rs 5 per meter"); }
Daarna wordt de afgelegde afstand vermenigvuldigd met 5 (ik heb 5 gebruikt voor het tarief INR 5 / meter). U kunt naar wens veranderen.
zwevende roepies = rotatieinm * 5;
Na het berekenen van de hoeveelheid waarde, geeft u deze weer op het LCD-scherm dat is aangesloten op Arduino.
lcd.setCursor (0,0); lcd.print ("FARE Rs:"); lcd.print (roepies); lcd.setCursor (0,1); lcd.print ("Rs 5 per meter");
Volledige code en demonstratievideo wordt hieronder gegeven.
U kunt dit prototype verder verbeteren door de nauwkeurigheid en robuustheid te vergroten en meer functies toe te voegen, zoals Android-app, digitale betaling enz. En het als een product te ontwikkelen.