Ανίχνευση κίνησης με τον αισθητήρα HC-SR501

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

Η βασική ιδέας της κατασκευής στηρίζεται στην χρήση του module HC-SR501 σαν αισθητήρας υπέρυθρης ακτινοβολίας, ο οποίος δομείται από ένα μικρό pcb με ένα ειδικό ολοκληρωμένο κύκλωμα πάνω του με μερικά άλλα εξαρτήματα και αυτό είναι ότι χρειάζεται για πλήρη λειτουργία ανίχνευσης κίνησης με απλή έξοδο με δυο καταστάσεις HIGH και LOW.

Γνωρίζουμε από το σχολείο ότι όλα τα σώματα που βρίσκονται σε θερμοκρασία μεγαλύτερη από το απόλυτο μηδέν εκπέμπουν θερμική ενέργεια υπό μορφή υπέρυθρης ακτινοβολίας. Όσο μεγαλύτερη είναι η θερμοκρασία ενός σώματος τόσο περισσότερη θερμική υπέρυθρη ακτινοβολία εκπέμπουν. Το σώμα του ανθρώπου ή των ζώων βρίσκεται σε μεγαλύτερη θερμοκρασία από το περιβάλλον και έτσι γίνεται εφικτό ή ανίχνευση της κίνησης τους με τον αισθητήρα PIR δηλ. HC-SR501.

To HC-SR501 ανιχνεύει κίνηση βασιζόμενο στην υπέρυθρη ακτινοβολία που εκπέμπουν τα σώματα καθώς κινούνται από μπροστά του.  Ο PIR αισθητήρας είναι σχεδιασμένος έτσι ώστε να αναγνωρίζει την υπέρυθρη ακτινοβολία του ανθρώπου και των ζώων που περνούν μπροστά του και την ξεχωρίζει από εκείνη που εκπέμπει το περιβάλλον.

Λειτουργία του ανιχνευτή κίνησης HC-SR501

Ο υπέρυθρος αισθητήρας HC-SR501 έχει σχεδιαστεί για την ανίχνευση σωμάτων ανθρώπων και ζώων χρησιμοποιώντας την υπέρυθρη (ηλεκτρ/κη) ακτινοβολία. Αυτός ο αισθητήρας αποτελείται από δυο μέρη τον pyroelectric sensor και τους φακούς  Fresnel. Ο πρώτος είναι υπεύθυνος για την ανίχνευση υπέρυθρης ακτινοβολίας και ο δεύτερος έχει σαν έργο την εστίαση της ακτινοβολίας πάνω στον ειδικό αισθητήρα που επεξεργάζεται την εστιασμένη ακτινοβολία που δέχεται.

Ο pyroelectric sensor έχει πάνω του δυο τετράγωνα ανοίγματα καλυμμένα από υλικό που αφήνει να περάσει υπέρυθρη ακτινοβολία. Πίσω από αυτά τα ανοίγματα υπάρχουν ξεχωριστά ηλεκτρόδια ευαίσθητα στη θερμική υπέρυθρη ακτινοβολία, το ένα ηλεκτρόδιο είναι υπεύθυνο για την θετική έξοδο και το άλλο για την αρνητική έξοδο. Αυτή η διάταξη είναι υπεύθυνη για αλλαγές IR επιπέδων και όχι την σταθερή IR του περιβάλλοντος. Τα δυο ηλεκτρόδια είναι συνδεμένα έτσι που το σήμα τους να εξουδετερώνει το ένα το άλλο. Εάν το ένα παραθυράκι του αισθητήρα δεχτεί περισσότερη η λιγότερη ακτινοβολία από το άλλο η έξοδος θα μεταβληθεί μεταξύ των καταστάσεων high και low.

Στο pcb του PIR αισθητήρα υπάρχει ένα ειδικευμένο ολοκληρωμένο κύκλωμα (IC) που επεξεργάζεται το σήμα από τα ηλεκτρόδια του αισθητήρα και ορίζει τον ακροδέκτη εξόδου σε High ή Low ανάλογα την κατάσταση συναγερμού.

Δομή του HC-SR501 αισθητήρα κίνησης

