- Modul senzor de viteză LM-393 optic cu slot în infraroșu
- Măsurarea vitezei și a distanței parcurse pentru a calcula tariful
Astăzi, contoarele digitale înlocuiesc contoarele analogice din fiecare sector, fie că este vorba de contorul său de energie electrică sau de contorul de taxi. Motivul principal al acestui fapt este că contoarele analogice au părți mecanice care tind să se uzeze atunci când sunt utilizate mult timp și nu sunt la fel de exacte ca contoare digitale.
Un exemplu bun în acest sens este vitezometrul și contorul de viteze analogice care sunt utilizate la motocicletele vechi pentru măsurarea vitezei și a distanței parcurse. Au o piesă specială numită aranjament pinion și rack în care un cablu este utilizat pentru a roti pinul vitezometrului atunci când roata este rotită. Acest lucru se va uza atunci când se utilizează pentru o perioadă lungă de timp și, de asemenea, necesită înlocuire și întreținere.
În contorul digital, în loc să se utilizeze piese mecanice, unii senzori cum ar fi întrerupătorul optic sau senzorul de hol sunt folosiți pentru a calcula viteza și distanța. Aceasta este mai precisă decât contoarele analogice și nu necesită nicio întreținere pentru o perioadă lungă de timp. Am construit anterior mai multe proiecte de vitezometru digital folosind diferiți senzori:
- Vitezometru DIY utilizând aplicația Android Arduino și Processing
- Vitezometru digital și circuit de kilometraj folosind microcontrolerul PIC
- Măsurarea vitezei, distanței și unghiului pentru roboții mobili utilizând senzorul LM393 (H206)
Astăzi, în acest tutorial vom realiza un prototip al unui contor de taxe digitale pentru taxi folosind Arduino. Acest proiect calculează viteza și distanța parcursă de roata taxiului și îl afișează continuu pe afișajul LCD de 16x2. Și pe baza distanței parcurse, generează suma tarifului atunci când apăsăm butonul.
Imaginea de mai jos prezintă configurarea completă a proiectului Digital Taxi Meter
Acest prototip are un șasiu auto RC cu un modul senzor de viteză și o roată codificatoare atașată la motor. Odată măsurată viteza, putem măsura distanța parcursă și putem găsi valoarea tarifului apăsând butonul. Putem seta viteza roții folosind potențiometrul. Pentru a afla mai multe despre utilizarea modulului senzor de viteză LM-393 cu Arduino, urmați linkul. Să vedem o scurtă introducere a modulului senzor de viteză.
Modul senzor de viteză LM-393 optic cu slot în infraroșu
Acesta este un modul de tip slot care poate fi utilizat pentru măsurarea vitezei de rotație a roților codificatoare. Acest modul de senzor de viteză funcționează pe baza întrerupătorului optic de tip slot, cunoscut și sub numele de senzor de sursă optică. Acest modul necesită o tensiune de 3,3V la 5V și produce ieșire digitală. Deci poate fi interfațat cu orice microcontroler.
Senzorul de lumină cu infraroșu este format din sursă de lumină (IR-LED) și un senzor de fototranzistor. Ambele sunt plasate cu un mic spațiu între ele. Când un obiect este plasat între spațiul dintre LED-ul IR și fototranzistor, acesta va întrerupe fasciculul de lumină, provocând ca fototranzistorul să nu mai treacă curentul.
Astfel, cu acest senzor se folosește un disc cu fante (roata codificatorului) care poate fi atașat la un motor și atunci când roata se rotește cu motorul întrerupe fasciculul de lumină dintre LED-ul IR și fototranzistorul care face ieșirea Pornit și Oprit (Crearea impulsurilor).
Astfel, produce ieșire HIGH atunci când există întrerupere între sursă și senzor (când un obiect este plasat între ele) și produce ieșire LOW când nu există niciun obiect plasat. În modul avem un LED pentru a indica întreruperea optică cauzată.
Acest modul vine cu IC comparator LM393 care este utilizat pentru a produce semnale precise HIGH și LOW la OUTPUT. Astfel, acest modul este uneori numit ca senzor de viteză LM393.
Măsurarea vitezei și a distanței parcurse pentru a calcula tariful
Pentru a măsura viteza de rotație trebuie să cunoaștem numărul de sloturi prezente în roata codificatorului. Am o roată codificatoare cu 20 de sloturi în ea. Când se rotesc o rotație completă, avem 20 de impulsuri la ieșire. Deci, pentru a calcula viteza, avem nevoie de numărul de impulsuri produse pe secundă.
De exemplu
Dacă există 40 de impulsuri într-o secundă, atunci
Viteza = Noo. De impulsuri / Nr. De sloturi = 40/20 = 2RPS (Revoluție pe secundă)
Pentru calcularea vitezei în RPM (Revoluții pe minut) înmulțiți cu 60.
Viteza în RPM = 2 X 60 = 120 RPM (Revoluții pe minut)
Măsurarea distanței
Măsurarea distanței parcurse de roată este atât de simplă. Înainte de a calcula distanța, trebuie cunoscută circumferința roții.
Circumferința roții = π * d
Unde d este diametrul roții.
Valoarea lui π este 3,14.
Am o roată (roată RC) cu diametrul de 6,60 cm, astfel încât circumferința este (20,7 cm).
Deci, pentru a calcula distanța parcursă, înmulțiți doar numărul de impulsuri detectat cu circumferința.
Distanța parcursă = Circumferința roții x (Nr. Impulsuri / Nr. Sloturi)
Deci, atunci când o roată de circumferință de 20,7 cm ia 20 de impulsuri, adică o rotație a roții codificatoare, atunci distanța parcursă de roată este calculată de
Distanța parcursă = 20,7 x (20/20) = 20,7cm
Pentru a calcula distanța în metri împărțiți distanța în valoare de cm la 100.
Notă: Aceasta este o roată mică de mașină RC, în timp real mașinile au roți mai mari decât aceasta. Deci, presupun că circumferința roții este de 230 cm în acest tutorial.
Calculul tarifului pe baza distanței parcurse
Pentru a obține suma totală a tarifului, înmulțiți distanța parcursă cu tariful tarifului (suma / metru).
Timer1.initialize (1000000); Timer1.attachInterrupt (timerIsr);
Apoi atașați două întreruperi externe. Prima întrerupere face pinul Arduino 2 ca pin de întrerupere și apelează ISR (numărare) atunci când este detectat RISING (LOW TO HIGH) la pinul 2. Acest pin 2 este conectat la ieșirea D0 a modulului senzorului de viteză.
Și al doilea face pinul Arduino 3 ca pin de întrerupere și apelează ISR (generatefare) când HIGH este detectat la pin3. Acest pin este conectat la butonul cu un rezistor de tragere.
attachInterrupt (digitalPinToInterrupt (2), count, RISING); attachInterrupt (digitalPinToInterrupt (3), generatefare , HIGH);
5. În continuare, să vedem despre ISR pe care l-am folosit aici:
Număr ISR1 () ISR este apelat atunci când se produce un RISING (LOW TO HIGH) la pinul 2 (conectat la senzorul de viteză).
void count () // ISR pentru numărări de la senzorul de viteză { counter ++; // crește valoarea contorului cu o rotație ++; // Măriți valoarea rotației cu o întârziere (10); }
ISR2- timerIsr () ISR este apelat la fiecare secundă și execută acele linii prezente în interiorul ISR.
void timerIsr () { detachInterrupt (digitalPinToInterrupt (2)); Timer1.detachInterrupt (); lcd.clear (); viteza de plutire = (contor / 20.0) * 60.0; rotații plutitoare = 230 * (rotație / 20); rotationinm = rotatii / 100; lcd.setCursor (0,0); lcd.print ("Dist (m):"); lcd.print (rotationinm); lcd.setCursor (0,1); lcd.print ("Viteză (RPM):"); lcd.print (viteză); contor = 0; int analogip = analogRead (A0); int motorspeed = map (analogip, 0,1023,0,255); analogWrite (5, viteza motorului); Timer1.attachInterrupt (timerIsr); attachInterrupt (digitalPinToInterrupt (2), count, RISING); }
Această funcție conține liniile care detașează mai întâi Timer1 și Pin de întrerupere mai întâi, deoarece avem instrucțiuni de imprimare LCD în interiorul ISR.
Pentru calcularea VITEZEI în RPM folosim codul de mai jos unde 20.0 este numărul de sloturi presetat în roata codificatorului.
viteza de plutire = (contor / 20.0) * 60.0;
Și pentru calcularea distanței sub cod este utilizat:
rotații plutitoare = 230 * (rotație / 20);
Aici circumferința roții este presupusă ca 230cm (deoarece acest lucru este normal pentru mașinile în timp real)
Apoi convertiți distanța în m împărțind distanța la 100
rotationinm = rotatii / 100;
După aceea, afișăm VITEZA și DISTANȚA pe ecranul LCD
lcd.setCursor (0,0); lcd.print ("Dist (m):"); lcd.print (rotationinm); lcd.setCursor (0,1); lcd.print ("Viteză (RPM):"); lcd.print (viteză);
IMPORTANT: Trebuie să resetăm contorul la 0 deoarece trebuie să obținem numărul de plusuri detectate pe secundă, astfel încât să folosim această linie
contor = 0;
Apoi citiți pinul analogic A0 și convertiți-l în valoare digitală (de la 0 la 1023) și mapați în continuare valorile respective la 0-255 pentru ieșirea PWM (setarea vitezei motorului) și în cele din urmă scrieți acele valori PWM utilizând funcția analogWrite care este conectată la ULN2003 IC motor.
int analogip = analogRead (A0); int motorspeed = map (analogip, 0,1023,0,255); analogWrite (5, viteza motorului);
ISR3: generatefare () ISR este utilizat pentru a genera suma tarifului în funcție de distanța parcursă. Acest ISR este apelat când pinul de întrerupere 3 este detectat HIGH (Când este apăsat butonul). Această funcție detașează întreruperea la pinul 2 și temporizatorul întrerupe și apoi șterge ecranul LCD.
void generatefare () { detachInterrupt (digitalPinToInterrupt (2)); pin la 2 Timer1.detachInterrupt (); lcd.clear (); lcd.setCursor (0,0); lcd.print ("FARE Rs:"); float rupees = rotationinm * 5; lcd.print (rupii); lcd.setCursor (0,1); lcd.print ("Rs 5 pe metru"); }
După ce distanța parcursă este înmulțită cu 5 (am folosit 5 pentru rata INR 5 / metru). Puteți schimba în funcție de dorința dvs.
float rupees = rotationinm * 5;
După calcularea valorii valorii, afișați-o pe ecranul LCD conectat la Arduino.
lcd.setCursor (0,0); lcd.print ("FARE Rs:"); lcd.print (rupii); lcd.setCursor (0,1); lcd.print ("Rs 5 pe metru");
Codul complet și videoclipul demonstrativ sunt prezentate mai jos.
Puteți îmbunătăți și mai mult acest prototip crescând precizia, robustețea și adăugând mai multe funcții precum aplicația Android, plata digitală etc. și îl puteți dezvolta ca produs.