Grundlagen

PIRs (Passiv-Infrarot-Sensoren) reagieren auf Temperaturänderungen im Infrarotbereich, die z.B. durch Bewegung von Menschen oder Tieren (leider auch manchmal durch Wind usw.) im Erfassungsbereich der Sensoren erfaßt werden.

Der Zilog ePIR-Sensor

Übersicht

Der ePIR (Passiv Infrarot)-Sensor von Zilog ist ein preiswerter und vergleichsweise einfach zu nutzender, dennoch sehr leistungsfähiger Sensor. Die kleine Platine besteht aus einem Single-Board-Computer, dem eigentlicher Sensor mit Fresnel-Linse und ist im Rasterabstand für Steckbretter (Breadboards) ausgeführt. Der Sensor deckt mittels 4 Strahlen einen 60 Grad Kegel ab, wobei die beiden inneren Strahlen eine größere Reichweite haben. Der effektive Erfassungsbereich ist von einer Reihe von Faktoren abhängig (Temperatur, Umweltbedingungen, und Einstellungen). Grundsätzlich aber gilt:

Erfassungscharakteristika ePIR IR-Sensor

Quelle: zilog

In Verbindung mit einem Mikroprozessor wie dem Arduino werden so gut wie keine weiteren externen Komponenten benötigt, die Anwendungsmöglichkeiten hingegen übertreffen die von Standard-PIR-Sensoren bei weitem.

Technische Daten

  • Erfassungsbereich bis zu 5 x5 Meter (Erkennungswinkel 60 Grad)
  • SBC (Single Board Computer) Fresnel-Linse]
  • Gute Erkennungssoftware
  • Geringe Größe(25,5 x 16,7 mm)
  • Konfiguration per Hardware oder serielle Schnittstelle
  • Empfindlichkeit und Verzögerung einstellbar
  • Stromsparender Schlafmodus (2,3 mA gegenüber 8,9 mA "wach")
  • Keine Temperatur-Kompensation nötig
  • Anschluß für Fotozelle (Umgebungslicht).

Ein ausführliches Datenblatt (englisch): Sparkfun ePIR.

Pin-Belegung des ePIR:

ePIR-Pinbelegung

Quelle: zilog

Der ePIR läßt sich in zwei unterschiedlichen Modi betreiben: Hardwaregesteuert oder über die serielle Schnittstelle. Standardmäßig arbeitet der ePIR im Hardware-Modus, mit dem wir uns also erst einmal beschäftigen. Der Serial Interface Modus bietet eine Reihe von erweiterten Funktionen wie z.B. Richtungserkennung usw.

Beispiel 1 (Hardware-Beschaltung)

In diesem Beispiel begnügen wir uns mit der einfacheren Hardware-Variante und belegen die PINs wie folgt:

  1. GND (vom Arduino)
  2. VDD (3,3 Volt vom Arduino)
  3. RXD/DLY (nicht beschaltet = Verzögerung 2 Sekunden)
  4. TXD/SNS (nicht beschaltet = höchste Empfindlichkeit)
  5. MD/RST (Arduino digital Pin 2 über 10K Pullup-Widerstand. Schaltet auf LOW, wenn Bewegung erkannt wird)
  6. LG (3,3 Volt vom Arduino, kein Fotowiderstand für Umgebungslicht)
  7. SLP (nicht beschaltet = kein "Schlafmodus")
  8. GND (vom Arduino).

Achtung: Für den ePIR unbedingt den 3,3 Volt-Ausgang benutzen bzw. einen entsprechenden Vorwiderstand einsetzen.

Schematische Darstellung

Hier erst einmal ein Standardaufbau:

Image

Code:

/* Arduino mit Zilog ePir(Passiv-Infrarot-Sender)
   Hardware-Ansteuerung

   copyleft by fribbe@macherzin.net 2012-10-26
   unter Lizenz
   http://creativecommons.org/licenses/by-nc-sa/3.0/de/

*/

int ledPin = 13; //LED liegt an digital Pin 13
int sensorPin = 7; //Sensor liegt an digital Pin 7
int bewegung = 0; //Bewegung wird erst einmal mit 0 initalisiert

void setup()
{
   pinMode(ledPin, OUTPUT); //Pin D13 als Ausgang
   pinMode(sensorPin, INPUT); // Pin D7 als Eingang
}

