Kameraaufnahme mit HC-SR501 Bewegungsmelder am Raspberry Pi
In diesem Beitrag zeige ich, wie man mit einem PIR-Bewegungssensor vom Typ HC-SR501 auf einem Raspberry Pi unter Python einen Bewegungsmelder realisieren kann. Sobald eine Bewegung erkannt wird, soll eine Kameraaufnahme gemacht werden. Dazu benötigst du einen Raspberry Pi mit dem aktuellen Betriebssystem Raspbian, einen PIR Bewegungssensor HC-SR501 und ein Kameramodul.
Letzte Aktualisierung am 01.10.2023: Der ursprüngliche Beitrag stammt vom 26.10.2016 und wurde heute von mir aktualisiert. Neben einem Update der benötigten Hardware, einer Auflistung der Vor- und Nachteile des HC-SR501, habe ich den Code auf Python 3 angepasst.
Um die Speicherkarte zu schonen, speichere ich die Bilder auf einer Ram-Disk. Die Konfiguration ist schnell gemacht und kann natürlich auch für andere Anwendungen genutzt werden. In meinem Artikel “In 4 Schritten eine Ram-Disk auf dem Raspberry Pi anlegen” kannst du nachlesen, welche Eingaben dafür notwendig sind.
Vorteile und Nachteile des HC-SR501
Bevor wir mit der Einrichtung beginnen, werfen wir einen kurzen Blick auf die Vor- und Nachteile des Bewegungssensors HC-SR501.
Vorteile
- Niedrige Kosten
- Einfache Integration in den Raspberry Pi
- Einstellbare Empfindlichkeit und Zeitverzögerung
Nachteile
- Kann im Freien aufgrund von Umweltfaktoren ungenau sein
- Eingeschränkte Reichweite und Sichtfeld
Benötigte Komponenten
- Raspberry Pi mit aktuellem Raspbian Betriebssystem
- PIR-Bewegungssensor HC-SR501
- Kamera-Modul
- Optional: Ram-Disk zum Speichern der Bilder, um die Speicherkarte zu schonen
Wenn du noch keinen Raspberry Pi eingerichtet hast, dann schaue dir doch einmal meinen Beitrag “Ersteinrichtung eines Raspberry Pi mit Raspberry Pi OS” an.
Einrichtung
- Raspberry Pi vorbereiten: Stelle sicher, dass dein Raspberry Pi richtig konfiguriert ist und das Raspbian Betriebssystem aktuell ist.
- HC-SR501 mit dem Raspberry Pi verbinden: Verbinde den Sensor mit dem Raspberry Pi. Die genaue Vorgehensweise beschreibe ich im nächsten Kaptil “PIR Bewegungssensor HC_SR501”.
- Kameramodul anschließen: Schließe das Kameramodul an den Raspberry Pi an und aktiviere es über die Raspberry Pi Konfigurationsoberfläche.
- Python-Skript erstellen: Erstelle oder kopiere dir das zur Verfügung gestellte Python-Skript, das den Bewegungssensor abfragt und bei erkannter Bewegung ein Bild mit dem Kameramodul aufnimmt.
PIR Bewegungssensor HC-SR501
Für die Erfassung der Bewegung verwende ich einen PIR Bewegungssensor HC-SR501 der mit drei female-female Jumper Kabel am Raspberry Pi angeschlossen wird. Da die Eingangsspannung 5 V und die Ausgangsspannung 3,3V beträgt, kann der Anschluss direkt an den entsprechenden GPIO Pins erfolgen. In meinem Beispielsaufbau sind dies die Pins 2 für die 5 Volt, der Pin 6 für den GND und der Pin 37 als GPIO 26 als Spannungseingang.
Kameramodul
Persönlich verwende ich für Überwachungsaufgaben noch ein Modul mit der Bezeichnung Ref. 1.3, da ich der Meinung bin die gebotenen 5 Megapixel sind ausreichend. Bei dem neuen Kameramodul mit der Bezeichnung V2.1 mit 8 MP und gleicher Videoauflösung wie dem Vorgängermodell wird nicht nur auf Amazon die Problematik der Unschärfe von Benutzern bemängelt. Solltest du also noch ein “altes” Kameramodul besitzen, kannst du getrost von einer Neuanschaffung absehen. Wenn du dir jedoch erst ein Kameramodul zulegen musst/möchtest, dann schaue dir doch mal meinen kleinen Vergleichstest zwischen Kameramodul Ref 1.3 Klon und Original an.
Die Einrichtung des Kameramoduls am Raspberry Pi erfolgt in wenigen Schritten. Nach dem direkten Anschluss an den Raspberry Pi CSI-Bus bootest du den RasPi und öffnest dort das Terminal-Programm. Mit folgenden Befehlen bringst du das System auf den neusten Stand.
1 2 |
sudo apt-get update sudo apt-get upgrade |
Danach öffnest du das Konfigurationsprogramm des Raspberry Pi mit
1 |
sudo raspi-config |
und wählst dort den Menüpunkt 3 Interface Options und dann Punkt I1 Legacy Camera Enable aus. Die erscheinende Frage “Would you like the camera interface to be enabled?” bestätigst du mit <Ja>.
Nach einem Neustart des Raspberry Pi kannst du auf die Kamera zugreifen. Eine Testaufnahme kannst du direkt vom Terminal aus mit folgendem Befehl durchführen.
1 |
raspistill -v -o test.jpg |
Eine Übersicht über wichtige und häufig verwendete Befehle stelle ich dir auf einem kleinen Spickzettel für Raspberry Pi OS Befehle zur Verfügung.
Das Python-Programm
Das folgende Python-Skript zeigt dir, wie du den Sensor abfragen und bei Bewegung ein Foto aufnehmen kannst. Stelle sicher, dass du die notwendigen Bibliotheken vorher installiert hast.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
#!/usr/bin/python # coding=utf-8 # hc-sr501undkamera.py # Bewegungsmelder löst Kameraaufnahme aus #------------------------------------------------------------ # Einbindung der notwendigen Grundbibliotheken import os, sys, time # Einbindung GPIO's für Bewegungsmelder import RPi.GPIO as gp # Einbindung der Kamera import picamera # Global Pfad der Bilder bilderPfad = "/var/ramdisk/" # Wichtig - zu Testzwecken werden die Bildaufnahmen in der Ram-Disk gespeichert!!!! def gpioInitalisieren(): # GPIO zur Verwendung vorbereiten try: # GPIO für HC-SR501 Bewegungsmelder initialisieren gp.setmode(gp.BCM) # BCM Nummern verwenden gp.setwarnings(False) # Warnmeldungen abschalten gp.setup(26, gp.IN) # Pin 37 - BCM Bummer 26 - GPIO26 wird Eingang print ("GPIO initialisiert.") except: print ("Fehler bei der GPIO-Initialisierung.") def aktuelleZeit(werta, wertb): zeitpunktMessung = time.localtime() jahr, monat, tag = zeitpunktMessung[0:3] stunde, minute, sekunde = zeitpunktMessung[3:6] systemUhrzeit = str(stunde).zfill(2) + ":" + str(minute).zfill(2) + ":" + str(sekunde).zfill(2) systemDatum = str(tag).zfill(2) + "." + str(monat).zfill(2) + "." + str(jahr) if werta == "time" and wertb == "date": ermittelteZeit = systemUhrzeit + " " + systemDatum elif werta == "date" and wertb == "time": ermittelteZeit = systemDatum + " " + systemUhrzeit elif werta == "time" and wertb == "": ermittelteZeit = systemUhrzeit elif werta == "date" and wertb == "": ermittelteZeit = systemDatum else: ermittelteZeit = zeitpunktMessung return ermittelteZeit def meldungBewegung(channel): # Sensor meldet Bewegung global bilderPfad print ("Bewegung gemeldet") # Generierung des Dateinamen aufnahmeZeitpunkt = aktuelleZeit("date", "time") dateiName = bilderPfad + aufnahmeZeitpunkt + ".jpg" # Kamera initialisieren try: cam = picamera.PiCamera() cam.resolution = (1024, 768) # Auflösung für Bildspeicherung print ("Bildaufnahme unter Dateiname ", dateiName, " gespeichert.") cam.start_preview() # Camera warm-up time time.sleep(2) cam.capture(dateiName) cam.close() # damit die Kamera nicht ständig in Betrieb ist except: # Fehler bei der Aufnahme print ("Fehler bei der Bildaufnahme.") #GPIO initialisieren gpioInitalisieren() # Überwachung des Bewegungssensor HC-SR501 print ("Überwachung beginnt.") gp.add_event_detect(26, gp.FALLING, callback=meldungBewegung) # an GPIO 26 - Pin 37 |
Die Bibliothek time ist nicht zwingend notwendig, allerdings verwende ich in dem Beispiel die aktuelle Zeit zur Generierung des Dateinamens. Zur Ansteuerung des Bewegungssensors wird der GPIO 26 als Eingang initialisiert. Die Überwachung, ob eine Spannung am GPIO-Eingang anliegt, wird mit der Funktion event_derecred() in einem Interrupt durchgeführt. Folgende Angaben finden hier Verwendung:
- channel = 26 # GPIO-Pin
- für das Erkennen einer fallenden Flanke 1 zu 0 : gp.FALLING
- als Callback-Funktion wird mit callback=meldungBewegung die Kameraaufnahme in def meldungBewegung(channel) aufgerufen
Weitere Informationen zur Interrupt-Verarbeitung mit Python am Raspberry Pi findest du auf gleichnamigen Beitrag auf netzmafia.de.
Zur Bildaufnahme in meldungBewegung() greife ich auf die Bibliothek picamera zurück. Diese muss eventuell noch auf dem Raspberry Pi mit folgenden Befehlen installiert werden.
1 |
sudo apt-get install python-picamera python3-picamera |
Fazit und Ausblick
Mit dem oben beschriebenen Setup kannst du deinen Raspberry Pi nutzen, um bei erkannter Bewegung Kameraaufnahmen zu machen. Je nach Verwendungszweck und Installationsort solltest du die Empfindlichkeit des HC-SR501 entsprechend anpassen.
Hallo Wolfgang,
zunächst vielen Dank für das Script. Ich habe es zum laufen bekommen und steuere damit eine Spiegelreflexkamera in einem “Fakeblitzer” ( keine Angst wir nutzen den nur auf Autotreffen als Gimmick, um den Teilnehmern ein paar nette Bilder mitzugeben 😉 )
Ich bekomme das angepasste Script aber nicht über Autostart im Hintergrund zum laufen. Hier mal das Script. Im python editor läuft es super! Es ist nur doof jedes mal vor der Inbetriebnahme, remote auf dem Raspberry das Script zu starten.
Vielleicht hast du ja einen Tipp.
#!/usr/bin/python3
# coding=utf-8
# Python Version 3
# hc-sr501undkamera.py
# Bewegungsmelder löst Kameraaufnahme aus
#————————————————————
# Einbindung der notwendigen Grundbibliotheken
import os, sys, time, signal, subprocess
# Einbindung GPIO’s für Bewegungsmelder
import RPi.GPIO as gp
# Einbindung der Kamera
import picamera
# Dateime und Gp2 einbinden
from datetime import datetime
from sh import gphoto2 as gp2
from subprocess import call
def killGphoto2Process():
p = subprocess.Popen([‘ps’, ‘-A’], stdout=subprocess.PIPE)
out, err = p.communicate()
# Search for the process we want to kill
for line in out.splitlines():
if b’gvfsd-gphoto2′ in line:
# Kill that process!
pid = int(line.split(None,1)[0])
os.kill(pid, signal.SIGKILL)
# Global Pfad der Bilder
bilderPfad = “/home/pi/Pictures/Blitzer/”
# Wichtig – zu Testzwecken werden die Bildaufnahmen in der Ram-Disk gespeichert!!!!
def gpioInitalisieren():
# GPIO zur Verwendung vorbereiten
try:
# GPIO für HC-SR501 Bewegungsmelder initialisieren
gp.setmode(gp.BCM) # BCM Nummern verwenden
gp.setwarnings(False) # Warnmeldungen abschalten
gp.setup(26, gp.IN) # Pin 37 – BCM Bummer 26 – GPIO26 wird Eingang
print (“GPIO initialisiert.”)
except:
print (“Fehler bei der GPIO-Initialisierung.”)
def aktuelleZeit(werta, wertb):
zeitpunktMessung = time.localtime()
jahr, monat, tag = zeitpunktMessung[0:3]
stunde, minute, sekunde = zeitpunktMessung[3:6]
systemUhrzeit = str(stunde).zfill(2) + “:” + str(minute).zfill(2) + “:” + str(sekunde).zfill(2)
systemDatum = str(tag).zfill(2) + “.” + str(monat).zfill(2) + “.” + str(jahr)
if werta == “time” and wertb == “date”:
ermittelteZeit = systemUhrzeit + ” ” + systemDatum
elif werta == “date” and wertb == “time”:
ermittelteZeit = systemDatum + ” ” + systemUhrzeit
elif werta == “time” and wertb == “”:
ermittelteZeit = systemUhrzeit
elif werta == “date” and wertb == “”:
ermittelteZeit = systemDatum
else:
ermittelteZeit = zeitpunktMessung
return ermittelteZeit
def meldungBewegung(channel):
# Sensor meldet Bewegung
global bilderPfad
print (“Bewegung gerkannt. Bild wir erstellt”)
# Generierung des Dateinamen
aufnahmeZeitpunkt = aktuelleZeit(“date”, “time”)
dateiName = bilderPfad + aufnahmeZeitpunkt + “.jpg”
# Kamera initialisieren
try:
call ([“gphoto2″,”–capture-image-and-download”,”–filename”,”/home/pi/Pictures/Blitzer/photo-%Y%m%d-%H%M%S.jpg”])
#cam = picamera.PiCamera()
#cam.resolution = (1024, 768) # Auflösung für Bildspeicherung
print (“Bildaufnahme unter Dateiname “, dateiName, ” gespeichert.”)
#cam.start_preview()
## Camera warm-up time
#time.sleep(2)
#cam.capture(dateiName)
#cam.close() # damit die Kamera nicht ständig in Betrieb ist
except:
# Fehler bei der Aufnahme
print (“Fehler bei der Bildaufnahme.”)
#GPIO initialisieren
gpioInitalisieren()
# Überwachung des Bewegungssensor HC-SR501
print (“Überwachung beginnt.”)
gp.add_event_detect(26, gp.FALLING, callback=meldungBewegung) # an GPIO 26 – Pin 37
Hallo Oliver,
vielen Dank für Deine Rückmeldung. Es freut mich, wenn mein Skript Verwendung findet. Dein Skript dürfte einen automatischen Aufruf im Autostart nicht verhindern. Hast du dir mal meine beiden Beiträge zum Thema “Python-Skripte automatisch starten” angesehen? Solltest du den Raspberry Pi nicht im Desktop Modus laufen lassen, müsste dir mein Beitrag “Python Script auf dem Raspberry Pi automatisch starten” helfen. Wenn du den Raspberry Pi im Desktop Mdus betreibst, dann ist der Beitrag “Autostart eines Python Programm auf dem Raspberry Pi” eigentlich die richtige Adresse.
Viele Grüße
Wolfgang
Leider funktioniert die Programmierung nicht.
Wie mein Vorgänger schrieb:
GPIO initialisiert.
Überwachung beginnt.
Danach passiert dann rein gar nichts mehr.
Schade.
Hallo Philip,
vielen Dank für Deinen Kommentar. Welche Version von Python und Raspbian verwendest du? Eventuell wird die Interrupt-Verarbeitung nicht mehr bzw. etwas anders unterstützt…
Viele Grüße
Wolfgang
Hallo
habe dein script mal angeschaut. und zum leben zu erwecken.
doch leider nach einem Start legt es wieder auf , als schleife geht das nicht
start OK
GPIO initialisiert.
Überwachung beginnt.
das wars dann .
leider.
weder mit nohup oder screen bleibt dein script aktiv.
aber sonst gut
Hallo,
nach dem Start wartet das Programm auf eine Meldung des Sensors um eine Bildaufnahme zu machen. Siehe hierzu Zeile 76 und die Beschreibung unter dem Code. Ein Abbruch der Überwachung ist nicht Implementiert, kann jedoch durch die Erweiterung des Programmes leicht erfolgen.
Viele Grüße
Wolfgang
Kleiner Hinweis, alle Kommentare werden moderiert.
Dies bedeutet, der Kommentar wird vor der Veröffentlichung durchgelesen und von mir geprüft. Auch behalte ich mir vor, jeden Kommentar zu löschen, der nicht direkt auf das Thema abzielt oder nur den Zweck hat, Leser oder Autoren herabzuwürdigen.
Neuste Beiträge
Kleinen Spickzettel für Raspbian OS Befehle
Entdecke die Welt von Webnist.de
Erfahre mehr über die Hintergründe meines Blogs und wie ich dich bei deinen digitalen Projekten unterstützen kann.Kategorien
KATEGORIEN
Aktuelles Video auf YouTube
Beschreibung der Verwendung eines TTP223B Touch Sensors am GPIO Port des Raspberry Pi mit Python.
Die aktuell 6 derzeit meistbesuchten Beiträge
Beiträge mit den meisten Kommentaren
Funktional Immer aktiv
Vorlieben
Statistiken
Marketing