Τέχνη και Τεχνολογία

Αισθητήρας Απόστασης

Ultrasonic Sensor HC-SR04 and Arduino

Σε αυτό το άρθρο θα δούμε πώς λειτουργεί ο αισθητήρας υπερήχων HC-SR04 και πώς να τον χρησιμοποιήσουμε με το Arduino για να μετράμε αποσπάσεις. Αυτός είναι ο πιο δημοφιλής αισθητήρας για μέτρηση απόστασης. Μπορούμε να τον χρησιμοποιήσουμε στη δημιουργία ρομπότ αποφυγής εμποδίων με το Arduino, και αυτό περίπου θα κάνουμε στη συνέχεια.

Περιγραφή του υλικού HC-SR04

Ο HC-SR04 είναι ένας προσιτός στην τιμή και εύκολος στη χρήση αισθητήρας μέτρησης απόστασης. Έχει εύρος ανίχνευσης απόστασης από 2 cm έως 400 cm. Ο αισθητήρας αποτελείται από δύο μετατροπείς υπερήχων. Ο ένας είναι πομπός που εκπέμπει υπερηχητικούς παλμούς ήχου και ο άλλος είναι δέκτης που ακούει τα ανακλώμενα κύματα. Είναι βασικά ένα SONAR σαν αυτά που χρησιμοποιούν τα υποβρύχια. 

Ο αισθητήρας έχει 4 ακίδες. Το VCC και το GND πηγαίνουν στις ακίδες 5V και GND στο Arduino και το Trig και το Echo πηγαίνουν σε οποιαδήποτε ψηφιακή ακίδα Arduino. Χρησιμοποιώντας τον ακροδέκτη Trig στέλνουμε το κύμα υπερήχων από τον πομπό και με τον ακροδέκτη Echo λαμβάνουμε το ανακλώμενο σήμα.

Στο σχήμα που ακολουθεί βλέπουμε την εικόνα του αισθητήρα.

Αισθητήρας HC-SR04

Πώς λειτουργεί ο αισθητήρας απόστασης υπερήχων HC-SR04

Όπως φαίνεται στην εικόνα που ακολουθεί ο αισθητήρας εκπέμπει έναν υπέρηχο στα 40 000 Hz που ταξιδεύει στον αέρα και εάν υπάρχει κάποιο αντικείμενο ή εμπόδιο στην πορεία του, θα ανακλασθεί πίσω στη μονάδα. Λαμβάνοντας υπόψη τον χρόνο ταξιδιού και την ταχύτητα του ήχου μπορούμε να υπολογίσουμε την απόσταση.

Λειτουργία του HC-SR04

Για να δημιουργήσουμε τον υπέρηχο πρέπει να ρυθμίσουμε την ακίδα Trig σε υψηλή κατάσταση για 10 µs. Αυτό θα στείλει μια ομάδα 8 κύκλων υπερήχου που θα ταξιδέψει με την ταχύτητα του ήχου. Οι ακίδα Echo ανεβαίνει αμέσως μετά την αποστολή της ομάδας των 8 κύκλων υπερήχων και αρχίζει να ακούει ή να περιμένει να ανακλαστεί αυτό το κύμα από ένα αντικείμενο.

Εάν δεν υπάρχει αντικείμενο ή ανακλώμενος παλμός, η ακίδα Echo θα λήξει μετά από 38 ms και θα επανέλθει σε χαμηλή κατάσταση.

Εάν λάβουμε έναν ανακλώμενο παλμό, η ακίδα Echo θα πέσει νωρίτερα από αυτά τα 38 ms. Ανάλογα με το χρόνο που η ακίδα Echo ήταν HIGH, μπορούμε να προσδιορίσουμε την απόσταση που διένυσε το ηχητικό κύμα, άρα και την απόσταση από τον αισθητήρα στο αντικείμενο.

Στο παρακάτω διάγραμμα φαίνεται η λειτουργία που περιγράψαμε.

Διάγραμμα λειτουργίας του HC-SR04

Στην πραγματικότητα γνωρίζουμε και τις τιμές ταχύτητας και χρόνου. Ο χρόνος είναι ο χρόνος που η ακίδα Echo ήταν HIGH και η ταχύτητα είναι η ταχύτητα του ήχου που είναι 340 m/s. Υπάρχει ένα επιπλέον βήμα που πρέπει να κάνουμε, και αυτό είναι να διαιρέσουμε το τελικό αποτέλεσμα με το 2. Αυτό πρέπει να το κάνουμε επειδή μετράμε τη διάρκεια που χρειάζεται το ηχητικό κύμα για να ταξιδέψει στο αντικείμενο και να ανακλαστεί πίσω.

Ας υποθέσουμε ότι η ακίδα Echo ήταν HIGH για 2 ms. Αν θέλουμε το αποτέλεσμα της απόστασης να το εκφράσουμε σε cm, μπορούμε να μετατρέψουμε την τιμή της ταχύτητας του ήχου από 340m/s σε 34cm/ms.