Ο αισθητήρας PIR HC-SR501 βασίζεται στο ολοκληρωμένο κύκλωμα BISS0001 Micro Power PIR Motion Detector IC. Αυτό το IC έχει αναπτυχθεί ειδικά για να επεξεργάζεται σήματα από PIR αισθητήρες κίνησης.

Όταν αφαιρέσουμε τους φακούς Fresnel θα δούμε το πυροηλεκτρικό στοιχείο RE200B. Επίσης πάνω στο pcb του αισθητήρα μπορείς να βρεις ένα σταθεροποιητή τάσης. Αυτό σημαίνει ότι μπορείς να τροφοδοτήσεις το HC-SR501 με μια ευρεία τιμών τάσεων, από 4,5 έως 12V. Τυπικά χρησιμοποιείται τάση 5V για τροφοδοσία.

Το HC-SR501 έχει τρεις ακροδέκτες για την διασύνδεση του και συγκεκριμένα τον Vcc για τροφοδοσία με τάση (όπως αναφέραμε πριν) το GND για την σύνδεση με τα 0V και τον ψηφιακό ακροδέκτη OUT για την ψηφιακή διασύνδεση με τον μικροελεγκτή (Arduino)

Ρυθμίσεις λειτουργίας του HC-SR501

Ρύθμιση ευαισθησίας: Το HC-SR501 μπορεί να ανιχνεύσει θερμικές πηγές σε μια περιοχή από 3 έως 7 μέτρα. Μπορείς να ρυθμίσεις αυτή την απόσταση με το ποτενσιόμετρο. Γυρίζοντας το ποτενσιόμετρο με ένα μικρό κατσαβίδι δεξιόστροφα αυξάνεις την ακτίνα δράσης μέχρι τα 7 μέτρα ενώ γυρίζοντας αυτό αριστερόστροφα μειώνεις την ακτίνα δράσης του έως και 3 μέτρα.

Ρύθμιση χρόνου καθυστέρησης: Με το ποτενσιόμετρο αυτό μπορείς να ρυθμίσεις την χρονική διάρκεια που η έξοδος OUTPUT μένει  HIGH μετά την ανίχνευση της κίνησης. Η μικρότερη καθυστέρηση είναι 3 δευτερόλεπτα και η μεγαλύτερη 300 δευτερόλεπτα ή 5 λεπτά. Με δεξιόστροφο γύρισμα του ποτενσιόμετρου έχουμε αύξηση της καθυστέρησης και με αριστερόστροφο γύρισμα έχουμε μείωση της καθυστέρησης.

Βραχυκυκλωτήρας σκανδαλισμού (Trigger selection jumper)

Ο κίτρινος βραχυκυκλωτήρας μπορεί να χρησιμοποιηθεί για την επιλογή μιας από δυο καταστάσεις σκανδαλισμού. Μπορεί να τεθεί L(single trigger) ή H(repeating trigger)

Single trigger: η έξοδος τίθεται σε HIGH την στιγμή που θα ανιχνευθεί κίνηση. Θα μείνει HIGH για το χρονικό παράθυρο που έχει οριστεί από το ποτενσιόμετρο. Κάθε κίνηση μέσα σε αυτό το χρονικό παράθυρο δεν έχει επίδραση και δεν επανεκκινεί το ρολόι για τη δημιουργία νέου χρονικού παραθύρου.
Repeating trigger: Κάθε στιγμή που ανιχνευθεί κίνηση, το ρολόι επανεκκινείται για να ορίσει το χρονικό παράθυρο από την αρχή.

Βελτίωση λειτουργίας του PIR αισθητήρα HC-SR501

To pcb του αισθητήρα κίνησης HC-SR501 έχει δυο θέσεις για κόλληση δυο εξαρτημάτων για περαιτέρω βελτίωση της λειτουργίας του. Αυτές οι θέσεις σημειώνονται με ‘RL’ και ‘RT’ πάνω στο pcb.
— RL :  εδώ μπορείς να κολλήσεις μια φωταντίσταση που έχει την ιδιότητα η αντίσταση της να μειώνεται με την αύξηση του φωτός που δέχεται πάνω της. Αυτή επιτρέπει στον αισθητήρα HC-SR501 να λειτουργεί όταν η περιοχή δράσης του είναι σχετικά σκοτεινή.
— RT :  σε αυτή τη θέση μπορείς να κολλήσεις ένα θερμίστορ. Σε αυτή την περίπτωση κάνουμε τον αισθητήρα κίνησης λιγότερο εξαρτημένο από την θερμοκρασία περιβάλλοντος.

