AM312 (links oben), HC-SR505 (darunter), HC-SR501 (rechts), in der Draufsicht

Miniatur-Bewegungssensoren HC-SR505, AM312 und SR602

HC-SR501 (oben), AM312 (links), HC-SR505 (rechts)
HC-SR501 (oben), AM312 (links), HC-SR505 (rechts)

Wie der HC-SR501 sind auch der HC-SR505, der AM312 und der SR602 pyroelektrische Infrarotsensoren (abgekürzt „PIR”[1]Manchmal wird das »P« in »PIR« auch als »passiv« interpretiert – der Sensor empfängt lediglich Infrarotstrahlung bzw. Wärme, die von einem sich bewegenden … Continue reading) – zur Funktionsweise siehe die kurzen Hinweise im Beitrag zum HC-SR501 und ausführlich in Wikipedia. Die Sensoren sind aber deutlich kleiner als der HC-SR501 – der Durchmesser der Kunststoffkappen ist nur etwa halb so groß.

Dadurch und wegen kleinerer und weniger umfangreich bestückter Platinen sind die Sensoren auf einen kürzeren Entfernungsbereich von 3 bis max. 5 Metern ausgelegt und bieten etwas weniger Funktionsmöglichkeiten: Auslösedauer und Empfindlichkeit sind fest vorgegeben, und sie unterstützen nur wiederholtes Auslösen (repeatable trigger).

Dafür sind die Pins so angebracht, dass die Sensoren direkt auf einem Breadboard eingesteckt werden können – beim HC-SR501 muss man mit einer passenden Buchsenleiste die Pins „verlängern” oder den Sensor mit Dupont-Kabeln und ggf. einer Halterung anschließen. Alle Sensoren haben einen 3-Pin-Anschluss und liefern beim Erkennen einer Bewegung einen HIGH-Pegel am Ausgabepin.

Im März 2021 wurde dieser Beitrag um die Angaben zum Sensor SR602 ergänzt – sowohl bei den technischen Daten als auch zum Einsatz des Sensors am Ende des Beitrags.

Daten der Bewegungssensoren

Sensor: HC-SR501 HC-SR505 AM312 SR602
Versorgungs-
spannung:
5-12 V (max. 20 V) 4,5-12 V (max. 20 V) 2,7-12 V (typisch 3 V) 3,3-15 V
Ausgabesignal HIGH/LOW: 3,3 / 0 V 3,3 / 0 V 2 / 0 V 3,3 / 0 V
Auslösedauer: regelbar von ca. 2 s – >7 min ca. 8 s ±30% 2,3 s ca. 2,5 s
Blockadezeit: ca. 2,5 s[2]Es gibt auch HC-SR501-Module mit einer Blockadezeit (Sperrzeit) von 0,2 s. ? 2,3 s 2 s
Auslösen: wiederholt oder einmalig wiederholt wiederholt wiederholt
Reichweite: regelbar von ca. 4-7 m ca. 3 m ca. 3-5 m ca. 3,5 m (empfohlen; max. 5 m)
Erfassungskegel: ca. 110° <100° ca. 130° <100°
Durchmesser der Kappe: ca. 23 mm ca. 10 mm
+ 1 mm Rand
ca. 13,5 mm ca. 10 mm (im oberen Teil 9 mm)

Alle Sensoren arbeiten in einem Temperaturbereich von -20 bis +60°C, der HC-SR501 und HC-SR505 bis +70°C.[3]Man findet auch +80°C als Obergrenze der Arbeitstemperatur – je nach Quelle.

Bei Direktbestellung in China liegen die Preise jeweils deutlich unter 1 €, wobei der HC-SR501 ein paar Cent günstiger als die kleinen Sensoren ist. Im deutschen Versandhandel beginnen die Einzelpreise bei etwa 2 € (jeweils plus Versandkosten).

Datenblätter

Das Bild oberhalb des Inhaltsverzeichnisses zeigt die Sensoren im Größenvergleich mit einem 1-Cent-Stück, eine Ansicht von oben auf die Kappen (mit den Fresnel-Linsen) gibt das Beitragsbild.