Έτσι, εάν η ακίδα Echo ήταν HIGH για 2 ms (το οποίο μετράμε χρησιμοποιώντας τη συνάρτηση pulseIn() για το Arduino, η απόσταση από τον αισθητήρα στο αντικείμενο είναι 34 cm.

D = (U x T) / 2 = (34cm/ms x 2ms) / 2 = 34cm.

Πώς συνδέoυμε τον αισθητήρα υπερήχων HC-SR04 στο Arduino

Η σύνδεση του Arduino Uno με τον αισθητήρα απόστασης φαίνεται στο σχήμα που ακολουθεί. Οι ακροδέκτες γείωσης GRD και VCC της μονάδας πρέπει να συνδεθούν στη γείωση και τους ακροδέκτες 5 V στην πλακέτα Arduino αντίστοιχα και οι ακροδέκτες trig και echo σε οποιoδήποτε pin Digital I/O στην πλακέτα Arduino.

Σύνδεση του HC-SR04

Κώδικας Arduino για τον αισθητήρας υπερήχων HC-SR04

Ο κώδικας που παραθέτω είναι του Dejan Nedelkovski από το site www.HowToMechatronics.com

// defines pins numbers

const int trigPin = 9;

const int echoPin = 10;

// defines variables

long duration;

int distance;

void setup() {

pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output

pinMode(echoPin, INPUT); // Sets the echoPin as an Input

Serial.begin(9600); // Starts the serial communication

}

void loop() {

// Clears the trigPin

digitalWrite(trigPin, LOW);

delayMicroseconds(2);

// Sets the trigPin on HIGH state for 10 micro seconds

digitalWrite(trigPin, HIGH);

delayMicroseconds(10);

digitalWrite(trigPin, LOW);

// Reads the echoPin, returns the sound wave travel time in microseconds

duration = pulseIn(echoPin, HIGH);

// Calculating the distance

distance = duration * 0.034 / 2;

// Prints the distance on the Serial Monitor

Serial.print("Distance: ");

Serial.println(distance);

delay(500);

}

Επεξήγηση του κώδικα

Πρώτα πρέπει να ορίσουμε τις ακίδες (pin) Trig και Echo. Σε αυτήν την περίπτωση είναι οι ακίδες με αριθμό 9 και 10 στην πλακέτα του Arduino και τα ονομάζουμαι trigPin και echoPin. Χρειαζόμαστε μια μεταβλητή Long, που ονομάζεται “duration” για το χρόνο ταξιδιού που θα λάβουμε από τον αισθητήρα και μια ακέραια μεταβλητή για την απόσταση την “distance”.

// defines pins numbers

const int trigPin = 9;
const int echoPin = 10;

// defines variables

long duration;
long distance;

Στo setup πρέπει να ορίσουμε το trigPin ως έξοδο και το echoPin ως είσοδο και επίσης να ξεκινήσουμε τη σειριακή επικοινωνία για την εμφάνιση των αποτελεσμάτων στην οθόνη.

void setup() {
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
Serial.begin(9600); // Starts the serial communication
}

Στον βρόχο του loop() πρώτα πρέπει να βεβαιωθούμε ότι το trigPin είναι καθαρό, επομένως πρέπει να ρυθμίσετε αυτόν τον ακροδέκτη σε κατάσταση LOW για 2 μs. Τώρα για τη δημιουργία του Ultra ηχητικού κύματος πρέπει να ρυθμίσουμε το trigPin σε κατάσταση HIGH για 10 μs.

// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);

// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

Χρησιμοποιώντας τη συνάρτηση pulseIn() διαβάζουμε τον χρόνο ταξιδιού και βάζουμε αυτή την τιμή στη μεταβλητή «duration». Αυτή η συνάρτηση έχει 2 παραμέτρους, η πρώτη είναι το όνομα της ακίδας Echo και η δεύτερη είναι η κατάσταση του παλμού που διαβάζουμε, είτε High είτε Low.

// Reads the echoPin, returns the sound wave travel time in microseconds

duration = pulseIn(echoPin, HIGH);

Σε αυτήν την περίπτωση, χρειαζόμαστε αυτό το σετ σε HIGH, καθώς οι αισθητήρες HC-SR04 ρυθμίζουν την ακίδα Echo σε High μετά την αποστολή της ριπής υπερήχων 8 κύκλων από τον πομπό. Αυτό ουσιαστικά ξεκινάει τον χρονισμό και μόλις λάβουμε το ανακλώμενο ηχητικό κύμα, η ακίδα Echo θα πάει στο Low που σταματά τον χρονισμό. Στο τέλος η συνάρτηση θα επιστρέψει το μήκος του παλμού σε μικροδευτερόλεπτα.

Για να πάρουμε την απόσταση θα πολλαπλασιάσουμε τη διάρκεια με 0,034 και θα τη διαιρέσουμε με το 2 όπως εξηγήσαμε προηγουμένως αυτήν την εξίσωση.

// Reads the echoPin, returns the sound wave travel time in microseconds

duration = pulseIn(echoPin, HIGH);

// Calculating the distance

distance = duration * 0.034 / 2;

Στο τέλος θα εκτυπώσουμε την τιμή της απόστασης στην οθόνη.

Τις πληροφορίες που παρέθεσα τις πήρα κυρίως από το site

https://howtomechatronics.com/tutorials/arduino/ultrasonic-sensor-hc-sr04/

Αφήστε μια απάντηση

Η ηλ. διεύθυνση σας δεν δημοσιεύεται. Τα υποχρεωτικά πεδία σημειώνονται με *