Bemerkung

Hallo, willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Community auf Facebook! Tauchen Sie mit anderen Enthusiasten tiefer in Raspberry Pi, Arduino und ESP32 ein.

Warum beitreten?

  • Expertenunterstützung: Lösen Sie Probleme nach dem Kauf und technische Herausforderungen mit Hilfe unserer Community und unseres Teams.

  • Lernen & Teilen: Tauschen Sie Tipps und Tutorials aus, um Ihre Fähigkeiten zu verbessern.

  • Exklusive Vorschauen: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und Sneak Peeks.

  • Sonderrabatte: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.

  • Festliche Aktionen und Gewinnspiele: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil.

👉 Bereit, mit uns zu entdecken und zu gestalten? Klicken Sie auf [here] und treten Sie noch heute bei!

4.2 Automatische Aufnahmekamera

Einführung

Stellen Sie sich vor, Sie sind nicht zu Hause und ein neugieriges kleines Eichhörnchen besucht Ihr Fensterbrett. Mit diesem Projekt können Sie eine automatische Aufnahmekamera bauen, die solche Momente festhält. Mithilfe eines Bewegungssensors erkennt die Kamera Bewegungen und nimmt in regelmäßigen Abständen Fotos auf.


Was Sie benötigen

Für dieses Projekt werden die folgenden Komponenten benötigt:

KOMPONENTENBESCHREIBUNG

KAUFLINK

Steckbrett

BUY

Jumper-Kabel

BUY

Widerstand

BUY

PIR Bewegungssensormodul

BUY

Kameramodul

BUY

Fusion HAT+

-

Raspberry Pi

-


Schaltplan

Nachfolgend ist der Schaltplan für dieses Projekt dargestellt:

../_images/4.1.2_sch.png

Verdrahtungsdiagramm

  1. Um das Kameramodul bequem zu verwenden, wird Pan-Tilt montieren (für die Kamera) empfohlen.

    Bemerkung

    Das Zusammenbauen der Pan-Tilt-Halterung kann einige Pins verdecken. Daher wird empfohlen, sie nur bei Verwendung der Kamera zu montieren oder sie nach der Montage außen zu platzieren.

    ../_images/gimbal_assemble.png
  2. Folgen Sie diesem Verdrahtungsdiagramm, um die Schaltung aufzubauen:

    ../_images/4.1.2_bb.png
  3. Für eine optimale Leistung stellen Sie die beiden Potentiometer auf dem PIR-Modul ein: eines steuert die Empfindlichkeit und das andere die Erkennungsdistanz. Drehen Sie beide Regler vollständig gegen den Uhrzeigersinn.

    ../_images/PIR_TTE.png

Beispiel ausführen

  1. Greifen Sie auf den Raspberry-Pi-Desktop zu:

    • Remote Desktop: Verwenden Sie VNC für eine vollständige Desktop-Umgebung.

    • Raspberry Pi Connect: Verwenden Sie Raspberry Pi Connect, um sicher über einen Browser auf Ihren Pi zuzugreifen.

  2. Öffnen Sie ein Terminal und wechseln Sie in den Code-Ordner:

    cd ~/ai-lab-kit/python
    
  3. Führen Sie das Skript aus, um die Kamera zu starten:

    sudo python3 4.2_AutomaticCaptureCamera.py
    
  4. Nach dem Start des Skripts:

    • Die Kamera wird gestartet und überwacht kontinuierlich den PIR-Bewegungssensor, der mit GPIO 17 verbunden ist.

    • Wenn der PIR-Sensor eine Bewegung erkennt und sein Ausgang auf HIGH wechselt, nimmt die Kamera ein Foto auf und speichert es im Ordner Pictures mit einem fortlaufenden Dateinamen.

    • Nach jeder Aufnahme wartet das Programm kurz, um Mehrfachaufnahmen zu vermeiden.

    • Das System überwacht weiterhin Bewegungen und läuft, bis Sie Ctrl + C drücken, um es zu beenden.


Code

Hier ist der in diesem Projekt verwendete Python-Code:

#!/usr/bin/env python3

import os
import time
import threading
from picamera2 import Picamera2, Preview
from fusion_hat.pin import Pin, Mode, Pull

