Μέτρηση αποστάσεων με τον αισθητήρα HC-SR04

Ένας τρόπος για να μετράμε αποστάσεις ηλεκτρονικά, είναι με την χρήση της μεθόδου της ανάκλασης των υπερήχων. Οι υπέρηχοι είναι ηχητικά κύματα που διαδίδονται στον αέρα και έχουν συχνότητες πάνω από 20.000Ηz. Το ανθρώπινο αυτί μπορεί να ακούσει ηχητικά κύματα μεταξύ 20Hz έως 20.000Ηz. Για ήχους συχνότητας μεγαλύτερης από 20.000Ηz, που ονομάζονται υπέρηχοι, δεν προκαλούν την αίσθηση της ακοής για το ανθρώπινο αυτί.

Σε αυτό το εδάφιο θα μάθουμε πώς να μετράμε αποστάσεις με τον υπερηχητικό αισθητήρα HC-SR04 χρησιμοποιώντας το Arduino, ο οποίος έχει την ικανότητα να αναγνωρίζει εμπόδια με την μέθοδο της ανάκλασης υπερήχων τα οποία βρίσκονται σε απόσταση μικρότερη από 400cm. Ο αισθητήρας αυτός έχει πολλά πλεονεκτήματα όπως τη μικρή κατανάλωση (μπορεί να τροφοδοτηθεί από μπαταρίες), είναι φθηνός, εύκολος χειρισμός και είναι δημοφιλής στους χομπίστες.

Ο HC-SR04 είναι ένας υπερηχητικός αισθητήρας μέτρησης απόστασης (Ultrasonic Distance Sensor), ο οποίος λειτουργεί στα υπερηχητικά κύματα συχνότητας 40 kHz, δηλαδή σε συχνότητα πολύ μεγαλύτερη από το όριο ακοής του ανθρώπου. Μπορεί να μετρήσει αποστάσεις από περίπου 2 cm έως 400 cm με ακρίβεια της τάξης των ±3 mm υπό ιδανικές συνθήκες. Αποτελείται από:

  • Έναν υπερηχητικό πομπό (Transmitter)
  • Έναν υπερηχητικό δέκτη (Receiver)
  • Κύκλωμα ελέγχου και επεξεργασίας σήματος

Ο αισθητήρας είναι μικρός σε μέγεθος, εύκολος στη χρήση και μπορεί να χρησιμοποιηθεί σε ρομποτικές κατασκευές, ανιχνεύοντας αντικείμενα σε απόσταση μεταξύ 2cm και 400cm. Λειτουργεί με τάση 5V και μπορεί να χρησιμοποιηθεί με το Arduino ή με άλλον μικροελεγκτή που χρησιμοποιεί λογική 5V.

ΧαρακτηριστικόΤιμή
Τάση λειτουργίαςDC 5V
Ρεύμα λειτουργίας15mA
Συχνότητα λειτουργίας40ΚΗz
Μέγιστη περιοχή μετρήσεων4m
Ελάχιστη περιοχή μετρήσεων2cm
Ακρίβεια μετρήσεων3mm
Σήμα σκανδαλισμού10μS pulse
Διαστάσεις45 x 20 x 15 mm

Διάταξη ακροδεκτών του HC-SR04 Η διάταξη των ακροδεκτών του αισθητήρα HC-SR04 απεικονίζεται στο ακόλουθο σχήμα

Vcc Τροφοδοσία τάσης DC στα 5V
Trig Σκανδαλισμός για αποστολή υπερηχητικών παλμών
Echo Παράγει ένα παλμό έως το ανακλώμενο σήμα ληφθεί. Το πλάτος του παλμού είναι ανάλογο με την απόσταση που διανύει το ηπερηχητικό κύμα από τη στιγμή της εκπομπής έως τη λήψη του.
GND Συνδεση στα 0V

Η βασική αρχή λειτουργίας του HC-SR04 μοιάζει με τον τρόπο που οι νυχτερίδες ή τα δελφίνια αντιλαμβάνονται το περιβάλλον τους: εκπέμπει ηχητικά κύματα υψηλής συχνότητας (υπερήχους), τα οποία ανακλώνται πάνω σε αντικείμενα και επιστρέφουν στον αισθητήρα. Μετρώντας τον χρόνο που απαιτείται για αυτή τη διαδρομή, ο αισθητήρας μπορεί να υπολογίσει την απόσταση από το αντικείμενο. Η διαδικασία έχει ως εξής:

Βήμα 1: Ενεργοποίηση
Ο μικροελεγκτής εφαρμόζει παλμό HIGH διάρκειας 10 μs στο pin TRIG.

