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 |
|---|---|
- |
|
Raspberry Pi |
- |
Schaltplan
Nachfolgend ist der Schaltplan für dieses Projekt dargestellt:
Verdrahtungsdiagramm
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.
Folgen Sie diesem Verdrahtungsdiagramm, um die Schaltung aufzubauen:
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.
Beispiel ausführen
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.
Öffnen Sie ein Terminal und wechseln Sie in den Code-Ordner:
cd ~/ai-lab-kit/python
Führen Sie das Skript aus, um die Kamera zu starten:
sudo python3 4.2_AutomaticCaptureCamera.py
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
Picturesmit 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
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).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
Pictureszum Speichern der Fotos vorhanden ist.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.
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.
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.
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.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.
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.
Beenden des Programms und Aufräumen:
except KeyboardInterrupt: camera.stop() camera.close()
Wenn der Benutzer
Ctrl + Cdrückt, beendet sich das Programm ordnungsgemäß und stoppt sowie schließt die Kamera sicher.
Fehlerbehebung
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.
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.
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-configaktiviert ist.Starten Sie den Raspberry Pi neu, um mögliche Konflikte zu beheben.
Erweiterungsideen
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')
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()
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.