Alternativ zu dem Raspberry Pi Kamera-Modul V2.1 gibt es auch eine Variante, die Bilder und Videos im Infrarot-Spektrum bei ca. 800nm aufnehmen kann. Sie eignet sich also daher gut, um nächtliche Aufnahmen machen zu können, z.B. von Tieren. Um jedoch nicht etliche Stunden an Videomaterial aufzunehmen und sichten zu müssen, kann ein PIR-Sensor verwendet werden, um die Kamera nur dann für eine gewisse Zeit auszulösen, wenn eine Bewegung in der Nähe der Kamera erkannt wird.
Gerade in dunkler Umgebung kann die kleine, rote LED stören, die immer dann aufleuchtet, sobald der Auslöser
aktiv ist. Dies könnte z.B. Tiere verschrecken oder bei einer Sicherheitskamera einen mutmaßlichen Einbrecher
auf die Position der Kamera hinweisen.
Zum deaktivieren der LED editiert man die Datei /boot/config.txt
und fügt folgende Zeile hinzu:
disable_camera_led=1
Nach dem Speichern der Datei muss der RPi neugestartet werden, damit die Änderung wirksam wird.
In den folgenden zwei Bildern wird die "Magic Mushrooms II." zunächst im sichtbaren Licht, dann im Infrarot-Licht gezeigt:
Statt den üblichen PIR-Sensoren mit weißer Streulinse habe ich mich für die Verwendung eines etwas selteneren PIR-Moduls entschieden. Hier gibt es nur drei Anschlüsse (GND, VCC und OUT) und es können keine Feineinstellungen gemacht werden.
(siehe: Setup des RPi)
Die Kamera wird mit dem (mitgelieferten) 15-poliges FFC-Kabel wie üblich verbunden. Die Anschlüsse des
PIR-Moduls habe ich wie folgt mit dem Raspberry Pi verbunden:
PIR-Sensor | RaspberryPi 3 Model B+ |
---|---|
GND | GND (z.B. Pin #6) |
OUT | GPIO 23 (Pin #16) |
VCC | 5V (Pin #2 oder #4) |
Wie in dem Beitrag Kamera mit Bewegungsmeldungssensor und Raspberry Pi zu lesen sind, müssen noch einige Vorbereitungen getroffen werden, damit die folgenden Python-Scripte funktionieren.
Nach dem Hochfahren des RPi habe ich zunächst separat die Funktionalität des PIR-Moduls getestet. Dazu
erstellt man eine Datei pir_test.py
mit folgendem Inhalt:
import RPi.GPIO as GPIO
import time
from datetime import datetime
PIN_SENSOR = 23
GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN_SENSOR, GPIO.IN)
def motionEvent(channel):
dt = datetime.utcfromtimestamp(time.time()).strftime('%Y-%m-%dT%H:%M:%S')
print('Motion detected! (%s)' % dt)
try:
GPIO.add_event_detect(PIN_SENSOR, GPIO.FALLING, callback=motionEvent)
while True:
time.sleep(100)
except KeyboardInterrupt:
print('Exit.')
GPIO.cleanup()
Je nach verwendetem PIR-Modul muss entweder die steigende oder abfallende Flanke im Interrupt verwendet
werden. Hier wurde GPIO.FALLING
benutzt. Zur Ausführung des Script wird folgender Befehl
verwendet:
$ python pir_test.py
Nun sollte auf der SSH-Konsole immer dann ein Text angezeigt werden, wenn der PIR-Sensor eine Bewegung
erkannt hat.
Das folgende Script video_test.py
soll ein 10-sekündiges Video aufzeichnen und auf der
SD-Karte speichern:
from picamera import PiCamera
camera = PiCamera()
camera.resolution = (1024, 768)
camera.start_recording("./video.h264")
camera.wait_recording(10)
camera.stop_recording()
Nach dem Ausführen des Scripts sollte die Datei video.h264
entstanden sein.
Um das Video später in einem Player besser ansehen zu können, kann man es noch vorher zu MP4 konvertieren:
$ MP4Box -add video.h264 video.mp4
Hinweis: Hier wird als "Warte-Funktion" camera.wait_recording()
verwendet und nicht
time.sleep()
, wie in vielen anderen Beispielen angegeben. Dies hat den Vorteil, dass die hier
benutzte Methode während der Pausierung der Ausführung des Scripts weiterhin Sicherheitschecks wegen
auftretender Fehler durchführt, z.B. wenn die SD-Karte voll ist.
Das fertige Programm prüft nun, ob über den PIR-Sensor eine Bewegung erkannt wurde und löst dann die Kamera für eine Video-Aufnahme von 30 Sekunden aus.
import RPi.GPIO as GPIO
import time
from datetime import datetime
from picamera import PiCamera
PIN_SENSOR = 23
GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN_SENSOR, GPIO.IN)
camera = PiCamera()
camera.resolution = (1920, 1080)
def motionEvent(channel):
dt = datetime.utcfromtimestamp(time.time()).strftime('%Y-%m-%dT%H%M%S')
videoPath = './video_' + dt + '.h264'
print('Motion detected! (%s)' % dt)
camera.start_recording(videoPath)
camera.wait_recording(30)
camera.stop_recording()
print('Stopped recording')
try:
GPIO.add_event_detect(PIN_SENSOR, GPIO.FALLING, callback=motionEvent)
while True:
time.sleep(100)
except KeyboardInterrupt:
print('Exit.')
GPIO.cleanup()
Mir sind bisher noch keine nennenswerten Aufnahmen mit nachtaktiven Tieren gelunden, werden aber das Setup in ein entsprechendes Gehäuse verpacken und mich demnächst auf die Lauer legen...
zurück