Για να γίνει ζωντανό οποιοδήποτε έργο, πρέπει να χρησιμοποιήσουμε αισθητήρες. Οι αισθητήρες λειτουργούν ως μάτια και αυτιά για όλες τις ενσωματωμένες εφαρμογές, βοηθά τον ψηφιακό μικροελεγκτή να κατανοήσει τι συμβαίνει πραγματικά σε αυτόν τον πραγματικό αναλογικό κόσμο. Σε αυτό το σεμινάριο θα μάθουμε πώς να διασυνδέουμε τον υπερηχητικό αισθητήρα HC-SR04 με τον μικροελεγκτή PIC.
Το HC-SR04 είναι ένας αισθητήρας υπερήχων που μπορεί να χρησιμοποιηθεί για τη μέτρηση της απόστασης μεταξύ 2cm έως 450cm (θεωρητικά). Αυτός ο αισθητήρας έχει αποδειχθεί άξιος προσαρμόζοντας πολλά έργα που περιλαμβάνουν ανίχνευση εμποδίων, μέτρηση απόστασης, χαρτογράφηση περιβάλλοντος κ.λπ. Στο τέλος αυτού του άρθρου θα μάθετε πώς λειτουργεί αυτός ο αισθητήρας και πώς να τον συνδέσετε με τον μικροελεγκτή PIC16F877A για να μετρήσετε την απόσταση και την οθόνη στην οθόνη LCD. Ακούγεται ενδιαφέρον, σωστά !! Ας ξεκινήσουμε λοιπόν…
Απαιτούμενα υλικά:
- PIC16F877A MCU με ρύθμιση προγραμματισμού
- Οθόνη LCD 16 * 2
- Αισθητήρας υπερήχων (HC-SR04)
- Σύνδεση καλωδίων
Πώς λειτουργεί ένας αισθητήρας υπερήχων;
Πριν προχωρήσουμε περαιτέρω, πρέπει να γνωρίζουμε πώς λειτουργεί ένας αισθητήρας υπερήχων, ώστε να μπορούμε να κατανοήσουμε αυτό το σεμινάριο πολύ καλύτερα. Ο αισθητήρας υπερήχων που χρησιμοποιείται σε αυτό το έργο φαίνεται παρακάτω.
Όπως μπορείτε να δείτε, έχει δύο κυκλικά μάτια όπως προεξοχές και τέσσερις ακίδες που βγαίνουν από αυτό. Οι προβολές που μοιάζουν με δύο μάτια είναι ο πομπός και ο δέκτης υπερήχων (εφεξής καλούμενο κύμα ΗΠΑ). Ο πομπός εκπέμπει ένα κύμα ΗΠΑ σε συχνότητα 40Hz, αυτό το κύμα ταξιδεύει μέσω του αέρα και ανακλάται πίσω όταν ανιχνεύει ένα αντικείμενο. Τα κύματα επιστροφής παρατηρούνται από τον δέκτη. Τώρα γνωρίζουμε ότι ο χρόνος που απαιτείται για την ανάκλαση και επιστροφή αυτού του κύματος και η ταχύτητα του κύματος των ΗΠΑ είναι επίσης καθολική (3400cm / s). Χρησιμοποιώντας αυτές τις πληροφορίες και τους παρακάτω τύπους γυμνασίου μπορούμε να υπολογίσουμε την απόσταση που καλύπτεται.
Απόσταση = Ταχύτητα × Χρόνος
Τώρα που γνωρίζουμε πώς λειτουργεί ένας αισθητήρας των ΗΠΑ, ας πώς μπορεί να διασυνδεθεί με οποιοδήποτε MCU / CPU χρησιμοποιώντας τις τέσσερις ακίδες. Αυτές οι τέσσερις ακίδες είναι Vcc, Trigger, Echo και Ground αντίστοιχα. Η μονάδα λειτουργεί σε + 5V και ως εκ τούτου το Vcc και ο πείρος γείωσης χρησιμοποιούνται για την τροφοδοσία της μονάδας. Οι άλλοι δύο ακροδέκτες είναι οι ακροδέκτες I / O χρησιμοποιώντας τους οποίους επικοινωνούμε με το MCU μας. Ο πείρος σκανδάλης πρέπει να δηλωθεί ως πείρος εξόδου και να είναι ψηλός για 10uS, αυτό θα μεταδώσει το κύμα των ΗΠΑ στον αέρα ως ηχητική έκρηξη 8 κύκλων. Μόλις παρατηρηθεί το κύμα, ο πείρος Echo θα πάει ψηλά για το ακριβές χρονικό διάστημα που πήρε το κύμα των ΗΠΑ για να επιστρέψει στη μονάδα αισθητήρα. Ως εκ τούτου, αυτός ο πείρος Echo θα δηλωθεί ως είσοδοςκαι ένας χρονοδιακόπτης θα χρησιμοποιηθεί για τη μέτρηση της διάρκειας του πείρου. Αυτό θα μπορούσε να γίνει περαιτέρω κατανοητό από το παρακάτω διάγραμμα χρονισμού.
Ελπίζω να έχετε φτάσει σε ένα δοκιμαστικό τρόπο για να συνδέσετε αυτόν τον αισθητήρα με PIC. Θα χρησιμοποιήσουμε τη μονάδα χρονοδιακόπτη και τη μονάδα LCD σε αυτό το σεμινάριο και υποθέτω ότι είστε εξοικειωμένοι με τα δύο, αν όχι παρακαλώ επιστρέψτε στον αντίστοιχο οδηγό παρακάτω, καθώς θα παραλείψω τις περισσότερες από τις σχετικές πληροφορίες.
- Διασύνδεση LCD με μικροελεγκτή PIC
- Κατανόηση των χρονομέτρων στον μικροελεγκτή PIC
Διάγραμμα κυκλώματος:
Το πλήρες διάγραμμα κυκλώματος για διασύνδεση υπερήχων αισθητήρα με PIC16F877A φαίνεται παρακάτω:
Όπως φαίνεται, το κύκλωμα δεν περιλαμβάνει τίποτα περισσότερο από μια οθόνη LCD και τον ίδιο τον αισθητήρα υπερήχων. Ο αισθητήρας των ΗΠΑ μπορεί να τροφοδοτείται από + 5V και ως εκ τούτου τροφοδοτείται απευθείας από τον ρυθμιστή τάσης 7805 Ο αισθητήρας έχει έναν πείρο εξόδου (πείρος σκανδάλης) ο οποίος συνδέεται με τον πείρο 34 (RB1) και ο πείρος εισόδου (πείρος ηχούς) συνδέεται με τον πείρο 35 (RB2). Η πλήρης σύνδεση ακίδων απεικονίζεται στον παρακάτω πίνακα.
S.No: |
Αριθμός Pin PIC |
Όνομα καρφιτσώματος |
Συνδεδεμένος με |
1 |
21 |
RD2 |
RS LCD |
2 |
22 |
RD3 |
Ε της LCD |
3 |
27 |
RD4 |
D4 της LCD |
4 |
28 |
RD5 |
D5 της οθόνης LCD |
5 |
29 |
RD6 |
D6 της οθόνης LCD |
6 |
30 |
RD7 |
D7 της οθόνης LCD |
7 |
34 |
RB1 |
Σκανδάλη των ΗΠΑ |
8 |
35 |
RB2 |
Ηχώ των ΗΠΑ |
Προγραμματισμός του μικροελεγκτή PIC:
Το πλήρες πρόγραμμα για αυτό το σεμινάριο δίνεται στο τέλος αυτής της σελίδας, πιο κάτω έχω εξηγήσει τον κώδικα σε μικρά νοήματα πλήρη κομμάτια για να καταλάβετε. Όπως ειπώθηκε νωρίτερα, το πρόγραμμα περιλαμβάνει την έννοια της διασύνδεσης LCD και του χρονοδιακόπτη που δεν θα εξηγηθεί λεπτομερώς σε αυτό το σεμινάριο αφού τα έχουμε ήδη καλύψει στα προηγούμενα σεμινάρια.
Στο εσωτερικό, η κύρια λειτουργία ξεκινάμε με την αρχικοποίηση των καρφιτσών IO και άλλων καταχωρητών ως συνήθως. Ορίζουμε τις καρφίτσες IO για αισθητήρα LCD και ΗΠΑ και επίσης ξεκινάμε τον καταχωρητή χρονοδιακόπτη 1, ορίζοντάς τον να λειτουργεί σε προ-κλίμακα 1: 4 και να χρησιμοποιεί εσωτερικό ρολόι (Fosc / 4)
TRISD = 0x00; // Το PORTD δηλώθηκε ως έξοδος για διασύνδεση LCD TRISB0 = 1; // Ορίστε τον πείρο RB0 ως είσοδο για χρήση ως πείρος διακοπής TRISB1 = 0; // Ο πείρος σκανδάλης του αισθητήρα ΗΠΑ αποστέλλεται ως πείρος εξόδου TRISB2 = 1; // Ο πείρος ηχούς του αισθητήρα ΗΠΑ έχει οριστεί ως πείρος εισόδου TRISB3 = 0; // Το RB3 είναι πείρος εξόδου για LED T1CON = 0x20; // 4 pres-scalar και εσωτερικό ρολόι
Ο χρονοδιακόπτης 1 είναι ένας χρονοδιακόπτης 16-bit που χρησιμοποιείται στο PIC16F877A, ο καταχωρητής T1CON ελέγχει τις παραμέτρους της μονάδας χρονοδιακόπτη και το αποτέλεσμα θα αποθηκευτεί σε TMR1H και TMR1L δεδομένου ότι το αποτέλεσμα 16-bit τα πρώτα 8 θα αποθηκευτούν στο TMR1H και το επόμενο 8 σε TMR1L. Αυτός ο χρονοδιακόπτης μπορεί να ενεργοποιηθεί ή να απενεργοποιηθεί χρησιμοποιώντας TMR1ON = 0 και TMR1ON = 1 αντίστοιχα.
Τώρα, ο χρονοδιακόπτης είναι έτοιμος για χρήση, αλλά πρέπει να στείλουμε τα κύματα των ΗΠΑ έξω από τον αισθητήρα, για να το κάνουμε αυτό πρέπει να κρατήσουμε τον πείρο Trigger υψηλό για 10uS, αυτό γίνεται με τον ακόλουθο κώδικα.
Σκανδάλη = 1; __delay_us (10); Σκανδάλη = 0;
Όπως φαίνεται στο παραπάνω διάγραμμα χρονισμού, ο πείρος Echo θα παραμείνει χαμηλός έως ότου επιστρέψει το κύμα και στη συνέχεια θα πάει ψηλά και θα παραμείνει ψηλός για τον ακριβή χρόνο που απαιτείται για να επιστρέψουν τα κύματα. Αυτή η ώρα πρέπει να μετρηθεί από την ενότητα Timer 1, η οποία μπορεί να γίνει με την παρακάτω γραμμή
ενώ (Echo == 0); TMR1ON = 1; ενώ (Echo == 1); TMR1ON = 0;
Μόλις μετρηθεί ο χρόνος, η προκύπτουσα τιμή θα αποθηκευτεί στους καταχωρητές TMR1H και TMR1L, αυτοί οι καταχωρητές πρέπει να κλωνοποιηθούν για να συγκεντρωθούν για να πάρουν την τιμή 16-bit. Αυτό γίνεται χρησιμοποιώντας την παρακάτω γραμμή
time_taken = (TMR1L - (TMR1H << 8));
Αυτό το time_taken θα είναι σε μορφή byte, για να λάβουμε την πραγματική τιμή χρόνου που πρέπει να χρησιμοποιήσουμε τον παρακάτω τύπο.
Χρόνος = (τιμή εγγραφής 16-bit) * (1 / Εσωτερικό ρολόι) * (Προ-κλίμακα) Εσωτερικό ρολόι = Fosc / 4 Όπου στην περίπτωσή μας, Fosc = 20000000Mhz και προ-κλίμακα = 4 Ως εκ τούτου, η τιμή του εσωτερικού ρολογιού 5000000Mhz και η τιμή του χρόνου θα είναι Χρόνος = (τιμή εγγραφής 16-bit) * (1/5000000) * (4) = (τιμή εγγραφής 16-bit) * (4/5000000) = (τιμή εγγραφής 16-bit) * 0,0000008 δευτερόλεπτα (OR) Χρόνος = (τιμή εγγραφής 16-bit) * 0,8 μικρο δευτερόλεπτα
Στο πρόγραμμά μας, η τιμή του καταχωρητή 16-bit αποθηκεύεται στη μεταβλητή time_taken και ως εκ τούτου η παρακάτω γραμμή χρησιμοποιείται για τον υπολογισμό του time_take σε μικρο δευτερόλεπτα
time_taken = time_taken * 0,8;
Στη συνέχεια πρέπει να βρούμε πώς να υπολογίσουμε την απόσταση. Όπως γνωρίζουμε απόσταση = ταχύτητα * χρόνος. Αλλά εδώ το αποτέλεσμα πρέπει να διαιρεθεί με 2, καθώς το κύμα καλύπτει τόσο την απόσταση μετάδοσης όσο και την απόσταση λήψης. Η ταχύτητα του κύματος μας (ήχος) είναι 34000cm / s.
Απόσταση = (Ταχύτητα * Χρόνος) / 2 = (34000 * (τιμή εγγραφής 16-bit) * 0,0000008) / 2 Απόσταση = (0,0272 * Τιμή εγγραφής 16-bit) / 2
Έτσι, η απόσταση μπορεί να υπολογιστεί σε εκατοστά όπως παρακάτω:
απόσταση = (0,0272 * χρόνος_ένα) / 2;
Αφού υπολογίσουμε την τιμή της απόστασης και του χρόνου που απαιτείται, απλά πρέπει να τις εμφανίσουμε στην οθόνη LCD.
Μέτρηση απόστασης χρησιμοποιώντας αισθητήρα PIC και υπερήχων:
Αφού πραγματοποιήσετε τις συνδέσεις και ανεβάσετε τον κωδικό, η πειραματική σας ρύθμιση θα μοιάζει με αυτό που φαίνεται στην παρακάτω εικόνα.
Ο πίνακας PIC Perf, που φαίνεται σε αυτήν την εικόνα, δημιουργήθηκε για τη σειρά μαθημάτων PIC, στην οποία μάθαμε πώς να χρησιμοποιούμε τον μικροελεγκτή PIC. Ίσως θελήσετε να επιστρέψετε σε αυτά τα μαθήματα PIC Microcontroller χρησιμοποιώντας MPLABX και XC8 εάν δεν ξέρετε πώς να κάψετε ένα πρόγραμμα χρησιμοποιώντας το Pickit 3, καθώς θα παραλείψω όλες αυτές τις βασικές πληροφορίες.
Τώρα τοποθετήστε ένα αντικείμενο μπροστά στον αισθητήρα και θα πρέπει να εμφανίζει πόσο μακριά βρίσκεται το αντικείμενο από τον αισθητήρα. Μπορείτε επίσης να παρατηρήσετε τον χρόνο που εμφανίζεται σε μικρο δευτερόλεπτα για να μεταδώσει και να επιστρέψει το κύμα.
Μπορείτε να μετακινήσετε το αντικείμενο στην προτιμώμενη απόσταση και να ελέγξετε την τιμή που εμφανίζεται στην οθόνη LCD. Ήμουν σε θέση να μετρήσω την απόσταση από 2cm έως 350cm με ακρίβεια 0,5cm. Αυτό είναι αρκετά ικανοποιητικό αποτέλεσμα! Ελπίζω να απολαύσατε το σεμινάριο και να μάθετε πώς να φτιάχνετε κάτι μόνοι σας. Εάν έχετε οποιεσδήποτε αμφιβολίες, ρίξτε τις στην παρακάτω ενότητα σχολίων ή χρησιμοποιήστε τα φόρουμ.
Ελέγξτε επίσης τη διασύνδεση του αισθητήρα υπερήχων με άλλους μικροελεγκτές:
- Μέτρηση απόστασης με βάση αισθητήρες Arduino & υπερήχων
- Μετρήστε την απόσταση χρησιμοποιώντας αισθητήρα υπερήχων Raspberry Pi και HCSR04
- Μέτρηση απόστασης με χρήση μικροελεγκτή HC-SR04 και AVR