Διάταξη ακροδεκτών του HC-SR501

Vcc : χρησιμοποιείται για τροφοδοσία του αισθητήρα με τάση. Συνίσταται σε διασύνδεση με τάση τιμής 5V
Output : είναι συμβατή με 3,3V TTL logic output. Η τιμή low δηλώνει ότι δεν έχει ανιχνεύσει κίνηση, ενώ με τιμή High δηλώνεται η ανίχνευση κίνησης.
GND : θα πρέπει να συνδεθεί στα 0V.

Χρησιμοποιώντας τον HC-SR501 σαν αυτόνομη μονάδα ανίχνευσης κίνησης

Υπάρχουν πολλές εφαρμογές που μπορείς να χρησιμοποιήσεις τον αισθητήρα HC-SR501 σαν αυτόνομη μονάδα που η έξοδος του μπορεί να τριγκάρει ρελέδες, διόδους LED κ.ά.

Σε αυτή την περίπτωση που περιγράφουμε εδώ, της αυτόνομης διασύνδεσης του αισθητήρα, η κατασκευή είναι απλή και φαίνεται στην παρακάτω εικόνα. Απλά σύνδεσε τους ακροδέκτες Vcc και GND  με μια μπαταρία και ένα (κόκκινο) LED μεταξύ της εξόδου (Output) του αισθητήρα κίνησης και του GND. Η τάση εξόδου είναι 3,3V και γι’ αυτό σύνδεσε μια αντίσταση 68Ω σε σειρά με το LED για τον περιορισμό ρεύματος.

Σημείωση: Μετά την τροφοδότηση με τάση στον αισθητήρα θα πρέπει να περιμένουμε 30 έως 60 δευτερόλεπτα για να αρχικοποιηθεί ο HC-SR501. Σε αυτό το χρονικό διάστημα το LED θα αναβοσβήσει μερικές φορές. Μετά από λίγο κίνησε το χέρι σου μπροστά από τον αισθητήρα και θα πρέπει το LED να ανάψει.

Σε αυτό το σημείο είναι ευκαιρία να δοκιμάσουμε τον PIR αισθητήρα παίζοντας με την ευαισθησία (sensitivity) και του χρόνου καθυστέρησης καθώς τους δυο τρόπους σκανδαλισμού (trigger modes).

Εφαρμογή: Διασύνδεση του υπέρυθρου αισθητήρα HC-SR501

Παρακάτω θα διασυνδέσουμε τον υπέρυθρο αισθητήρα με την αναπτυξιακή πλακέτα που έχουμε παρουσιάσει σε άλλο μέρος. Ο κώδικας είναι απλός και δεν έχει καμία ιδιαιτερότητα και αυτό οφείλεται στο γεγονός ότι ο αισθητήρας έχει μια και μοναδική ψηφιακή έξοδο που παίρνει μια από τις δυο καταστάσεις HIGH  ή  LOW ανάλογα αν ανιχνεύεται κίνηση από μπροστά του.

Μπορείς να συνδέσεις την ψηφιακή έξοδο του HC-SR501 σε ένα από τα I/O ψηφιακά πινς του Arduino. Στην κατασκευή μας το συνδέουμε με το πιν  8 του Arduino. Έπειτα συνδέουμε τα πινς Vcc και GND του αισθητήρα με τα 5V και GND της αναπτυξιακής πλακέτας αντίστοιχα.

Για να δουλέψει ο κώδικας σωστά είναι καλύτερο να θέσεις τον βραχυκυκλωτήρα trigger mode σε ‘Η’ (Repeat trigger mode). Επίσης ρυθμίζουμε το χρόνο καθυστέρησης με το ποτενσιόμετρο στη χαμηλότερη τιμή (γύρισε το τέρμα αριστερόστροφα).