# Resolve the correct user's home directory (works with sudo)
REAL_USER = os.getenv("SUDO_USER") or os.getlogin()
USER_HOME = f"/home/{REAL_USER}"
PICTURES_DIR = os.path.join(USER_HOME, "Pictures")
os.makedirs(PICTURES_DIR, exist_ok=True)

# Initialize camera
camera = Picamera2()
camera.configure(camera.create_preview_configuration(main={"size": (800, 600)}))

# Photo counter with thread safety
photo_index = 1
photo_lock = threading.Lock()

# Track whether preview was started successfully
preview_started = False

# Initialize PIR sensor (GPIO 17)
pir = Pin(17, mode=Mode.IN, pull=Pull.DOWN)

def take_photo():
   """Capture one photo and increment the index."""
   global photo_index
   with photo_lock:
      filepath = os.path.join(PICTURES_DIR, f"photo_{photo_index:03d}.jpg")
      print(f"\nMotion detected! Capturing: {filepath}")
      camera.capture_file(filepath)
      print("Saved.")
      photo_index += 1

def main():
   global preview_started

   # Start preview only when a GUI display is available
   preview_started = False
   if os.getenv("DISPLAY"):
      try:
         camera.start_preview(Preview.QT)
         preview_started = True
      except Exception as e:
         print(f"Preview start failed (continue without preview): {e}")
   else:
      print("No DISPLAY detected (running headless without preview).")

   camera.start()

   print("Camera is running.")
   print("PIR sensor monitoring on GPIO 17.")
   print(f"Photos will be saved to: {PICTURES_DIR}")
   print("Press Ctrl+C to exit.\n")

   try:
      while True:
         if pir.value():        # PIR detects motion (HIGH)
            take_photo()        # Take one photo
            time.sleep(2)       # Delay to avoid repeated shots

         time.sleep(0.1)

   except KeyboardInterrupt:
      print("\nExiting...")

   finally:
      try:
         camera.stop()
      except Exception:
         pass

      if preview_started:
         try:
            camera.stop_preview()
         except Exception:
            pass

      try:
         camera.close()
      except Exception:
         pass

if __name__ == "__main__":
   main()

Code verstehen

  1. Importe:

    import os
    import time
    import threading
    from picamera2 import Picamera2, Preview
    from fusion_hat.pin import Pin, Mode, Pull
    

    Das Skript importiert Bibliotheken für Dateiverwaltung (os), Zeitsteuerung (time), Thread-Sicherheit (threading), Kamerasteuerung (Picamera2) und GPIO-Steuerung (Pin).

  2. Einrichten des Speicherpfads:

    REAL_USER = os.getenv("SUDO_USER") or os.getlogin()
    USER_HOME = f"/home/{REAL_USER}"
    PICTURES_DIR = os.path.join(USER_HOME, "Pictures")
    os.makedirs(PICTURES_DIR, exist_ok=True)
    

    Dieser Abschnitt bestimmt das korrekte Home-Verzeichnis des Benutzers und stellt sicher, dass der Ordner Pictures zum Speichern der Fotos vorhanden ist.

  3. Initialisierung der Kamera:

    camera = Picamera2()
    camera.configure(camera.create_preview_configuration(main={"size": (800, 600)}))
    

    Die Kamera wird initialisiert und mit einer Vorschauauflösung von 800 × 600 konfiguriert.

  4. Fotozähler und Thread-Sperre:

    photo_index = 1
    photo_lock = threading.Lock()
    

    Ein Fotozähler wird verwendet, um fortlaufende Dateinamen zu erstellen, und eine Sperre sorgt für sicheren Zugriff während der Fotoaufnahme.

  5. Initialisierung des PIR-Sensors:

    pir = Pin(17, mode=Mode.IN, pull=Pull.DOWN)
    

    Der PIR-Bewegungssensor ist mit GPIO 17 verbunden und als Eingang mit einem Pull-Down-Widerstand konfiguriert.

  6. Funktion zum Aufnehmen eines Fotos:

    def take_photo():
       """Capture one photo and increment the index."""
       global photo_index
       with photo_lock:
          filepath = os.path.join(PICTURES_DIR, f"photo_{photo_index:03d}.jpg")
          print(f"\nMotion detected! Capturing: {filepath}")
          camera.capture_file(filepath)
          print("Saved.")
          photo_index += 1
    

    Diese Funktion nimmt ein Foto auf und speichert es im Ordner Pictures, sobald eine Bewegung erkannt wird.

  7. Vorschau und Start der Kamera:

    preview_started = False
    if os.getenv("DISPLAY"):
       try:
          camera.start_preview(Preview.QT)
          preview_started = True
       except Exception as e:
          print(f"Preview start failed (continue without preview): {e}")
    else:
       print("No DISPLAY detected (running headless without preview).")
    

    Eine Kameravorschau wird nur gestartet, wenn eine grafische Anzeige verfügbar ist; andernfalls läuft das Skript im Headless-Modus.

  8. Hauptschleife (Bewegungserkennung):

    while True:
       if pir.value():
          take_photo()
          time.sleep(2)
    

    Das Programm überwacht kontinuierlich den PIR-Sensor. Wenn eine Bewegung erkannt wird (HIGH), wird ein Foto aufgenommen. Anschließend folgt eine kurze Pause, um Mehrfachaufnahmen zu vermeiden.

  9. Beenden des Programms und Aufräumen:

    except KeyboardInterrupt:
       camera.stop()
       camera.close()
    

    Wenn der Benutzer Ctrl + C drückt, beendet sich das Programm ordnungsgemäß und stoppt sowie schließt die Kamera sicher.