Auslösung

Wird eine Bewegung erkannt, löst der Sensor aus – das Ausgabesignal wird auf HIGH gesetzt. Dort bleibt es eine gewisse Zeit (oben in der Tabelle »Auslösedauer« genannt; auch Verzögerungszeit bzw. englisch delay time) und geht danach wieder auf LOW. Danach ist der Sensor eine kurze Zeit gesperrt (Sperr- oder Blockadezeit; Angaben locked / lock time / blockade time in den Datenblättern) – in dieser Zeit erkennt er keine Bewegungen.

  • »Wiederholtes« Auslösen (repeatable trigger) bedeutet, dass beim Erkennen einer weiteren Bewegung während der Auslösedauer die Zeit neu zu laufen beginnt – wiederholte Bewegungen führen also zu einer Verlängerung der Auslösedauer, und der Sensor liefert entsprechend lange ein HIGH-Signal.
  • »Einmaliges« Auslösen (single trigger) bedeutet, dass nach dem Erkennen einer Bewegung das Ausgabesignal genau für die Auslösedauer auf HIGH geht und danach auf LOW. Neue Bewegungen werden erst wieder registriert, nachdem die anschließende Blockade- oder Sperrzeit abgelaufen ist.

Sowohl AM312 als auch HC-SR505 und SR602 arbeiten mit wiederholtem Auslösen. Der Signalpin geht also erst dann wieder auf LOW, wenn ein paar Sekunden lang (2 bzw. 8 Sekunden) keine Bewegung erkannt wurde. Da die Auslösedauer nur sehr kurz ist, ist es bei diesen Sensoren sinnvoll, die Schaltlogik (z.B. An- und Ausschalten einer Lampe über ein Relais) einem Mikrocontroller zu überlassen. Mit dem großen Sensor HC-SR501 kann man wegen der einstellbaren Länge der Auslösedauer bis zu mehreren Minuten bei einfachen Schaltungen auf den Controller verzichten.

Anschlusspins des HC-SR505 und AM312

Die Sensoren haben drei Anschluss-Pins: Außen liegen die Versorgungspins (Masse und Spannung), in der Mitte der Ausgabepin.
Grundsätzlich sind die beiden Sensoren austauschbar. Beim Verkabeln muss man aber beachten, dass bei gleicher Ausrichtung der Steckerleiste die Anschlüsse von Masse (GND, –) und Spannung (Vin, +) vertauscht sind; der Signalpin (OUT) ist jeweils der mittlere.

  • Beim HC-SR505 ist die Reihenfolge [– OUT +],
  • beim AM312 [+ OUT –].

Außerdem reichen dem AM312 3,3 Volt, der HC-SR505 benötigt 5 Volt (Details oben in der Tabelle und in den Datenblättern).

Anschlusspins: HC-SR505 (links) und AM312
Anschlusspins: HC-SR505 [– OUT +] (links) und AM312 [+ OUT –]

Programm: Display bei Inaktivität dunkel schalten

Das Beispielprogramm zeigt auf einem Display (OLED mit Treiberchip SSD1306; Anschluss per I2C-Schnittstelle) jede Sekunde einen Text an – um das Beispiel kurz zu halten, einen Fülltext, normalerweise wären das z.B. Datum und Uhrzeit oder Messwerte eines Sensors.

Zu diesem Zweck wird in der Variablen t_now die aktuelle Uhrzeit (bzw. die Anzahl Sekunden seit Programmstart) gespeichert, t_last ist die Sekunde, in der das Display zuletzt aktualisiert wurde, und t_motion ist die Sekunde, in der die letzte Bewegung registriert wurde.