Βήμα 2: Εκπομπή υπερήχων
Ο αισθητήρας παράγει 8 διαδοχικούς παλμούς υπερήχων συχνότητας 40 kHz.

Βήμα 3: Ανάκλαση
Τα υπερηχητικά κύματα διαδίδονται στον αέρα μέχρι να συναντήσουν κάποιο αντικείμενο

Βήμα 4: Λήψη ηχούς
Το κύμα ανακλάται και επιστρέφει στον δέκτη του αισθητήρα.

Βήμα 5: Υπολογισμός χρόνου
Το pin ECHO παραμένει HIGH όσο διαρκεί η διαδρομή του κύματος προς το αντικείμενο και πίσω. Ο μικροελεγκτής μετρά τη διάρκεια (Time) αυτού του παλμού.

Βήμα 6: Υπολογισμός απόστασης
Η απόσταση (Distance) προκύπτει από τη σχέση:

όπου Velocity η ταχύτητα των υπερηχητικών κυμάτων που είναι Velocity = 340 m/s = 0,034 cm/μs , έτσι προκύπτουν οι ακόλουθοι τύποι:

Ο αισθητήρας HC-SR04 σε όρους ακρίβειας και χρησιμότητας προσφέρει πολλά πλεονεκτήματα συγκρινόμενος με άλλες μετρητικές συσκευές χαμηλού κόστους. Αυτό δεν σημαίνει ότι μπορεί να μετρήσει τα «πάντα». Στις ακόλουθες περιπτώσεις ο αισθητήρας δεν είναι ικανός να ανταποκριθεί:

1] Η απόσταση μεταξύ του αισθητήρα και του αντικειμένου είναι μεγαλύτερη από 400cm.

2] Η γωνία που σχηματίζεται από την διεύθυνση διάδοσης των υπερήχων και της καθέτου στην ανακλώμενη επιφάνεια είναι μεγαλύτερη από 45 μοίρες.

3] Το αντικείμενο στο οποίο θέλουμε να μετρήσουμε την απόσταση από τον αισθητήρα είναι πολύ μικρό και δεν μπορούν να ανακλαστούν τα υπερηχητικά κύματα.

4] Έχει βρεθεί πειραματικά ότι αντικείμενα από μαλακό υλικό όπως μαλακά υφασμάτινα αρκουδάκια δεν είναι ικανά να ανακλάσουν τα υπερηχητικά κύματα κι έτσι είναι δύσκολο να μετρήσουμε την απόσταση χρησιμοποιώντας υπερήχους.

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

Συνδέουμε το HC-SR04 με το Arduino ως εξής: Συνδέουμε τον ακροδέκτη VDD του αισθητήρα με τα 5V της αναπτυξιακής πλακέτας, τον ακροδέκτη GRD του αισθητήρα με το Graound του Arduino, τον ακροδέκτη Trig με τον ακροδέκτη 8 του Arduino και τον ακροδέκτη Echo με τον ακροδέκτη  9  του Arduino. Ο τρόπος σύνδεσης των ακροδεκτών του αισθητήρα με την αναπτυξιακή πλακέτα φαίνεται στον ακόλουθο πίνακα:

Αντί μετά τον σκανδαλισμό Trig να μετράμε το πλάτος του παλμού Echo «δια χειρός», θα χρησιμοποιήσουμε μια ειδική βιβλιοθήκη την NewPing και τη δημιουργία του κατάλληλου κώδικα. Πριν φορτώσεις τον κώδικα στο Arduino Nano θα πρέπει να έχεις εγκαταστήσεις αυτήν την βιβλιοθήκη NewPing στο περιβάλλον Arduino IDE. Ακολούθησε τα παρακάτω βήματα για να την εγκαταστήσεις.

Δημιουργούμε ένα φάκελο στο σκληρό μας δίσκο π.χ. arduino_libraries και στην συνέχεια κατεβάζουμε το zip αρχείο της βιβλιοθήκης, από τον ακόλουθο σύνδεσμο και το αποθηκεύουμε σ’ αυτόν τον φάκελο.

NewPing Library
Πάτησε εδώ NewPing_v1.9.0.zip για να κατεβάσεις και να αποθηκεύσεις την βιβλιοθήκη του αισθητήρα HC-SR04 σε μορφή zip αρχείου.

Προτού ανεβάσεις και τρέξεις τον κώδικά στο Arduino IDE, θα πρέπει να έχεις εγκαταστήσει την αντίστοιχη βιβλιοθήκη. Για να εγκαταστήσεις την βιβλιοθήκη ακολούθησε τα εξής απλά βήματα:

Από το μενού επιλέγουμε διαδοχικά: Sketch > Include Library > Add .ZIP library… Από το εμφανιζόμενο παράθυρο διαλόγου πλοηγούμαστε και επιλέγουμε το επιθυμητό .ZIP αρχείο βιβλιοθήκης και κάνουμε κλικ στο κουμπί Άνοιγμα. Αν πάνε όλα καλά θα πρέπει να έχει εγκατασταθεί η βιβλιοθήκη.

Μετά την διασύνδεση του αισθητήρα HC-SR04 με την αναπτυξιακή πλακέτα βασισμένη στο Arduino Nano την οποία παρουσιάσαμε σε άλλο άρθρο και μετά την εγκατάσταση της βιβλιοθήκης NewPing, ανέβασε τον ακόλουθο κώδικά στο περιβάλλον IDE και μετά φόρτωσε τον στο Arduino Nano. Πρόσεξε να επιλέξεις τη σωστή θύρα που έχεις συνδέσει το Arduino και αν το Arduino Nano που χρησιμοποιείς είναι κινέζικης παραγωγής, δοκίμασε στην επιλογή πλακέτα την “Arduino Duemilanove or Diecimila”

#include "NewPing.h"
#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

// Διασύνδεσε τον HC-SR04 με το πιν Trig στο Arduino Pin 9 και το πιν Echo με το Arduino πιν 10
#define TRIGGER_PIN 8
#define ECHO_PIN 9

// Μέγιστη απόσταση που θέλουμε να ανιχνεύσουμε σε εκατοστά.
#define MAX_DISTANCE 400  

// Δημιουργία ενός αντικειμένου NewPing με τον ορισμό των πινς και την μέγιστη απόσταση.
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

float duration;
float distance;

void setup() 
{
  pinMode(TRIGGER_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  lcd.begin(20, 4);
  lcd.clear();
  lcd.setCursor(0, 0);  
}

void loop() 
{
  lcd.clear();
  lcd.setCursor(0,1);  
  lcd.print("Distance:");
  lcd.setCursor(0, 2);
  
  // Αποστολή παλμών και εύρεση της απόστασης σε εκατοστά.
  distance = sonar.ping_cm();
    
  // Στέλνει τα αποτελέσματα στο LCD.
    
  if (distance >= 400 || distance <= 2) 
  {
    lcd.print("Out of range");
  }
  else 
  {
    lcd.print(distance);
    lcd.print("cm");
  }
  delay(500);
}

Ο παραπάνω κώδικας είναι απλός και δουλεύει καλά αλλά έχει ακρίβεια έως ένα εκατοστό. Αν θέλεις οι μετρήσεις να είναι δεκαδικές θα πρέπει να χρησιμοποιείσεις τη NewPing σε «duration mode» αντί σε «distance mode». Έτσι θα πρέπει να αντικαταστήσεις τις

// Στέλνει μια ριπή παλμών και υπολογίζει την απόσταση σε cm
distance = sonar.ping_cm();

Με τις παρακάτω γραμμές:

duration = sonar.ping();
distance = (duration / 2) * 0.0343;

Μπορούμε να πάμε σε επόμενο επίπεδο ακρίβειας των μετρήσεων ως εξής: Κάνουμε επαναλαμβανόμενες μετρήσεις και μετά παίρνουμε την μέση τιμή τους. Αντικαθιστούμε τις επόμενες γραμμές στον αρχικό κώδικα και στις οποίες δίνουμε εντολή για 5 επαναληπτικές μετρήσεις.

int iterations = 5;
duration = sonar.ping_median(iterations);
distance = (duration / 2) * 0.0343;

Ας δούμε ένα άλλο τρόπο υπολογισμού αποστάσεων με τον υπερηχητικό αισθητήρα HC-SR04. Από την στιγμή που στείλουμε ένα παλμό στον ακροδέκτη Trig του αισθητήρα υπερηχητικοί παλμοί εκπέμπονται και μετράμε με την βοήθεια της συνάρτησης pulseIn(echopin, HIGH) τη χρονική διάρκεια που τα υπερηχητικά κύματα πάνε και γυρίζουν πίσω στον αισθητήρα, διαμορφώνοντας έτσι ένα παλμό στον ακροδέκτη Echo που το πλάτος του είναι ανάλογο της μετρούμενης απόστασης.

Επίσης χρησιμοποιούμε τη βιβλιοθήκη LcdBarGraph η οποία μας βοηθά να σχεδιάζουμε στην οθόνη LCD μια οριζόντια μπάρα της οποίας το μήκος είναι ανάλογο του παλμού echo δηλαδή της μετρούμενης απόστασης. Για να το πραγματοποιήσουμε θα πρέπει να εγκαταστήσουμε τη βιβλιοθήκη LcdBarGraph στο περιβάλλον βιβλιοθηκών του Arduino IDE. Για να την εγκατάσταση της βιβλιοθήκης ακολούθησε τα επόμενα βήματα.

LcdBarGraph Library
Πάτησε εδώ LcdBarGraph-1.5.zip για να κατεβάσεις και να αποθηκεύσεις την βιβλιοθήκη LcdBarGraph σε μορφή zip αρχείου.

Μετά που εγκαταστήσεις τη βιβλιοθήκη ανέβασε στο Arduino τον ακόλουθο κώδικα:

// Συμπεριλαμβάνει τη βιβλιοθήκη LiquidCrystal
#include <LiquidCrystal.h> 

// Συμπεριλαμβάνει την βιβλιοθήκη LcdBarGraph 
#include <LcdBarGraph.h>

// Μέγιστη απόσταση που θέλουμε να ανιχνεύσουμε σε cm.
#define max_distance 200

// Δημιουργεί ένα αντικείμενο LCD. Παράμετροι:(rs, enable, d4, d5, d6, d7)

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

LcdBarGraph lbg(&lcd, 16, 0, 1); // Δημιουργεί ένα αντικείμενο LCD Bargraph.

const int trigPin = 8;
const int echoPin = 9;
long duration;
int distance;

void setup() 
{
  lcd.begin(20,4); // Αρχικοποιεί την διεπαφή με την οθόνη LCD.
  
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop() 
{
  // Στέλνει ένα παλμό στο πιν Trig του HC-SR04
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  
  // Μετρά την διάρκεια του παλμού στο πιν Echo.
  duration = pulseIn(echoPin, HIGH);
  
  // Υπολογίζει την απόσταση από την χρονική διάρκεια του παλμού Echo.
  // Χρησιμοποιεί σαν ταχύτητα του ήχου 343 μέτρα ανα δευτερόλεπτο.
  distance= duration*0.034/2;
  // if(distance <= 3 || distance >= 200) distance = 0;
  // Τυπώνει "Distance: [value]" στην πρώτη γραμμή του LCD
  lcd.setCursor(0,0);
  for(int i = 0; i < 16; i++) lcd.print(" "); // Καθαρίζει την πρώτη γραμμή.
  lcd.setCursor(0, 0);
  lcd.print("Distance: ");
  if(distance <= 3 || distance >= 200) {
        lcd.print("err");
        distance = 0;
     }
     else {
        lcd.print(distance);
        lcd.print(" cm");
     }  
  // Σχεδιάζει μια μπάρα στη δεύτερη γραμμή του LCD
  lcd.setCursor(0,1);
  lbg.drawValue(distance, max_distance);
  delay(1000);
}

Πρώτα θα πρέπει να εγκαταστήσεις τη βιβλιοθήκη LiquidCrystal  όπως γνωρίζουμε. Μετά από αυτό θα πρέπει να δημιουργήσεις ένα αντικείμενο LcdBarGraph αφού πρώτα δημιουργήσεις ένα αντικείμενο lcd που μέσω της συνάρτησης δημιουργίας ορίζουμε τους ακροδέκτες διασύνδεσης του LCD display. Θα πρέπει να εισάγεις την αναφορά του αντικειμένου LiquidCrystal σαν πρώτο όρισμα στη συνάρτηση δημιουργίας του αντικειμένου της κλάσης LcdBarGraph.

Ο δημιουργός του LcdBarGraph αντικειμένου παίρνει τρεις επιπλέον παραμέτρους. Η δεύτερη παράμετρος είναι ο αριθμός στηλών χαρακτήρων του LCD (στη δικιά μας περίπτωση είναι 16). Οι άλλες δυο παράμετροι είναι προαιρετικές και δηλώνουν την αρχή της μπάρας.

//Δημιουργεί ένα υπόδειγμα bargraph
LcdBarGraph  lbg(&lcd, 16, 0, 1);

Μόλις πάρουμε τιμές για την απόσταση με τον αισθητήρα HC-SR04 θα χρησιμοποιήσουμε τη συνάρτηση drawValue(value, maxValue) για να σχεδιάσουμε την μπάρα στην οθόνη. Αυτή η συνάρτηση σχεδιάζει μια μπάρα με μήκος μεταξύ 0 και maxValue

//Εμφάνιση της μπάρας στην LCD
lbg.drawValue(distance, max_distance);