Fehlerbehebung

  1. Fotos werden nicht aufgenommen:

    • Ursache: Der PIR-Bewegungssensor funktioniert nicht oder ist falsch angeschlossen.

    • Lösung:

      • Stellen Sie sicher, dass der PIR-Sensor mit GPIO-Pin 17, der Stromversorgung und der Masse verbunden ist.

      • Passen Sie gegebenenfalls die Empfindlichkeits- und Verzögerungspotentiometer des PIR-Sensors an.

  2. PIR-Sensor erkennt ständig Bewegung:

    • Ursache: Defekter PIR-Sensor oder starke Umgebungsstörungen.

    • Lösung:

      • Testen Sie den Sensor mit einem Multimeter, um sicherzustellen, dass er Bewegungen korrekt erkennt.

      • Platzieren Sie den Sensor in einer stabilen Umgebung, um Fehlalarme zu vermeiden.

  3. Skript stürzt mit einem Kamerafehler ab:

    • Ursache: Die Kamera wurde nicht korrekt initialisiert oder wird von einem anderen Prozess verwendet.

    • Lösung:

      • Stellen Sie sicher, dass die Kamera angeschlossen und über raspi-config aktiviert ist.

      • Starten Sie den Raspberry Pi neu, um mögliche Konflikte zu beheben.


Erweiterungsideen

  1. Zeitgestempelte Dateinamen: Speichern Sie Fotos mit Zeitstempel im Dateinamen, um sie besser zu organisieren:

    timestamp = time.strftime("%Y%m%d-%H%M%S")
    camera.capture_file(f'{user_home}/capture_{timestamp}.jpg')
    
  2. LED-Anzeige: Fügen Sie eine LED hinzu, die aufleuchtet, wenn der PIR-Sensor eine Bewegung erkennt:

    from fusion_hat import Pin
    led = Pin(27)
    if pir.value() == 1:
       led.on()
    else:
       led.off()
    
  3. Fotoverwaltung: Organisieren Sie aufgenommene Fotos automatisch in Ordnern nach Datum oder Ereignis.


Fazit

Dieses Projekt zeigt, wie ein automatisiertes Kamerasystem mit einem PIR-Bewegungssensor und dem Raspberry-Pi-Kameramodul aufgebaut werden kann. Es ist eine gute Möglichkeit, unerwartete Momente festzuhalten und gleichzeitig die Möglichkeiten von IoT und Computer Vision zu erkunden. Sie können das Projekt erweitern, indem Sie zusätzliche Funktionen wie Videoaufnahmen oder Cloud-Uploads für eine Echtzeitüberwachung integrieren.