void loop() // und immer wieder
{
   bewegung = digitalRead(sensorPin); //Sensordaten lesen
    
   if (bewegung == LOW) //LOW = Bewegung, HIGH = keine Bewegung
   {
      digitalWrite(ledPin, HIGH); //LED an
   }
   else
   {
      digitalWrite(ledPin, LOW); //LED aus
   }
}
   
//wir haben fertig

Natürlich können wir an Stelle der LED auch z.B. einen Piezo-Summer oder anderen Signalgeber anschließen sofern dieser nicht mehr als 20 mA zieht und für eine Spannung von 5 Volt ausgelegt ist.

Ergänzungen im Hardware-Modus

In diesem Beispiel haben wir nicht alle Möglichkeiten des Hardware-Modus genutzt. Werfen wir also einen Blick auf die bisher nicht genutzten Pins:

Dauer der "Alarmauslösung" im Hardware-Modus (Pin 3/DLY)

Ohne externe Beschaltung bleibt MD (Bewegung erkannt/Pin 5) nach erkannter Bewegung für 2 Sekunden aktiv. Durch Beschaltung des Pins 3 mit einem Festwiderstand bzw. durch ein Potentiometer läßt sich dieser Wert nach oben hin verändern.

Einige Beispielswerte:

VerzögerungV an DLYVerzögerungV an DLYVerzögerungV an DLY
5 sec0,210 sec 0,4 30 sec0,5
1 min 0,82 min1,0 3 min 1,2
5 min 1,4 10 min1,6 15 1,8

Umgebungslicht-Erkennung im Hardware-Modus (Pin 6/LG)

Das an diesem Eingang anliegende Signal deaktiviert - entsprechendes Umgebungslicht vorausgesetzt - die Bewegungserkennung. Ein klassisches Anwendungsbeispiel: Bei ausreichendem Tageslicht wird eine Lampe trotz Bewegung nicht eingeschaltet. Hierzu eignet sich jeder handelsübliche lichtempfindliche Widerstand. Als zweiten Widerstand im Spannungsteiler empfiehlt sich ein Trimmer/Potentiometer, um die Lichtempfindlichkeit den örtlichen Bedürfnissen anzupassen.

SpannungBewegungserkennung
GND bis 1,0 Voltdeaktiviert
1,0 Volt bis VDDaktiviert

Wenn der Pin/LG direkt an VDD liegt (wie in unserem o.a. Beispiel), ist diese Funktion nicht aktiv. Eine Bewegung wird dann also - unabhängig vom Umgebungslicht - erkannt. Dieser Modus eignet sich besonders für die Einbruchserkennung (nicht alle Diebe kommen in der Nacht!).

Der folgende Aufbau berücksichtigt das einfallende Umgebungslicht. Der Wert des 2. Widerstandes hängt von den konkreten Anforderungen (wie dunkel ist dunkel?) und dem verwendeten Widerstand ab. Es ist sinnvoll, erst einmal mit einem Potentiometer zu arbeiten, um den notwendigen Widerstandswert zu ermitteln. Ich habe z.B. R2 =100K ermittelt, aber ... !? Die Schaltung eignet sich z.B. für die Ansteuerung von Lampen. Bei Dunkelheit/Dämmerung UND Bewegung wird der Ausgang aktiviert:

Image

Code: s.o.

Sleep/Stromsparmodus im Hardware-Modus (Pin 7/SLP)

Im Beispiel haben wir den Pin 7 nicht beschaltet, welcher zur Steuerung des Sleep/Stromsparmodus dient.

Welchen praktischen Nutzen hat dieser Modus überhaupt, und warum machen wir es uns nicht leichter und entfernen einfach die Stromversorgung des Sensors?

Der Anwort ist - wie so oft - einfach: Die Stabilisierungszeit ("aufheizen") des ePIR ist wesentlich kürzer als die üblichen 20 mS (ich bevorzuge 40 ms). Wer es also braucht ... :

Um den Sleep-Modus zu aktivieren, wird Pin 7 des Sensors über einen digitalen Pin des Arduino oder über einen simplen Schalter auf LOW gebracht. Digital HIGH weckt ihn (den ePIR) wieder auf.

Beispiel 2 (Steuerung per serieller Schnittstelle)