Ο κώδικας διαβάζει την κατάσταση του αισθητήρα HC-SR501 και εμφανίζει πάνω στην οθόνη LCD το αντίστοιχο μήνυμα και συγκεκριμένα το «Motion detected!» ή «Motion ended!»

Ο κώδικας για τούτο το παράδειγμα είναι ο ακόλουθος:

// Παράδειγμα κώδικα για τον υπέρυθρο αισθητήρα HC-SR501
//Συμπερίληψη βιβλιοθήκης για το LCD
#include <LiquidCrystal.h> 
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // Δημιουργία αντικειμένου lcd
// Δηλωση πιν επικοινωνίας:
#define pirPin 8
// Δημιουργία μεταβλητών:
int val = 0;
bool motionState = false; // Ξεκινάμε με μη ανίχνευση κίνησης
void setup() {
  // Διαμόρφωση πινς σαν είσοδος ή έξοδος:
   pinMode(pirPin, INPUT);
  // Αρχικοποίηση του LCD σαν 16 στήλες και 2 γραμμές:
  lcd.begin(16, 2);
}
void loop() {
  // Διάβασμα του πιν pirPin και εκχώρηση στη μεταβλητή val:
  val = digitalRead(pirPin);
  // Εάν ανιχνευτεί κίνηση (pirPin = HIGH), κάνε τα ακόλουθα:
  if (val == HIGH) {
     // Άλλαξε την κατάσταση κίνησης σε true (motion detected):
    if (motionState == false) {
      lcd.setCursor(0, 0);
      lcd.print("Motion detected!");
      motionState = true;
    }
  }
  // Εάν δεν ανιχνευτεί κίνηση (pirPin = LOW), κάνε τα ακόλουθα:
  else {
     // Άλλαξε την κατάσταση κίνησης σε false (no motion):
    if (motionState == true) {
      lcd.setCursor(0, 0);
      lcd.print("Motion ended!   ");
      motionState = false;
    }
  }
}

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

Ο κώδικας είναι πολύ απλός και μπορείς εύκολα να τον κατανοήσεις. Αυτό φαίνεται και από το γεγονός ότι δεν συμπεριλαμβάνει βιβλιοθήκη παρά μόνο αυτή για την λειτουργία της οθόνης LCD την οποία γνωρίζουμε να την χρησιμοποιούμε από άλλες εφαρμογές αυτού του ιστοτόπου.

Στην αρχή του κώδικα δηλώνουμε με την έκφραση #define pirPin 8 το ψηφιακό πιν πάνω στο Arduino που είναι συνδεμένος ο αισθητήρας. Με την έκφραση #define δίνουμε ένα όνομα σε μια σταθερή τιμή. Έτσι κάθε φορά που γίνεται αναφορά στη σταθερά pirPin ο compiler θα την αντικαταστήσει με την τιμή 8 καθώς ο κώδικας μεταγλωττίζεται

Επίσης ορίζουμε δυο μεταβλητές val και motionState που δηλώνονται σαν int και bool  αντίστοιχα. Η μεταβλητή val χρησιμοποιείται για να αποθηκεύσει την έξοδο του αισθητήρα και η motionState παίρνει την τιμή true εάν ανιχνεύει κίνηση και false όταν δεν υπάρχει κίνηση στο χώρο.

//Συμπερίληψη βιβλιοθήκης για το LCD
#include <LiquidCrystal.h> 
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // Δημιουργία αντικειμένου lcd
// Δήλωση πιν επικοινωνίας:
#define pirPin 8
// Δημιουργία μεταβλητών:
int val = 0;
bool motionState = false; // Ξεκινάμε με μη ανίχνευση κίνησης

Στην συνάρτηση setup() θέτουμε το πιν pirPin σαν input με την χρήση της εντολής pinMode(pin, mode);. Επίσης αρχικοποιούμε την μονάδα απεικόνισης LCD με 16 στήλες και 2 γραμμές.

void setup() {
  // Διαμόρφωση πινς σαν είσοδος ή έξοδος:
   pinMode(pirPin, INPUT);
  // Αρχικοποίηση του LCD σαν 16 στήλες και 2 γραμμές:
  lcd.begin(16, 2);
}

