Kameraaufnahme mit HC-SR501 Bewegungsmelder am Raspberry Pi

Veröffenticht am 26.10.2016    von     in der Kategorie Raspberry Pi, Sensoren     bisher 8 Reaktionen    Zuletzt überarbeitet am 01.10.2023


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.

 

Raspberry Pi mit Kamera und Bewegungssenor
 

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

 

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

  1. Raspberry Pi vorbereiten: Stelle sicher, dass dein Raspberry Pi richtig konfiguriert ist und das Raspbian Betriebssystem aktuell ist.
  2. 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”.
  3. Kameramodul anschließen: Schließe das Kameramodul an den Raspberry Pi an und aktiviere es über die Raspberry Pi Konfigurationsoberfläche.
  4. 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.

 

  • Anschlussbelegung

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.

Danach öffnest du das Konfigurationsprogramm des Raspberry Pi mit

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.

  • Anschluss am CSI-Bus

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.

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.

 

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.


Transparenz-Hinweis:

Die auf dieser Seite verwendeten Produktlinks sind sogenannte Affiliate-Links zu einem Partnerprogramm. Für dich entstehen dadurch keine Mehrkosten, ich erhalte durch deinen Kauf über den Link eine kleine Provision.


Wolfgang Raab – Betreiber von webnist.de

Mein Name ist Wolfgang, ich beschäftige mich nun schon seit 1985 mit der EDV und im Besonderen mit der Software- und Webentwicklung.

Auf diesem Blog schreibe ich über Dinge, die mich begeistern, beschäftigen und ich der Meinung bin, es könnte für andere interessant und hilfreich sein.

Als großer Fan des Raspberry Pi finde ich es spannend, wie man den kleinen Computer in Verbindung mit dem IoT und Smart Home nutzen kann. Deshalb behandeln viele Beiträge auch genau dieses Thema.

Ich bin ein leidenschaftlicher Leser und Fotograf. Wenn ich nicht gerade in einem spannenden Roman versinke, bin ich oft unterwegs, um die Schönheit der Welt mit meiner Kamera einzufangen und zu teilen.

Weitere Infos und Fotos findest du auf einem der folgenden Plattformen.






Mehr erfahren?

Besuche die "About"-Seite meines Blogs und finde heraus, wie du mit mir in den Bereichen Web- und Mobile-Programmierung und Raspberry Pi zusammenarbeiten kannst. Hier beginnt deine digitale Reise.


Unterstützen

Dieser Beitrag hat dir gefallen und konnte dir bei deinem Projekt oder Problem behilflich sein? Dann würde ich mich sehr freuen, wenn du dich mit einer noch so kleinen Spende erkenntlich zeigen möchtest.




  • Oliver schrieb am 7. Juli 2018:

    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

    • Wolfgang schrieb am 8. Juli 2018:

      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

  • Philip schrieb am 23. September 2017:

    Leider funktioniert die Programmierung nicht.
    Wie mein Vorgänger schrieb:

    GPIO initialisiert.
    Überwachung beginnt.

    Danach passiert dann rein gar nichts mehr.
    Schade.

    • Wolfgang schrieb am 26. September 2017:

      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

  • nils schrieb am 6. Juli 2017:

    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

    • Wolfgang schrieb am 9. Juli 2017:

      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


Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Notwendige Felder sind mit * markiert.

 

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.

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.

Aktuelles Video auf YouTube

Beschreibung der Verwendung eines TTP223B Touch Sensors am GPIO Port des Raspberry Pi mit Python.