K135 μέτρηση αποστάσεων με τον HC-SR04

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

Σε αυτή την εργασία χρησιμοποιούμε το Arduino και συγκεκριμένα την αναπτυξιακή πλακέτα με το Arduino Nano που έχουμε αναπτύξει σε άλλο μέρος αυτού του ιστότοπου η οποία θα προσφέρει μεγάλη ευκολία για την ολοκλήρωση της κατασκευής αυτής.

Ο HC-SR04 αποτελείται από τον υπερηχητικό πομπό που περιοδικά εκπέμπει παλμούς συχνότητας 40KHz και τον δέκτη που λαμβάνει το ανακλώμενο σήμα. Η εκπομπή των υπερηχητικών παλμών από τον πομπό αρχίζει με την εφαρμογή ενός παλμού τάσης το λιγότερο 10μS στον ακροδέκτη σκανδαλισμού Trig.

Ο ακροδέκτης echo δίνει ένα παλμό που αρχίζει από τη στιγμή που γίνει η εκπομπή του πακέτου από τον πομπό και τελειώνει μέχρι την λήψη του. Το πλάτος αυτού του παλμού είναι ανάλογο με την απόσταση που διανύουν οι υπερηχητικοί παλμοί. Το πλάτος του παλμού echo κυμαίνεται μεταξύ 150μS και 25mS. Αν αυτό το χρονικό διάστημα ξεπεράσει τα 38mS αυτό σημαίνει ότι δεν υπάρχει αντικείμενο μπροστά για να ανακλαστούν τα υπερηχητικά κύματα.

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

Για να βρούμε την απόσταση του αισθητήρα HC-SR04 από το αντικείμενο στο οποίο ανακλώνται τα κύματα, χρησιμοποιούμε τον τύπο:

Απόσταση = Ταχύτητα Χ Χρόνος

Όπου Χρόνος είναι η χρονική διάρκεια που ταξιδεύουν οι υπερηχητικοί (σε μονάδες μS) και Ταχύτητα είναι η ταχύτητα διάδοσης των υπερηχητικών κυμάτων στον αέρα (τιμή 0,034cm/μS)

Διασύνδεση του HC-SR04 με το Arduino

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

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

Όταν τελειώσεις με τις διασυνδέσεις θα έχεις κάτι που θα μοιάζει με την εικόνα που ακολουθεί:

Ανέβασμα του κώδικα στο Arduino

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

1] Πάτησε εδώ NewPing_v1.9.0.zip για να κατεβάσεις την βιβλιοθήκη. Θα πρέπει να έχεις ένα συμπιεσμένο αρχείο .zip στο φάκελο downloads.
2] Κάνε unzip το αρχείο .zip και θα πρέπει να πάρεις τον φάκελο NewPing.
3] Μετακίνησε την βιβλιοθήκη NewPing στο φάκελο των βιβλιοθηκών του περιβάλλοντος Arduino IDE.
4] Κάνε επανεκκίνηση της εφαρμογής Arduino IDE

Μετά την διασύνδεση του αισθητήρα 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(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);  
}

void loop() 
{
  lcd.clear();
  lcd.setCursor(0,0);  
  lcd.print("Distance:");
  lcd.setCursor(0, 1);
  
  // Αποστολή παλμών και εύρεση της απόστασης σε εκατοστά.
  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

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

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

1] Πάτησε εδώ LcdBarGraph-1.5.zip για να κατεβάσεις την βιβλιοθήκη. Θα πρέπει να έχεις ένα συμπιεσμένο αρχείο .zip στο φάκελο downloads.
2] Κάνε unzip το αρχείο .zip και θα πρέπει να πάρεις τον φάκελο LcdBarGraph.
3] Μετακίνησε την βιβλιοθήκη LcdBarGraph στο φάκελο των βιβλιοθηκών του περιβάλλοντος Arduino IDE.
4] Κάνε επανεκκίνηση της εφαρμογής Arduino IDE

Μετά που εγκαταστήσεις τη βιβλιοθήκη ανέβασε στο 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(16,2); // Αρχικοποιεί την διεπαφή με την οθόνη 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 με το μόλις δημιουργημένο αντικείμενο LiquidCrystal. Θα πρέπει να εισάγεις την αναφορά του αντικειμένου 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);