Μέσα στη συνάρτηση επανάληψης loop() πρώτα διαβάζουμε την έξοδο του αισθητήρα digitalRead(pin); η οποία επιστρέφει HIGH ή LOW. Εάν ανιχνευθεί κίνηση εμφανίζεται το μήνυμα «Motion detected!» στην οθόνη LCD ενώ όταν δεν έχουμε κίνηση εμφανίζεται το μήνυμα «Motion endend!»

Δημιουργία ενός συστήματος συναγερμού με τον αισθητήρα PIR και ενός βομβητή

Με λίγες αλλαγές στον κώδικα μπορούμε να δημιουργήσουμε ένα σύστημα συναγερμού καθώς και με τη βοήθεια ενός βομβητή (buzzer). Για πιο ωραίο ήχο συνδέουμε σε σειρά με τον βομβητή μια αντίσταση 100Ω ή μπορείτε να πειραματιστείτε με την τιμή της.

Ο κώδικας γι’ αυτή την εφαρμογή είναι ο ακόλουθος που διαφέρει ελάχιστα από το προηγούμενο παράδειγμα κώδικα. Μπορείς να πειραματιστείς με τον ήχο του βομβητή αλλάζοντας τις παραμέτρους στη συνάρτηση alarm(duration, frequency);

/* Παράδειγμα κώδικα για την δημιουργία συστήματος συναγερμού*/
#include <LiquidCrystal.h> 
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // Δημιουργία αντικειμένου lcd

// Δήλωση αντιστοίχησης ακροδεκτών:
#define buzzerPin 9
#define pirPin 8

// Δημιουργία μεταβλητών:
int val = 0;
bool motionState = false; // Αρχή σαν μην ανίχνευση κίνησης.

void setup() {
  // Διαμόρφωση πιν σαν input or output:
  pinMode(buzzerPin, OUTPUT);
  pinMode(pirPin, INPUT);

  // Αρχικοποίηση αντικειμένου της οθόνης lcd:
  lcd.begin(16, 2);
}

void loop() {
  // Διάβασμα του pirPin και αποθήκευση του στη val:
  val = digitalRead(pirPin);

  // Εάν ανιχνευθεί κίνηση (pirPin = HIGH), κάνε τα ακόλουθα:
  if (val == HIGH) {
     alarm(500, 1000);  // Κάλεσε την συνάρτηση alarm(duration, frequency).
    delay(150);

    // Άλλαξε την κατάσταση κίνησης σε true (motion detected):
    if (motionState == false) {
      lcd.setCursor(0, 0);
      lcd.print("Motion detected!");
      motionState = true;
    }
  }

  // Εάν δεν ανιχνευχθεί κίνηση (pirPin = LOW), κάνε τα ακόλουθα:
  else {
    noTone(buzzerPin); // Βεβαιώσου ότι δεν ηχεί ο βομβητής όταν δεν ανιχεύεται κίνηση.
    delay(150);

    // Άλλαξε την κατάσταση κίνησης σε false (no motion):
    if (motionState == true) {
      lcd.setCursor(0, 0);
      lcd.print("Motion ended!  ");
      motionState = false;
    }
  }
}

// Function to create a tone with parameters duration and frequency:
void alarm(long duration, int freq) {
  tone(buzzerPin, freq);
  delay(duration);
  noTone(buzzerPin);
}

Σημεία που πρέπει να λάβεις υπόψη για να σχεδιάζεις PIR εφαρμογές

Όπως στους περισσότερους PIR υπέρυθρους αισθητήρες, ο HC-SR501 χρειάζεται κάποιο χρόνο για να επεξεργαστεί την υπέρυθρη ακτινοβολία που δέχεται από το χώρο. Αυτό παίρνει χρόνο από 30 έως 60 δευτερόλεπτα μετά που ο αισθητήρας τροφοδοτηθεί με τάση.

Επιπρόσθετα, ο αισθητήρας έχει ένα χρονικό διάστημα αδράνειας μετά από μια ανάγνωση, που σε αυτό το χρονικό διάστημα αδυνατεί να ανιχνεύσει κίνηση.

Όταν σχεδιάζεις μια εφαρμογή βασισμένη στον υπέρυθρο αισθητήρα HC-SR501, πρέπει να λάβεις υπόψη  όλες αυτές τις καθυστερήσεις.