- Απαιτούμενα υλικά:
- Διάγραμμα κυκλώματος:
- Πώς λειτουργεί πραγματικά η ενότητα HC-SR04:
- Μέτρηση απόστασης μεταξύ δύο αισθητήρων υπερήχων (HC-SR04):
- Πρόγραμμα για αισθητήρα πομπού:
- Πρόγραμμα για αισθητήρα δέκτη:
- Εργαζόμενος:
- Improvised Idea - βαθμονόμηση του αισθητήρα χρησιμοποιώντας μια γνωστή απόσταση:
Ο αισθητήρας υπερήχων (HC-SR04) χρησιμοποιείται συνήθως για την εύρεση της απόστασης ενός αντικειμένου από ένα συγκεκριμένο σημείο. Ήταν αρκετά εύκολο να το κάνετε αυτό με το Arduino και ο κώδικας είναι επίσης πολύ απλός. Αλλά σε αυτό το άρθρο θα δοκιμάσουμε κάτι διαφορετικό με αυτούς τους δημοφιλείς αισθητήρες HC-SR04. Θα προσπαθήσουμε να υπολογίσουμε την απόσταση μεταξύ δύο αισθητήρων υπερήχων, δηλαδή θα κάνουμε έναν αισθητήρα να λειτουργεί ως πομπός και τον άλλο αισθητήρα να λειτουργεί ως δέκτης. Με αυτόν τον τρόπο, μπορούμε να παρακολουθούμε τη θέση ενός πομπού χρησιμοποιώντας πολλούς δέκτες υπερήχων, αυτή η παρακολούθηση ονομάζεται τριγωνοποίηση και μπορεί να χρησιμοποιηθεί για αυτόματους οπαδούς αποσκευών ρομπότ σύνδεσης και άλλη παρόμοια εφαρμογή. Εύρεση της απόστασης μεταξύ δύο αισθητήρων των ΗΠΑ μπορεί να ακούγεται αρκετά απλό έργο, αλλά αντιμετώπισα λίγες προκλήσεις που συζητούνται σε αυτό το έργο.
Η τεχνική που αναφέρεται σε αυτό το άρθρο δεν είναι αρκετά ακριβής και μπορεί να μην είναι χρήσιμη σε κανένα πραγματικό σύστημα χωρίς τροποποιήσεις. Κατά τη διάρκεια αυτής της τεκμηρίωσης δεν βρήκα κανέναν να έχει αποτελέσματα όσο πιο κοντά μου, γι 'αυτό μόλις μοιράστηκα τις απόψεις μου για το πώς το έκανα να λειτουργήσει, έτσι ώστε οι άνθρωποι που το δοκιμάζουν να μην χρειάζεται να ανακαλύψουν ξανά τον τροχό.
Απαιτούμενα υλικά:
- Arduino (2Nos) - Οποιοδήποτε μοντέλο
- Ενότητα HCSR04 (2Nos)
Διάγραμμα κυκλώματος:
Ακόμα κι αν πρόκειται να κάνουμε έναν αισθητήρα ΗΠΑ (υπερήχων) να λειτουργεί ως πομπός και ο άλλος ως δέκτης, είναι υποχρεωτικό να συνδέσετε και τις τέσσερις ακίδες των αισθητήρων με το Arduino. Γιατί πρέπει; Περισσότερα από αυτά θα συζητηθούν αργότερα, αλλά προς το παρόν το διάγραμμα κυκλώματος θα έχει ως εξής
Όπως μπορείτε να δείτε το διάγραμμα κυκλώματος τόσο για τον πομπό όσο και για τον δέκτη είναι ταυτόσημοι. Ελέγξτε επίσης: Διασύνδεση αισθητήρα υπερήχων Arduino
Πώς λειτουργεί πραγματικά η ενότητα HC-SR04:
Πριν προχωρήσουμε περαιτέρω, ας καταλάβουμε πώς λειτουργεί ο αισθητήρας HC-SR04. Το παρακάτω διάγραμμα χρονισμού θα μας βοηθήσει να κατανοήσουμε τη λειτουργία.
Ο αισθητήρας έχει δύο ακίδες Trigger και Echo που χρησιμοποιούνται για τη μέτρηση της απόστασης όπως φαίνεται στο διάγραμμα χρονισμού. Πρώτα για να ξεκινήσουμε τη μέτρηση θα πρέπει να στείλουμε ένα υπερηχητικό κύμα από τον πομπό, αυτό μπορεί να γίνει με τη ρύθμιση του πείρου σκανδάλης υψηλού για 10uS. Μόλις γίνει αυτό, ο ακροδέκτης του πομπού θα στείλει 8 ηχητικές εκρήξεις κυμάτων των ΗΠΑ. Αυτό το κύμα των ΗΠΑ θα χτυπήσει ένα αντικείμενο που θα ανακάμψει και θα ληφθεί από τον δέκτη.
Εδώ το διάγραμμα χρονισμού δείχνει ότι μόλις ο δέκτης λάβει το κύμα, θα κάνει τον πείρο Echo να ανεβαίνει ψηλά για μια χρονική περίοδο που είναι ίση με το χρόνο που απαιτείται για το κύμα να ταξιδέψει από τον αισθητήρα των ΗΠΑ και να φτάσει πίσω στον αισθητήρα. Αυτό το χρονοδιάγραμμα δεν φαίνεται να είναι αλήθεια.
Κάλυψα το τμήμα Tx (πομπός) του αισθητήρα μου και έλεγξα αν ο παλμός Echo πήρε υψηλό, και ναι πάει ψηλά. Αυτό σημαίνει ότι ο παλμός Echo δεν περιμένει τη λήψη του κύματος των ΗΠΑ (υπερήχων). Μόλις μεταδώσει το κύμα των ΗΠΑ πηγαίνει ψηλά και μένει ψηλά μέχρι το κύμα να επιστρέψει πίσω. Έτσι, το σωστό διάγραμμα χρονισμού θα πρέπει να είναι κάτι τέτοιο παρακάτω (Συγγνώμη για τις κακές μου δεξιότητες γραφής)
Κάνοντας το HC-SR04 να λειτουργεί μόνο ως πομπός:
Είναι πολύ απλό να φτιάξετε ένα HC-SR04 για να λειτουργεί μόνο ως πομπός. Όπως φαίνεται στο διάγραμμα χρονισμού, πρέπει να δηλώσετε τον πείρο σκανδάλης ως πείρο εξόδου και να τον κρατήσετε ψηλό για 10 μικροδευτερόλεπτα. Αυτό θα ξεκινήσει την υπερηχητική ριπή κύματος. Έτσι, όποτε θέλουμε να μεταδώσουμε το κύμα, πρέπει απλώς να ελέγξουμε τον πείρο ενεργοποίησης του αισθητήρα πομπού, για τον οποίο δίνεται ο κώδικας παρακάτω.
Κάνοντας το HC-SR04 να λειτουργεί μόνο ως δέκτης:
Όπως φαίνεται στο διάγραμμα χρονισμού, δεν μπορούμε να ελέγξουμε την άνοδο του πείρου Echo καθώς σχετίζεται με τον πείρο ενεργοποίησης. Έτσι δεν υπάρχει τρόπος να κάνουμε το HC-SR04 να λειτουργεί μόνο ως δέκτης. Αλλά μπορούμε να χρησιμοποιήσουμε ένα hack, καλύπτοντας απλώς το τμήμα πομπού του αισθητήρα με ταινία (όπως φαίνεται στην παρακάτω εικόνα) ή το καπάκι το κύμα των ΗΠΑ δεν μπορεί να ξεφύγει έξω από το περίβλημα του πομπού και ο πείρος Echo δεν θα επηρεαστεί από αυτό το κύμα των ΗΠΑ.
Τώρα για να ανεβάσουμε τον πείρο ηχούς, πρέπει απλά να τραβήξουμε αυτόν τον ψεύτικο σκανδάλη για 10 μικροδευτερόλεπτα. Μόλις αυτός ο αισθητήρας δέκτη μεταδώσει το κύμα ΗΠΑ από τον αισθητήρα πομπού, ο πείρος ηχούς θα πέσει χαμηλά.
Μέτρηση απόστασης μεταξύ δύο αισθητήρων υπερήχων (HC-SR04):
Μέχρι τώρα έχουμε καταλάβει πώς να κάνουμε έναν αισθητήρα να λειτουργεί ως πομπός και ο άλλος αισθητήρας να λειτουργεί ως δέκτης. Τώρα, πρέπει να μεταδώσουμε το υπερηχητικό κύμα από τον αισθητήρα πομπού και να το λάβουμε με τον αισθητήρα δέκτη και να ελέγξουμε τον χρόνο που χρειάζεται για να μετακινηθεί το κύμα από τον πομπό στον ήχο του δέκτη; Αλλά δυστυχώς !, έχουμε ένα πρόβλημα εδώ και αυτό δεν θα λειτουργήσει.
Η μονάδα πομπού και η μονάδα δέκτη απέχουν πολύ και όταν η μονάδα δέκτη λαμβάνει το κύμα ΗΠΑ από τη μονάδα πομπού δεν θα γνωρίζει πότε ο πομπός έστειλε αυτό το συγκεκριμένο κύμα. Χωρίς να γνωρίζουμε την ώρα έναρξης δεν μπορούμε να υπολογίσουμε τον χρόνο που απαιτείται και, επομένως, την απόσταση. Για την επίλυση αυτού του προβλήματος, ο παλμός Echo της μονάδας δέκτη πρέπει να γίνει ψηλά ακριβώς όταν η μονάδα πομπού έχει μεταδώσει το κύμα των ΗΠΑ. Με άλλα λόγια, η μονάδα πομπού και η μονάδα δέκτη θα πρέπει να ενεργοποιούνται ταυτόχρονα. Αυτό μπορεί να επιτευχθεί με την ακόλουθη μέθοδο.
Στο παραπάνω διάγραμμα, το Tx αντιπροσωπεύει τον αισθητήρα πομπού και το Rx αντιπροσωπεύει τον αισθητήρα δέκτη. Όπως φαίνεται, ο αισθητήρας πομπού θα κατασκευαστεί για να μεταδίδει κύματα των ΗΠΑ σε μια περιοδική γνωστή καθυστέρηση, αυτό είναι το μόνο που έχει να κάνει.
Στον αισθητήρα δέκτη πρέπει κάπως να κάνουμε τον πείρο σκανδάλης να ανέβει ακριβώς όταν ο πείρος του πομπού ανεβαίνει. Αρχικά λοιπόν, κάνουμε τυχαία τη σκανδάλη των δεκτών να φτάσει ψηλά που θα παραμείνει ψηλά έως ότου ο πείρος ηχούς πέσει χαμηλά. Αυτός ο πείρος ηχούς θα πέσει χαμηλά μόνο όταν δέχεται κύμα ΗΠΑ από τον πομπό. Μόλις πέσει χαμηλά μπορούμε να υποθέσουμε ότι ο αισθητήρας πομπού μόλις ενεργοποιήθηκε. Τώρα, με αυτήν την υπόθεση μόλις η ηχώ μειωθεί, μπορούμε να περιμένουμε τη γνωστή καθυστέρηση και στη συνέχεια να ενεργοποιήσουμε τη σκανδάλη των δεκτών. Αυτό θα συγχρονίσει μερικώς τη σκανδάλη τόσο του πομπού όσο και του δέκτη και ως εκ τούτου μπορείτε να διαβάσετε την άμεση διάρκεια παλμού ηχούς χρησιμοποιώντας το pulseIn () και να υπολογίσετε την απόσταση.
Πρόγραμμα για αισθητήρα πομπού:
Το πλήρες πρόγραμμα για τη μονάδα πομπού βρίσκεται στο κάτω μέρος της σελίδας. Δεν κάνει τίποτα παρά να ενεργοποιεί τον αισθητήρα πομπού σε ένα περιοδικό διάστημα.
digitalWrite (trigPin, HIGH); καθυστέρηση Μικροδευτερόλεπτα (10); digitalWrite (trigPin, LOW);
Για να ενεργοποιήσουμε έναν αισθητήρα πρέπει να κάνουμε τον πείρο ενεργοποίησης να παραμείνει ψηλός για 10uS. Ο κώδικας για να κάνετε το ίδιο φαίνεται παραπάνω
Πρόγραμμα για αισθητήρα δέκτη:
Στον αισθητήρα δέκτη καλύπτουμε το μάτι του πομπού του αισθητήρα για να το κάνουμε ομοίωμα όπως συζητήθηκε προηγουμένως. Τώρα μπορούμε να χρησιμοποιήσουμε την παραπάνω τεχνική για να μετρήσουμε την απόσταση μεταξύ δύο αισθητήρων. Το πλήρες πρόγραμμα δίνεται στο κάτω μέρος αυτής της σελίδας. Λίγες σημαντικές γραμμές εξηγούνται παρακάτω
Trigger_US (); ενώ (digitalRead (echoPin) == ΥΨΗΛΟΣ); καθυστέρηση Μικροδευτερόλεπτα (10); Trigger_US (); διάρκεια = pulseIn (echoPin, HIGH);
Αρχικά ενεργοποιούμε τον αισθητήρα ΗΠΑ χρησιμοποιώντας τη λειτουργία Trigger_US () και στη συνέχεια περιμένουμε έως ότου ο πείρος ηχούς παραμείνει ψηλός χρησιμοποιώντας ένα βρόχο λίγο. Μόλις μειωθεί, περιμένουμε προκαθορισμένη διάρκεια, αυτή η διάρκεια θα πρέπει να κυμαίνεται μεταξύ 10 έως 30 μικροδευτερολέπτων, η οποία μπορεί να προσδιοριστεί χρησιμοποιώντας δοκιμή και σφάλμα (Ή μπορείτε να χρησιμοποιήσετε αυτοσχέδια ιδέα που δίνεται παρακάτω). Μετά από αυτήν την καθυστέρηση, ενεργοποιήστε ξανά τις ΗΠΑ χρησιμοποιώντας την ίδια λειτουργία και, στη συνέχεια, χρησιμοποιήστε τη συνάρτηση pulseIn () για να υπολογίσετε τη διάρκεια του κύματος.
Τώρα χρησιμοποιώντας τους ίδιους παλιούς τύπους μπορούμε να υπολογίσουμε την απόσταση όπως παρακάτω
απόσταση = διάρκεια * 0,034;
Εργαζόμενος:
Πραγματοποιήστε τις συνδέσεις όπως εξηγείται στο πρόγραμμα. Καλύψτε το τμήμα Tx του αισθητήρα δέκτη όπως φαίνεται στην εικόνα. Στη συνέχεια, ανεβάστε τον κωδικό πομπού και τον κωδικό δέκτη που δίνονται παρακάτω στον πομπό και τον δέκτη Arduino αντίστοιχα. Ανοίξτε τη σειριακή οθόνη της μονάδας δέκτη και θα πρέπει να παρατηρήσετε την απόσταση μεταξύ δύο μονάδων που εμφανίζονται όπως φαίνεται στο παρακάτω βίντεο.
Σημείωση: Αυτή η μέθοδος είναι απλώς μια ιδεολογία και μπορεί να μην είναι ακριβής ή ικανοποιητική. Ωστόσο, μπορείτε να δοκιμάσετε την αυτοσχέδια ιδέα παρακάτω για να έχετε καλύτερα αποτελέσματα.
Improvised Idea - βαθμονόμηση του αισθητήρα χρησιμοποιώντας μια γνωστή απόσταση:
Η μέθοδος που εξηγήθηκε μέχρι τώρα περίεργα φαίνεται ικανοποιητική, αλλά ήταν αρκετή για το έργο μου. Ωστόσο, θα ήθελα επίσης να μοιραστώ τα μειονεκτήματα αυτής της μεθόδου και έναν τρόπο να τα ξεπεράσουμε. Ένα σημαντικό μειονέκτημα αυτής της μεθόδου είναι ότι υποθέτουμε ότι ο πείρος Echo του δέκτη πέφτει αμέσως μετά τον αισθητήρα του πομπού που έχει μεταδώσει το κύμα των ΗΠΑ που δεν είναι αλήθεια, δεδομένου ότι το κύμα θα πάρει λίγο χρόνο για να ταξιδέψει από τον πομπό στον δέκτη. Ως εκ τούτου, η σκανδάλη του πομπού και η σκανδάλη του δέκτη δεν θα είναι τέλεια συγχρονισμός.
Για να ξεπεραστεί αυτό μπορούμε να βαθμονομήσουμε τον αισθητήρα χρησιμοποιώντας μια απόσταση γνώσης αρχικά. Εάν η απόσταση είναι γνωστή, θα γνωρίζουμε τον χρόνο που απαιτείται για το κύμα των ΗΠΑ για να φτάσει στον δέκτη από τον πομπό. Ας κρατήσουμε αυτόν τον χρόνο ως Del (D) όπως φαίνεται παρακάτω.
Τώρα θα ξέρουμε ακριβώς μετά από πόση ώρα θα πρέπει να κάνουμε το Pin Trigger του Receiver σε υψηλό για να συγχρονίσουμε με τη σκανδάλη του πομπού. Αυτή η διάρκεια μπορεί να υπολογιστεί με γνωστή καθυστέρηση (t) - Del (D). Δεν μπόρεσα να δοκιμάσω αυτήν την ιδέα λόγω χρονικών περιορισμών, οπότε δεν είμαι σίγουρος πόσο ακριβής θα λειτουργούσε. Αν τυχαίνει να το δοκιμάσετε, επιτρέψτε μου να ξέρω τα αποτελέσματα μέσω της ενότητας σχολίων.