- Μονάδα αισθητήρα ταχύτητας με υπέρυθρες υποδοχές οπτικού LM-393
- Μέτρηση ταχύτητας και απόστασης που ταξίδεψε για τον υπολογισμό του ναύλου
Σήμερα οι ψηφιακοί μετρητές αντικαθιστούν τους αναλογικούς μετρητές σε κάθε τομέα, είτε ο μετρητής ηλεκτρικής ενέργειας είτε ο μετρητής ταξί. Ο κύριος λόγος είναι ότι τα αναλογικά μέτρα έχουν μηχανικά εξαρτήματα που τείνουν να φοριούνται όταν χρησιμοποιούνται για μεγάλο χρονικό διάστημα και δεν είναι τόσο ακριβή όσο τα ψηφιακά μέτρα.
Ένα καλό παράδειγμα για αυτό είναι το αναλογικό ταχύμετρο και το οδόμετρο που χρησιμοποιούνται σε παλιά μοτοσικλέτες για τη μέτρηση της ταχύτητας και της απόστασης που διανύθηκε. Έχουν ένα ειδικό μέρος που ονομάζεται διάταξη πινιόν και ράφι στο οποίο χρησιμοποιείται ένα καλώδιο για την περιστροφή του πείρου του ταχύμετρου όταν περιστρέφεται ο τροχός. Αυτό θα φθαρεί όταν χρησιμοποιείται για μεγάλο χρονικό διάστημα και χρειάζεται επίσης αντικατάσταση και συντήρηση.
Στον ψηφιακό μετρητή, αντί να χρησιμοποιούνται μηχανικά μέρη, ορισμένοι αισθητήρες όπως ο οπτικός διακόπτης ή ο αισθητήρας αίθουσας χρησιμοποιούνται για τον υπολογισμό της ταχύτητας και της απόστασης. Αυτό είναι πιο ακριβές από τους αναλογικούς μετρητές και δεν απαιτεί καμία συντήρηση για μεγάλο χρονικό διάστημα. Προηγουμένως κατασκευάσαμε πολλά έργα ψηφιακού ταχύμετρου χρησιμοποιώντας διαφορετικούς αισθητήρες:
- Ταχύμετρο DIY χρησιμοποιώντας την εφαρμογή Arduino και επεξεργασίας Android
- Ψηφιακό ταχύμετρο και κύκλωμα οδομέτρου με χρήση μικροελεγκτή PIC
- Μέτρηση ταχύτητας, απόστασης και γωνίας για φορητά ρομπότ χρησιμοποιώντας αισθητήρα LM393 (H206)
Σήμερα, σε αυτό το σεμινάριο θα φτιάξουμε ένα πρωτότυπο ενός ψηφιακού μετρητή ταξί χρησιμοποιώντας το Arduino. Αυτό το έργο υπολογίζει την ταχύτητα και την απόσταση που διανύει ο τροχός του ταξί και το εμφανίζει συνεχώς σε οθόνη LCD 16x2. Και με βάση τη διανυθείσα απόσταση δημιουργεί ποσό ναύλου όταν πατάμε το κουμπί.
Η παρακάτω εικόνα δείχνει την πλήρη εγκατάσταση του Έργου Digital Taxi Meter
Αυτό το πρωτότυπο διαθέτει σασί αυτοκινήτου RC με μονάδα αισθητήρα ταχύτητας και τροχό κωδικοποιητή συνδεδεμένο στον κινητήρα. Μόλις μετρηθεί η ταχύτητα, μπορούμε να μετρήσουμε την απόσταση που διανύθηκε και να βρούμε την τιμή του ναύλου πατώντας το κουμπί. Μπορούμε να ρυθμίσουμε την ταχύτητα του τροχού χρησιμοποιώντας ποτενσιόμετρο. Για να μάθετε περισσότερα σχετικά με τη χρήση της μονάδας αισθητήρα ταχύτητας LM-393 με το Arduino, ακολουθήστε τον σύνδεσμο. Ας δούμε μια σύντομη εισαγωγή της μονάδας αισθητήρα ταχύτητας.
Μονάδα αισθητήρα ταχύτητας με υπέρυθρες υποδοχές οπτικού LM-393
Αυτή είναι μια μονάδα τύπου υποδοχής που μπορεί να χρησιμοποιηθεί για τη μέτρηση της ταχύτητας περιστροφής των τροχών κωδικοποιητή. Αυτή η μονάδα αισθητήρα ταχύτητας λειτουργεί με βάση οπτικό διακόπτη τύπου υποδοχής γνωστό και ως αισθητήρας οπτικής πηγής. Αυτή η μονάδα απαιτεί τάση 3,3V έως 5V και παράγει ψηφιακή έξοδο. Έτσι μπορεί να διασυνδεθεί με οποιονδήποτε μικροελεγκτή.
Ο αισθητήρας υπερύθρου φωτός αποτελείται από πηγή φωτός (IR-LED) και έναν αισθητήρα φωτοτρανζίστορ. Και οι δύο τοποθετούνται με ένα μικρό κενό μεταξύ τους. Όταν ένα αντικείμενο τοποθετείται μεταξύ του κενού των IR LED και του φωτοτρανζίστορ, θα διακόψει τη δέσμη φωτός προκαλώντας σταματώντας το φωτοτρανζίστορ.
Έτσι, με αυτόν τον αισθητήρα χρησιμοποιείται ένας δίσκος με σχισμή (Encoder Wheel) που μπορεί να συνδεθεί σε έναν κινητήρα και όταν ο τροχός περιστρέφεται με τον κινητήρα διακόπτει τη δέσμη φωτός μεταξύ IR LED και φωτοτρανζίστορ που κάνει την έξοδο On και Off (Δημιουργία παλμών).
Έτσι παράγει ΥΨΗΛΗ έξοδο όταν υπάρχει διακοπή μεταξύ πηγής και αισθητήρα (Όταν οποιοδήποτε αντικείμενο τοποθετείται ενδιάμεσα) και παράγει ΧΑΜΗΛΗ έξοδο όταν δεν υπάρχει αντικείμενο. Στην ενότητα έχουμε ένα LED που υποδεικνύει την οπτική διακοπή που προκαλείται.
Αυτή η μονάδα συνοδεύεται από LM393 Comparator IC που χρησιμοποιείται για την παραγωγή ακριβών σημάτων ΥΨΗΛΗΣ και ΧΑΜΗΛΗΣ στο OUTPUT. Έτσι, αυτή η μονάδα ονομάζεται μερικές φορές ως αισθητήρας ταχύτητας LM393.
Μέτρηση ταχύτητας και απόστασης που ταξίδεψε για τον υπολογισμό του ναύλου
Για να μετρήσουμε την ταχύτητα περιστροφής πρέπει να γνωρίζουμε τον αριθμό των θυρίδων που υπάρχουν στον τροχό του κωδικοποιητή. Έχω έναν τροχό κωδικοποιητή με 20 υποδοχές σε αυτό. Όταν περιστρέφονται μια πλήρη περιστροφή έχουμε 20 παλμούς στην έξοδο. Για να υπολογίσουμε την ταχύτητα, χρειαζόμαστε αριθμό παλμών που παράγονται ανά δευτερόλεπτο.
Για παράδειγμα
Εάν υπάρχουν 40 παλμοί σε ένα δευτερόλεπτο, τότε
Ταχύτητα = Όχι. Παλμών / Αριθμός κουλοχέρηδων = 40/20 = 2RPS (Επανάσταση ανά δευτερόλεπτο)
Για τον υπολογισμό της ταχύτητας σε RPM (περιστροφές ανά λεπτό) πολλαπλασιάστε με 60.
Ταχύτητα σε RPM = 2 X 60 = 120 RPM (περιστροφές ανά λεπτό)
Μέτρηση απόστασης
Η μέτρηση της απόστασης που διανύει ο τροχός είναι τόσο απλή. Πριν από τον υπολογισμό της απόστασης, η περιφέρεια του τροχού πρέπει να είναι γνωστή.
Περιφέρεια του τροχού = π * d
Όπου d είναι η διάμετρος του τροχού.
Η τιμή του π είναι 3,14.
Έχω τροχό (τροχός RC αυτοκινήτου) διαμέτρου 6,60 cm, έτσι η περιφέρεια είναι (20,7 cm).
Έτσι, για να υπολογίσετε την απόσταση που διανύσατε, απλώς πολλαπλασιάστε τον αριθμό των παλμών που εντοπίστηκαν με την περιφέρεια.
Διανυθείσα απόσταση = Περιφέρεια τροχού x (Αριθμός παλμών / Αριθμός θυρίδων)
Έτσι, όταν ένας τροχός Circumference 20.7cm παίρνει 20 παλμούς που είναι μία περιστροφή του τροχού κωδικοποιητή, τότε η απόσταση που διανύεται με τον τροχό υπολογίζεται από
Διανυθείσα απόσταση = 20,7 x (20/20) = 20,7 cm
Για τον υπολογισμό της απόστασης σε μετρητή διαιρέστε την απόσταση σε τιμή cm με 100.
Σημείωση: Πρόκειται για έναν μικρό τροχό αυτοκινήτου RC, σε πραγματικό χρόνο τα αυτοκίνητα έχουν μεγαλύτερους τροχούς από αυτό. Υποθέτω λοιπόν ότι η περιφέρεια του τροχού να είναι 230 εκατοστά σε αυτό το σεμινάριο.
Υπολογισμός του ναύλου με βάση την απόσταση που διανύσατε
Για να λάβετε το συνολικό ποσό ναύλου, πολλαπλασιάστε την απόσταση που διανύσατε με την τιμή ναύλου (ποσό / μέτρο).
Timer1.initialize (1000000); Timer1.attachInterrupt (timerIsr);
Στη συνέχεια συνδέστε δύο εξωτερικές διακοπές. Η πρώτη διακοπή καθιστά τον πείρο Arduino 2 ως ακροδέκτη διακοπής και καλεί ISR (μετρά) όταν ανιχνεύεται RISING (LOW TO HIGH) στον πείρο 2. Αυτός ο πείρος 2 είναι συνδεδεμένος με την έξοδο D0 της μονάδας αισθητήρα ταχύτητας.
Και το δεύτερο κάνει το Arduino pin 3 ως pin διακοπής και καλεί ISR (createfare) όταν ανιχνεύεται HIGH στο pin3. Αυτός ο πείρος συνδέεται στο κουμπί με μια αντίσταση προς τα κάτω.
attachInterrupt (digitalPinToInterrupt (2), μέτρηση, RISING); attachInterrupt (digitalPinToInterrupt (3), generatefare , HIGH)?
5. Στη συνέχεια ας δούμε για το ISR που χρησιμοποιήσαμε εδώ:
ISR1- count () Το ISR καλείται όταν συμβεί RISING (LOW TO HIGH) στον πείρο 2 (συνδεδεμένος με αισθητήρα ταχύτητας)
αριθμός κενού () // ISR για μετρήσεις από τον αισθητήρα ταχύτητας { μετρητής ++; // αύξηση της τιμής μετρητή κατά μία περιστροφή ++; // Αυξήστε την τιμή περιστροφής κατά μία καθυστέρηση (10). }
ISR2- timerIsr () Το ISR καλείται κάθε ένα δευτερόλεπτο και εκτελεί αυτές τις γραμμές που υπάρχουν μέσα στο ISR.
void timerIsr () { detachInterrupt (digitalPinToInterrupt (2)); Timer1.detachInterrupt (); lcd.clear (); ταχύτητα πλωτήρα = (μετρητής / 20.0) * 60.0; περιστροφές πλωτήρα = 230 * (περιστροφή / 20); rotationinm = περιστροφές / 100; lcd.setCursor (0,0); lcd.print ("Dist (m):"); lcd.print (rotationinm); lcd.setCursor (0,1); lcd.print ("Ταχύτητα (RPM):"); lcd.print (ταχύτητα); μετρητής = 0; int analogip = analogRead (A0); int motorspeed = χάρτης (analogip, 0,1023,0,255); analogWrite (5, motorspeed); Timer1.attachInterrupt (timerIsr); attachInterrupt (digitalPinToInterrupt (2), μέτρηση, RISING); }
Αυτή η συνάρτηση περιέχει τις γραμμές που αποσυνδέουν πρώτα το Timer1 και το Interrupt pin2 πρώτα επειδή έχουμε δηλώσεις εκτύπωσης LCD μέσα στο ISR.
Για τον υπολογισμό της SPEED σε RPM χρησιμοποιούμε τον παρακάτω κώδικα όπου το 20.0 είναι το πλήθος των slots που έχουν ρυθμιστεί στον τροχό κωδικοποίησης.
ταχύτητα πλωτήρα = (μετρητής / 20.0) * 60.0;
Και για τον υπολογισμό της απόστασης κάτω από τον κωδικό χρησιμοποιείται:
περιστροφές πλωτήρα = 230 * (περιστροφή / 20);
Εδώ η περιφέρεια του τροχού θεωρείται 230 εκατοστά (καθώς αυτό είναι φυσιολογικό για αυτοκίνητα σε πραγματικό χρόνο)
Στη συνέχεια μετατρέψτε την απόσταση σε m διαιρώντας την απόσταση με 100
rotationinm = περιστροφές / 100;
Μετά από αυτό εμφανίζουμε την ταχύτητα και την απόσταση στην οθόνη LCD
lcd.setCursor (0,0); lcd.print ("Dist (m):"); lcd.print (rotationinm); lcd.setCursor (0,1); lcd.print ("Ταχύτητα (RPM):"); lcd.print (ταχύτητα);
ΣΗΜΑΝΤΙΚΟ: Πρέπει να επαναφέρουμε τον μετρητή στο 0, επειδή πρέπει να εντοπίσουμε τον αριθμό των συν για ανά δευτερόλεπτο, ώστε να χρησιμοποιήσουμε αυτήν τη γραμμή
μετρητής = 0;
Στη συνέχεια, διαβάστε τον αναλογικό ακροδέκτη A0 και μετατρέψτε τον σε ψηφιακή τιμή (0 έως 1023) και αντιστοιχίστε περαιτέρω αυτές τις τιμές σε 0-255 για έξοδο PWM (Ρύθμιση ταχύτητας κινητήρα) και τέλος γράψτε αυτές τις τιμές PWM χρησιμοποιώντας τη λειτουργία analogWrite που είναι συνδεδεμένη στο ULN2003 Κινητήρας IC.
int analogip = analogRead (A0); int motorspeed = χάρτης (analogip, 0,1023,0,255); analogWrite (5, motorspeed);
ISR3: createfare () Το ISR χρησιμοποιείται για τη δημιουργία του ποσού ναύλου με βάση την απόσταση που διανύθηκε. Αυτό το ISR καλείται όταν ανιχνευθεί ο ακροδέκτης διακοπής 3 ΥΨΗΛΟΣ (Όταν πατηθεί το κουμπί). Αυτή η λειτουργία αποσυνδέει τη διακοπή στον πείρο 2 και τη διακοπή του χρονοδιακόπτη και στη συνέχεια διαγράφει την οθόνη LCD.
void generatefare () { detachInterrupt (digitalPinToInterrupt (2))? καρφιτσώστε στο 2 Timer1.detachInterrupt (); lcd.clear (); lcd.setCursor (0,0); lcd.print ("FARE Rs:"); float rupee = rotationinm * 5; lcd.print (ρουπίες); lcd.setCursor (0,1); lcd.print ("Rs 5 ανά μέτρο"); }
Μετά από αυτό η διανυθείσα απόσταση πολλαπλασιάζεται με 5 (έχω χρησιμοποιήσει 5 για την τιμή INR 5 / μέτρο). Μπορείτε να αλλάξετε σύμφωνα με την επιθυμία σας.
επιπλέοντες ρουπίες = rotationinm * 5;
Αφού υπολογίσετε την τιμή ποσότητας, εμφανίστε την στην οθόνη LCD που είναι συνδεδεμένη στο Arduino.
lcd.setCursor (0,0); lcd.print ("FARE Rs:"); lcd.print (ρουπίες); lcd.setCursor (0,1); lcd.print ("Rs 5 ανά μέτρο");
Ο πλήρης κώδικας και το βίντεο επίδειξης δίνονται παρακάτω.
Μπορείτε να βελτιώσετε περαιτέρω αυτό το πρωτότυπο αυξάνοντας την ακρίβεια, την ευρωστία και προσθέτοντας περισσότερες δυνατότητες όπως εφαρμογή Android, ψηφιακή πληρωμή κ.λπ. και να την αναπτύξετε ως προϊόν.