Vorbemerkung

Die für Software-Beschaltung des Sensors notwendigen Informationen finden sich in der 60-seitigen Dokumentation für Entwickler. Hat sich zwar etwas versteckt, bekommt ihr aber hier. Da englischsprachig, hier meine bescheidenen Erkenntnisse:

Für viele Einsatzzwecke wird die Abfrage/Steuerung des ePIR per Hardware genügen. Eine der gro0en Vorteile des ePIR ist aber die Möglichkeit, den Sensor per serieller Schnittstelle zu steuern, dynamisch zu konfigurieren und natürlich wiederum abzufragen.

Warum der ganze Aufwand? Ein mögliches Szenario wäre, daß wir nach Erkennung einer Bewegung im Erfassungsbereich des Sensors feststellen wollen, ob die jetzt erkannte Bewegung von links oder rechts erfolgte. Also z.B. so:

  • Bewegung erkannt
  • melde Bewegung
  • schalte auf Bewegungserkennung "links"
  • Bewegung erkannt?
  • melde Bewegung von links
  • sonst
  • schalte auf Bewegungserkennung "rechts"
  • Bewegung erkannt?
  • Melde Bewegung von rechts

...

Hierzu nutzen wir u.a. folgende Kontrollsequenzen:

EPIR.print('V'); // schreibe: Bewegungserkennung ...
EPIR.print('A'); // alle Richtungen
EPIR.print('a'); // lese: Bewegung?
EPIR.print('V'); // schreibe: Bewegungserkennung ...
EPIR.print('-'); // von links
EPIR.print('a'); // lese: Bewegung?
EPIR.print('V'); // Bewegungserkennung ...
EPIR.print('+'); // von rechts
EPIR.print('a'); // lese: Bewegung?

Eine genaue Übersicht über diesbezügliche Möglichkeiten findet ihr im o.a. Handbuch.

Dennoch hier eine Kurzübersicht:

Tabelle 3 aus ePIR-Handbuch

Quelle: Zilog

Grundsätzlich ist zwischen Abfrage und Konfiguration zu entscheiden. eine Abfrage benötigt keine Parameter, ein Konfigurationsbefehl - liegt ja in der Natur der Sache - hingegen bedarf eines Parameters.

Eine Zusammenfassung einiger verfügbarer Kontrollsequenzen und deren Parameter:

Arduino an ePIRParameterePIR an Arduino
'a' bzw. 0x61 = lese Bewegungsstatus Y = Bewegung erkannt, N = keine Bewegung erkannt, U = Sensor nicht stabilisiert
'b' bzw. 0x62 = lese Helligkeit Umgebungslicht Wert 0 bis 255, 0 = maximales, 255 = minimales Umgebungslicht
'e' bzw. 0x65 = lese erweiterte Einstellung Empfindlichkeit Y = aktiviert, N = deaktiviert
'E' bzw. 0x45 = schreibe erweiterte Einstellung EmpfindlichkeitY = aktivieren, N = deaktivierenACK
'g' bzw. 0x67 = lese Empfindlichkeit Hyper Sense Wert 0 bis 3 (0 deaktiv, 1 minimale, 2 mittlere und 3 maximale Empfindlichkeit
'G' bzw. 0x47 = schreibe Empfindlichkeit Hyper SenseWert 0 bis 3ACK
'f' bzw. 0x66 = lese Frequenz-Einstellungen L = hohe und tiefe Frequenzen werden erkannt, H = reduzierte Empfindlichkeit gegenüber tiefen Frequenzen
'F' bzw. 0x46 = Einstellung FrequenzL bzw. H (s.o)ACK
'h' bzw. 0x68 = Bewegungserkennung deaktiviert Y = keine Bewegungserkennung, N = Bewegungserkennung ist aktiviert
'H' bzw. 0x48 = Einstellung Bewegungserkennung deaktivY = keine Bewegungserkennung, N = Bewegungserkennung ist aktiviertACK
'l' bzw. 0x6C = lese Schwelle für Umgebungslicht Wert 0 bis 255, 0 = maximales, 255 = minimales Umgebungslicht
'L' bzw. 0x4C = schreibe Schwelle für Umgebungslicht0 bis 255ACK
'v' bzw. 0x76 = lese Richtung Bewegungserkennung 'A' = links und rechts, "-" von links, "+" von rechts
'V' bzw. 0x56 = schreibe Richtung BewegungserkennungA = links und rechts, '-' von links, '+' von rechtsACK

Abfrage ePIR

Bei der Abfrage wird der entsprechende Befehl an den ePIR gesendet, welcher dann die angeforderten Werte zurück liefert. Da - sofern im Programm nicht anders implementiert - der Wert als ASCII-Code zurück liefert, ist eine solche Tabelle immer wieder hilfreich.

Hier das Kommunikationsprotokoll für Abfragen:

Kommunikatio epir 01

Quelle: Zilog

In diesem Beispiel senden wir ein 'a' an den ePIR, da wir wissen wollen, ob eine Bewegung erkannt wurde. Der ePIR antwortet uns mit einen "Y"gleich "Ja" oder eben mit einem "N" wie "Nein".

Und hier der entsprechende Sketch:

/* Einfacher Sketch für serielle Kommunikation mit ePIR
   Abfrage an ePIR, ob Bewegung erkannt (senden 'a')
   getestet mit Leonardo unter IDE 1.5.6rc2
   Rev. 0.1 2014-07-01
   fribbe fuer http://macherzin.net
   unter Public domain
   
   Arduino ePIR
   3,3V    2, 6
   GND   1, 8
   9       3 (RX)
   8       4 (TX), ueber Widerstand 10K
*/

#include  // binde Bibliothek ein

SoftwareSerial EPIR (8, 9); // RX = 8, TX = 9

static char HOLE_ZEICHEN()
{
  while (EPIR.available() > 0) // wenn ePIR verfügbar
  {
    return EPIR.read(); // lese Wert von ePIR
  }
}

void setup()
{
  Serial.begin(9600); // starte serielle Konsole
  while(!Serial); // fuer Leonardo und Co.
  EPIR.begin(9600); // starte Kommunikation mit ePIR
  delay(2000); // geben Sensor Zeit zur Stabilisierung  
}

void loop()
{
  EPIR.print('a'); // Befehl an ePIR, wahlweise
  Serial.println((uint8_t)HOLE_ZEICHEN(), DEC);
  // euer Code
  delay(1000); // Ausgabe fuer Menschen lesbar
}

// haben fertig

Kontrolle ePIR

Wenn wir denn einen ePIR KONFIGURIEREN wollen, sieht das Kommunikationsprotokoll ein wenig anders aus:

Kontrolle ePIR seriell

Quelle: Zilog

Hier ein Beispiel, in dem wir die Bewegungserkennung deaktivieren (z.B. während der Geschäftszeiten eines Betriebs)

/* Einfacher Sketch für serielle Kommunikation mit ePIR
   konfigurieren ePIR Bewegungserkennung (senden 'H'und Parameter 'N')
   keine Ausgabe auf serieller Konsolle, wird schon werden ...
   getestet mit Leonardo unter IDE 1.5.6rc2
   Rev. 0.1 2014-07-01 fribbe fuer http://macherzin.net
   unter Public domain
   
   Arduino ePIR
   3,3V    2, 6
   GND     1, 8
   9       3 (RX)
   8       4 (TX), ueber Widerstand 10K
*/

#include  // binde Bibliothek ein

SoftwareSerial EPIR (8, 9); // RX = 8, TX = 9

static char HOLE_ZEICHEN()
{
  while (EPIR.available() > 0) // wenn ePIR verfügbar
  {
    return EPIR.read(); // lese Wert von ePIR
  }
}

void setup()
{
  EPIR.begin(9600); // starte Kommunikation mit ePIR
  delay(2000); // geben Sensor Zeit zur Stabilisierung  
}

void loop()
{
  EPIR.print('H'); // Kontrollzeichen fuer Bewegungserkennung-Deaktivierung ...
  EPIR.print('Y'); // aktivieren, heißt Bewegungserkennung NICHT AKTIV
  // alternativ:
  //EPIR.print('H'); // Kontrollzeichen fuer Bewegungserkennung-Deaktivierung ...
  //EPIR.print('N'); // deaktivieren, heißt Bewegungserkennung AKTIV
  
  // euer Code
  delay(1000); // Ausgabe fuer Menschen lesbar
}

// haben fertig

Bezugsquellen