Am Anfang des Hauptprogramms (loop()-Schleife) wird abgefragt, ob eine neue Sekunde begonnen hat – hier kann man auch ein anderes Intervall programmieren. Dann lautet die Anweisung nicht

  1.   if (t_now != t_last) {

sondern z.B. bei einer Aktualisierung alle 5 Sekunden

  1.   if (t_now >= t_last + 5) {

Wurde eine Bewegung erkannt (der Sensor-Ausgabepin ist auf HIGH-Pegel), wird der Zeitpunkt aktualisiert und das Display als „aktiv” gekennzeichnet (Variable b_display_off ist dann false).
Falls das Display aktiv ist, wird der gewünschte Text ausgegeben und der Zeitpunkt der letzten Ausgabe aktualisiert. Wurde keine Bewegung erkannt, wird außerdem geprüft, ob der Zeitpunkt der letzten erkannten Bewegung länger als die definierte Wartezeit her ist. Falls ja, wird das in der Variablen b_display_off gespeichert und das Display gelöscht. (Ein richtiges Abschalten ist nicht möglich – es wird stattdessen ein leerer Displaypuffer angezeigt.)

  1. /* Anzeige von Dummy-Text auf OLED-Display
  2.  * (Typ SSD1306 128*64 Pixel)
  3.  *
  4.  * PIR-Sensor SR505 prüft, ob Bewegung in der Nähe
  5.  * stattfindet; bei einer gewissen Zeit Ruhe wird das
  6.  * Display gelöscht (wie ein Bildschirmschoner)
  7.  *
  8.  * 2021-01-20 Heiko (unsinnsbasis.de)
  9.  */
  10.  
  11. // Bibliothek für das Display
  12. // bindet auch <Adafruit_GFX.h>, <SPI.h>, <Wire.h> ein
  13. #include <Adafruit_SSD1306.h>
  14.  
  15. // Digitalpin für den Bewegungssensor
  16. #define SR505_PIN 13  // entspricht D7
  17. // Zeitspanne von Inaktivität bis zum "Abschalten" des Displays
  18. // 900 Sekunden = 15 min
  19. #define NO_ACTIVITY_SECS 900
  20.  
  21. // I2C-Adresse des Displays (0x3C oder 0x3D)
  22. #define DISPLAY_I2C_ADDRESS 0x3C
  23. // Auflösung des SSD1306-OLED-Displays
  24. #define DISPLAY_WIDTH 128  // Breite in Pixeln
  25. #define DISPLAY_HEIGHT 64  // Höhe in Pixeln
  26.  
  27. // Datenstruktur für das Display
  28. // - Verbindung per I2C (Standard-Pins SCL, SDA)
  29. // - Display hat keinen Reset-Pin
  30. Adafruit_SSD1306 display(DISPLAY_WIDTH, DISPLAY_HEIGHT, &Wire, -1);
  31.  
  32. // Bitrate für die Datenübertragung zum seriellen Monitor
  33. // (ESP: z.B. 115200, Arduino: zwingend 9600)
  34. #define BITRATE 115200  // Arduino: 9600
  35.  
  36. unsigned long t_motion;  // Zeitpunkt der letzten erkannten Bewegung
  37.  
  38. // Anzeigen eines Leer-Textes
  39. void display_text() {
  40.   display.clearDisplay();
  41.   display.setTextColor(WHITE);  // helle Schrift, dunkler Grund
  42.   display.setTextSize(2);       // doppelt hohe Schrift
  43.   display.setCursor(0, 0);
  44.   display.print("Lorem ipsum dolor sit amet, consectetur adipisici elit");
  45.   display.display();
  46. }
  47.  
  48. //----------------------------------------
  49.  
  50. void setup() {
  51.   // Übertragungsrate zum seriellen Monitor setzen
  52.   Serial.begin(BITRATE);
  53.   delay(500);  // kurz warten, bis ser. Monitor bereit
  54.  
  55.   // Digitalpin für den Bewegungssensor
  56.   pinMode(SR505_PIN, INPUT);
  57.  
  58.   // Display initialisieren
  59.   // im Fehlerfall Meldung ausgeben und Programm nicht
  60.   // fortsetzen (leere Dauerschleife))
  61.   if(!display.begin(SSD1306_SWITCHCAPVCC, DISPLAY_I2C_ADDRESS)) {
  62.     Serial.println("SSD1306 nicht gefunden");
  63.     for(;;);
  64.   }
  65.   // Zeitpunkt der letzten Bewegung initialisieren
  66.   t_motion = millis() / 1000;
  67. }
  68.  
  69. //----------------------------------------
  70.  
  71. void loop() {
  72.   unsigned long t_now;  // Sekunden seit Programmstart
  73.   // Sekunde, in der die letzte Ausgabe war
  74.   static unsigned long t_last {0};
  75.   // Flag, ob Display "ruhen" soll
  76.   static bool b_display_off {false};
  77.  
  78.   t_now = millis() / 1000;
  79.  
  80.   if (t_now != t_last) {
  81.     // neue Sekunde, also Textanzeige aktualisieren,
  82.     // wenn das Display nicht im Ruhemodus ist
  83.     if (!b_display_off)
  84.       display_text();
  85.     t_last = t_now;
  86.  
  87.     // bei Bedarf (Fehlersuche?) den Pegel des Sensors ausgeben
  88.     // Serial.println(digitalRead(SR505_PIN) ? "HIGH" : "LOW");
  89.  
  90.     // außerdem prüfen, ob eine Bewegung erkannt wurde
  91.     if (digitalRead(SR505_PIN) == HIGH) {
  92.       t_motion = t_now;  // ja, also Zeitpunkt merken
  93.       b_display_off = false;
  94.     } else {
  95.       // wenn seit längerem keine Bewegung erkannt -> Displaypuffer
  96.       // löschen und anzeigen
  97.       if ((t_motion + NO_ACTIVITY_SECS) < t_now) {
  98.         b_display_off = true;
  99.         display.clearDisplay();
  100.         display.display();
  101.       }
  102.     }
  103.   }
  104.   delay(100);
  105. }

Diagramm: Aufbau der Schaltung

Die Schaltung habe ich mit einem ESP8266 NodeMCU aufgebaut. Für andere Controller muss man nur wissen, welche Pins standardmäßig für die I2C-Schnittstelle des Displays zum Einsatz kommen; außerdem wird ein beliebiger freier Digitalpin für den Sensor-Output benötigt, der auch im Programm definiert werden muss:

  1. // Digitalpin für den Bewegungssensor
  2. #define SR505_PIN 13  // entspricht D7

Im Diagramm werden folgende Pins genutzt:

  • Ausgabe des Sensors HC-SR505 oder AM312 (mittlerer Pin) an GPIO 13 (D7; gelb)[4]Im Diagramm wird für die Bewegungssensoren das Symbol für den großen HC-SR501-Sensor genutzt; für die kleineren Sensoren habe ich bisher kein passendes Symbol gefunden.
  • SCL des Displays an GPIO 5 (D1) des ESP8266 (Standard-Pin für I2C-SCL; blau)
  • SDA des Displays an GPIO 4 (D2) des ESP8266 (Standard-Pin für I2C-SDA; weiß)
  • zu beachten ist, dass der Sensor HC-SR505 (und der „große” HC-SR501) mit 5 Volt arbeiten (Pin VIN des ESP8266; beim ESP32 ist er manchmal auch mit »V5« beschriftet), für den AM312 reichen 3,3 Volt
  • das OLED-Display arbeitet mit der jeweiligen Standard-Spannung des Mikrocontrollers, am ESP8266 und ESP32 also mit 3,3 Volt, am Arduino mit 5 Volt
Diagramm: Bewegungssensor HC-SR505 und OLED-Display SSD1306 am ESP8266 NodeMCU
Diagramm: Bewegungssensor HC-SR505 und OLED-Display SSD1306 am ESP8266 NodeMCU

SR602 – der kleinste der Kleinen

Miniatur-Bewegungssensoren SR602, AM312 und SR505 (vlnr.) in der Draufsicht
Miniatur-Bewegungssensoren SR602, AM312 und SR505 (vlnr.) in der Draufsicht

Der SR602 (auch unter den Namen HC-SR602 und MH-SR602 zu finden) ist ein besonders kleiner Sensor mit einem Durchmesser und einer Höhe der Linsenkappe von 10 mm. Zur Höhe über dem Breadboard kommen etwa 3,5 mm für die Plastik-Ummantelung der Anschlusspins und die Dicke der Platine, insgesamt ist der Sensor also nur knapp 14 mm hoch. Zum Vergleich: Der AM312 hat eine Höhe von ca. 22 mm, der HC-SR505 von ca. 36 mm über dem Breadboard oder einer Platine; jeweils zzgl. etwa 6 Millimeter Länge der Anschlusspins. Die Platine des SR602 hat einen Durchmesser von ca. 18 mm.

SR602 Unterseite
SR602 Unterseite

Die Auslösedauer beträgt standardmäßig 2,5 s und kann durch das Einlöten eines passenden SMD-Widerstands auf der Unterseite der Sensorplatine auf bis zu eine Stunde verlängert werden (im Bild der rechte mit »000« beschriftete Widerstand; zu den Widerstandswerten siehe die Angaben im Datenblatt). Mein Fall sind so feine Lötarbeiten nicht – ich würde das per Programmlogik auf dem Mikrocontroller lösen; grundsätzlich kann so ein Sensor aber natürlich auch ohne Mikrocontroller arbeiten, um z.B. für eine bestimmte Zeit ein Relais zu schalten.

Auch die Empfindlichkeit kann man per Widerstand (linke Bildseite, ebenfalls mit »000« beschriftet) beeinflussen – hierzu habe ich aber keine Details gefunden.[5]Generell ist es nicht ganz leicht, per Suchmaschine ein Datenblatt mit ausführlichen Informationen zu finden. Das oben verlinkte Datenblatt findet man in ähnlicher Form z.B. auf Händler-Seiten … Continue reading Im Datenblatt wird auch erwähnt, dass man durch Einlöten einer F3-Fotodiode an den mit »S+« und »S–« markierten Lötpunkten den Sensor auf Nachtbetrieb umstellen kann, d.h. tagsüber bzw. oberhalb einer bestimmten Umgebungshelligkeit löst er dann nicht mehr aus.
Die Sperrzeit und der Auslösemodus »wiederholt« (repeatable trigger) sind nicht konfigurierbar.

SR602 Oberseite
SR602 Oberseite

Der Ausgabepin (mit »OUT« oder »O« beschriftet) muss über einen Widerstand von 4,7-10 kΩ mit einem Digitalpin des Controllers verbunden werden – der Widerstand ist bei den anderen Bewegungssensoren nicht nötig. Im Datenblatt zum SR602 ist er aber explizit aufgeführt – also habe ich den Sensor nicht ohne getestet. Die Pin-Belegung unterscheidet sich beim SR602 von den anderen beiden Miniatur-Sensoren: in der Mitte liegt die Versorgungsspannung, außen Masse und das Ausgabesignal.

Vergleich der Bauhöhen von SR602, AM312 und SR505 (vlnr.)
Vergleich der Bauhöhen von SR602, AM312 und SR505 (vlnr.)

Fußnoten

Fußnoten
1 Manchmal wird das »P« in »PIR« auch als »passiv« interpretiert – der Sensor empfängt lediglich Infrarotstrahlung bzw. Wärme, die von einem sich bewegenden Objekt in der Nähe abgegeben wird, sendet aber selber keine Signale aus (wie es z.B. Fotoreflektoren machen, die Infrarotlicht mit einer IR-LED abstrahlen und mit einem Fotowiderstand die Menge reflektierten Lichts messen, um Bewegung oder Entfernungsänderungen zu erkennen).
2 Es gibt auch HC-SR501-Module mit einer Blockadezeit (Sperrzeit) von 0,2 s.
3 Man findet auch +80°C als Obergrenze der Arbeitstemperatur – je nach Quelle.
4 Im Diagramm wird für die Bewegungssensoren das Symbol für den großen HC-SR501-Sensor genutzt; für die kleineren Sensoren habe ich bisher kein passendes Symbol gefunden.
5 Generell ist es nicht ganz leicht, per Suchmaschine ein Datenblatt mit ausführlichen Informationen zu finden. Das oben verlinkte Datenblatt findet man in ähnlicher Form z.B. auf Händler-Seiten hier und hier.

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht.