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 21.02.2017


Raspberry Pi mit Kamera und BewegungssenorIn diesem Beitrag geht es um die Realisierung eines Bewegungsmelder mit einem PIR Bewegungssensor vom Typ HC-SR501 am Raspberry Pi unter Python. Dabei soll als Aktion bei festgestellter Bewegung eine Kameraaufnahme erfolgen.


Für diesen Aufbau sind neben einem Raspberry Pi mit aktuellem Raspbian Betriebssystem ein PIR Bewegungssensor, ein Kameramodul und ein freier GPIO Pin notwendig. Um die Speicherkarte zu schonen, speichere ich die Bilder in einer angelegten Ram-Disk ab. Die Einrichtung ist schnell erledigt und kann natürlich auch für andere Anwendungen verwendet werden. In meinem Beitrag “In 4 Schritten eine Ram-Disk auf dem Raspberry Pi anlegen” kannst du die notwendigen Eingaben hierzu nachlesen.

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 6 Enable Camera 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 aus dem Terminal mit folgenden Befehl ausführen.

  • Anschluss am CSI-Bus

Das Python-Programm

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.

 



Servus, ich bin Wolfgang.

Blogger – Maker – web & mobile Developer

Mit meinem über die Jahre gesammelten Wissen als Webworker möchte ich dir Hilfestellungen und Anregungen zur Nutzung der sich aus dem digital Lifestyle ergebenden Möglichkeiten und Notwendigkeiten geben.

Einen aktuellen Schwerpunkt auf meinem Blog bildet das Thema IoT im Zusammenspiel mit dem Raspberry Pi.


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.


Hinterlasse einen Kommentar

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

8 Reaktionen (6 Kommentare)

  • 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