Diese Anleitung entstand während der Inbetriebname. Deswegen bitte die Gegebenheiten zu beachten.
Diese Anleitung funktioniert nicht mit Versionen vor 12 (bookworm).
Außerdem verwende ich ein Betriebssystem ohne grafische Oberfläche (macht bei einem Zero durch die 512 MB RAM keinen Sinn).
Ich habe einen Monitor und eine Tastatur angeschlossen um ein paar bestimmte Tests zu machen. Trotzdem arbeite ich remote über ssh. Falls etwas damit nicht geht, werde ich es lokal über tty probieren und das dann natürlich auch erwähnen.
Gegebenheiten:
Raspberry Pi : Zero 2 W
RPi-Kamera : Raspberry Pi Camera Rev 1.3
Betriebssystem : Raspberry Pi OS Lite (64 bit)
Version : 12 (bookworm)
- System vorbereiten
- Befehle zur Kameranutzung
- Beispiele
1. System vorbereiten
Die Dokumentation zu den Kameras auf https://www.raspberrypi.com/documentation/…ies/camera.html.
1.1 Kamera anschließen
Kamera im ausgeschalteten und vom Netzteil getrennten Raspberry Pi anschließen!
Wie die Kamera korrekt angeschlossen wird, wird hier ausführlich beschrieben/gezeigt (incl. Video).
1.2 Netzteil anschließen und RPi booten
Der RPi sollte problemlos booten. Falls nicht, den Anschluß der Kamera prüfen.
1.3 System updaten
sudo apt update && sudo apt dist-upgrade
Evtl. reboot (z.B. wenn der Kernel ein update erfahren hat)
1.4 Kamerasoftware installieren
Der Link zur Beschreibung der Kamerasoftware (Camera software).
Die Kamerasoftware installieren (rpicam-apps):
sudo apt install rpicam-apps
Die Quellen der Software auf Github.
Eine Warnung von den Quellen möchte ich noch erwähnen:
Warning
These applications and libraries have been renamed from libcamera-* to rpicam-*. Symbolic links are installed to allow users to keep using the old application names, but these will be deprecated soon. Users are encouraged to adopt the new application and library names as soon as possible.
1.5 Kamera testen
Seit bookworm braucht es kein raspi-config mehr um die Kamera zu aktivieren.
Edit (23.12.24): In #4 weist Outlaw darauf hin, daß bei neueren Kameras diese nicht über raspi-config aktiviert werden dürfen.
Ob die Kamera erkannt wird, überprüft man mit
rpicam-hello --list-cameras
# Meine Ausgabe
rpicam-hello --list-cameras
Available cameras
-----------------
0 : ov5647 [2592x1944 10-bit GBRG] (/base/soc/i2c0mux/i2c@1/ov5647@36)
Modes: 'SGBRG10_CSI2P' : 640x480 [58.92 fps - (16, 0)/2560x1920 crop]
1296x972 [43.25 fps - (0, 0)/2592x1944 crop]
1920x1080 [30.62 fps - (348, 434)/1928x1080 crop]
2592x1944 [15.63 fps - (0, 0)/2592x1944 crop]
1.5.1 Wenn die Camera nicht erkannt wird
Rufe folgende Webseite auf:
Die Spalte Deiner Kamera in der Zeile 'Sensor' gibt den Hersteller und die Sensorbezeichnung an. Letzteres merken (notieren).
Für meine v1.3 wäre das OV5647.
Editiere (als root, sprich mit sudo) die Datei /boot/firmware/config.txt
Da gehst Du zu der Zeile
camera_auto_detect=1
kommentierst sie ein. Sie sollte jetzt so aussehen:
# camera_auto_detect=1
und danach die Zeile mit der eben ermittelten Sensorbezeichnung darunter hinzufügen (ob Groß-, Kleinschreibung relevant ist, weiß ich nicht. Vermutlich sollte es klein geschrieben werden).
dtoverlay=
gefolgt von der Sensorbezeichnung
Für meine v1.3 würde die Zeile dtoverlay=ov5647 lauten.
Speichern und reboot.
1.6 Kamera LED
Um die Kamera-LED zu aktivieren (leuchtet bei Aufnahme) bzw. zu deaktivieren (bleibt permanent aus):
Editiere (als root, sprich mit sudo) die Datei /boot/firmware/config.txt
Schreibe unter camera_auto_detect (bzw., falls verwendet, unter: dtoverlay=[Sensorbezeichnung])
disable_camera_led=1
Dabei gilt:
0 Kamera-LED ist aktiviert
1 Kamera-LED ist deaktiviert
speichern und reboot.
2. Befehle zur Kameranutzung
Wenn ich von 'Monitor' spreche, ist immer der Monitor am RPi mit der Kamera gemeint.
ssh: bedeutet, das ich mittels ssh den Befehl ausführe
tty: bedeutet, das ich den Befehl direkt am RPi mit der Kamera eingebe
2.1 rpicam-hello
rpicam-hello zeigt kurz (ca. 5s) ein Vorschaufenster mit dem Video-Feed einer angeschlossenen Kamera an.
Bei mir ist der Monitor am RPi an, keine GUI installiert, ich bin nicht über tty angemeldet.
ssh:> rpicam-hello
[0:20:36.016860598] [721] INFO Camera camera_manager.cpp:325 libcamera v0.3.2+27-7330f29b
[0:20:36.132059294] [724] WARN RPiSdn sdn.cpp:40 Using legacy SDN tuning - please consider moving SDN inside rpi.denoise
[0:20:36.138339159] [724] INFO RPI vc4.cpp:447 Registered camera /base/soc/i2c0mux/i2c@1/ov5647@36 to Unicam device /dev/media3 and ISP device /dev/media0
[0:20:36.138563168] [724] INFO RPI pipeline_base.cpp:1126 Using configuration file '/usr/share/libcamera/pipeline/rpi/vc4/rpi_apps.yaml'
Made DRM preview window
Mode selection for 1296:972:12:P
SGBRG10_CSI2P,640x480/0 - Score: 3296
SGBRG10_CSI2P,1296x972/0 - Score: 1000
SGBRG10_CSI2P,1920x1080/0 - Score: 1349.67
SGBRG10_CSI2P,2592x1944/0 - Score: 1567
Stream configuration adjusted
[0:20:36.193167062] [721] INFO Camera camera.cpp:1197 configuring streams: (0) 1296x972-YUV420 (1) 1296x972-SGBRG10_CSI2P
[0:20:36.193915861] [724] INFO RPI vc4.cpp:622 Sensor: /base/soc/i2c0mux/i2c@1/ov5647@36 - Selected sensor format: 1296x972-SGBRG10_1X10 - Selected unicam format: 1296x972-pGAA
Display More
und auf dem Monitor erscheint für ca. 5 Sekunden ein Bild (Framebuffer-Ausgabe).
Mit rpicam-hello -v0 unterdrückt man die Ausgabe auf der Konsole. Das Bild wird am Monitor angezeigt.
Natürlich kann man die Vorschau in Position und Größe noch beeinflussen.
rpicam-hello -f # Vollbild (beachte: das Kamerabild ist nicht 16:9)
rpicam-hello -p 200,100,640,480
2.2 rpicam-jpeg
Erzeugt eine JPEG-Datei.
# Erzeuge eine JPG-Datei im aktuellen Verzeichnis ohne Meldungen und zeige eine Vorschau auf dem Monitor.
ssh:~> $ rpicam-jpeg -v0 -o ./testbild.jpg
# Erzeuge eine JPG-Datei im aktuellen Verzeichnis ohne Meldungen und zeige keine Vorschau auf dem Monitor.
ssh:~> $ rpicam-jpeg -n -v0 -o ./testbild_nopreview.jpg
ssh:~> $ ls *jpg
testbild.jpg testbild_nopreview.jpg
2.3 rpicam-raw
Erzeugt Rohbilder (sogenannte RAW). Diese lassen sich zum Beispiel mit darktable bearbeiten.
Die Bilder, die ich damit erzeugt habe, konnte ich in darktable nicht lesen. Vermutlich braucht es da noch ein paar Parameter. Wenn ich da Erkenntnisgewinn habe, ändere ich das hier.
rpicam-raw -o ./testbild_raw.dng # war nicht bearbeitbar, warum auch immer.
Bei rpicam-still gehe ich auf RAW-Bilder ein.
2.4 rpicam-still
wie rpicam-jpeg, aber im Gegensatz zu rpicam-jpeg unterstützt rpicam-still viele Optionen, die in der Legacy-Anwendung raspistill zur Verfügung stehen.
Mit rpicam-still kann man auch andere Bildformate erzeugen.
Dazu wird die Option -e benutzt. Mögliche Formate sind:
jpg (default), png, bmp, rgb (binärer Dump von unkomprimierten RGB-Pixeln), yuv420 (Binärdump von unkomprimierten YUV420-Pixeln).
# Beispiel png:
rpicam-still -n -v0 -e png -o ./testbild_still.png
identify testbild_still.png
testbild_still.png PNG 2592x1944 2592x1944+0+0 8-bit sRGB 8.09635MiB 0.010u 0:00.001
# erzeugt RAW-Bild und eine JPEG-Datei
rpicam-still --nopreview --raw --immediate --denoise off -o ./testbild_raw_still.jpg
ls testbild_raw_still*
testbild_raw_still.dng testbild_raw_still.jpg
# erzeugt nur ein RAW-Bild
rpicam-still --nopreview --raw --immediate --denoise off -o ./testbild_raw_still2.dng
ls testbild_raw_still*
testbild_raw_still2.dng testbild_raw_still.dng testbild_raw_still.jpg
Display More
2.4.1 Belichtungszeiten (Edit: 19.11.2024)
Natürlich kann man auch die Belichtungszeit vorgeben.
Dazu verwendet man die Option --shutter. Die Angabe erfolgt in Mikrosekunden.
(1/60 = 1 / 60 * 1.000.000 = 16.667 -> --shutter 16667)
rpicam-still -v0 --shutter 16666 -o ./test_1-60.jpg
2.4.2 Lange Belichtungszeiten (Edit: 19.11.2024)
Die maximale Belichtungszeit ist in der Hardware-Spezifikation angegeben. In der Tabelle die Zeile 'Maximum exposure time' suchen und in der Spalte der verwendeten Kamera ablesen. Für meiner Rev 1.3 sind das 3,28 s.
Für lange Belichtungszeiten sollten die automatischen Belichtungseinstellungen (AEC/AGC) und der Weißabgleich (AWB) deaktiviert werden. Dazu gibt man die Optionen --gain und --awbgains an.
Sinnvoll kann auch sein, die Vorschau mit --immediate zu überspringen (rpicam-still --help | grep immediate).
Da ich bezüglich Fotografie eher eine erloschene Kerze statt einer Hellen bin, verweise ich einfach mal auf den Tuning Guide (PDF)
Ein Beispiel möchte ich trotzdem noch anführen. Das habe ich aus einem Astronomieforum und es nach meinen Bedürfnissen angepaßt. Das nutze ich für Zeitrafferaufnahmen in der Nacht:
rpicam-still -v 0 -n --shutter 8010000 --gain 16 --awbgains 1,1 --immediate --denoise off --mode 2028:1520 -o "$PFAD/$BILD"
2.5 rpicam-vid (Edit: 23.11.2024)
2.5.1 lokale Ausgabe
Ein Video für 10 Sekunden im H264-Format aufnehmen und als test-01.h264 speichern.
rpicam-vid -t 10s -o test-01.h264
Wer das Video ohne Anzeige am Monitor und ohne den die Informationen auf der Konsole haben möchte, fügt als Option noch -n -v0 hinzu. Das Video kann man sich dann mit einem Player wie vlc oder mpv anschauen.
Da ich einen Zero 2 W verwende, nutze ich als Videoformat H264.
2.5.2 Streaming
2.5.2.1 Streaming mittels UDP
Auf dem RPi mit der Kamera
rpicam-vid -t 0 --inline -o udp://<ziel-ip>:<port>
und am Zielrechner
vlc udp://@:<port> :demux=h264
oder
mpv udp://@:<port> :demux=h264
Wenn man am Zielrechner den Videoplayer schließt, steht am Zielrechner der Stream weiterhin an, so das man sich immer wieder damit verbinden kann.
2.5.2.1 mittels TCP
Auf dem RPi mit der Kamera
rpicam-vid -t 0 --inline --listen -o tcp://0.0.0.0:<port>
und am Zielrechner
vlc tcp/h264://<ip des RPi>:<port>
Hinweis: Wenn man am Zielrechner den Videoplayer schließt, beendet sich auch rpicam-vid auf dem RPi und es steht kein Videostream mehr zur Verfügung.
3. Beispiele
Werden im Laufe der Zeit ergänzt.
3.1 Zeitraffer (Edit: 20.11.2024)
Um Zeitrafferaufnahmen zu machen, reicht ein Befehl:
rpicam-still -n -v0 -o bwzr_%04d.jpg --timelapse 5000 -t 3600000
Die Zeitangaben sind in Millisekunden. -t 3600000 ist die Angabe, wie Lange Bilder gemacht werden sollen (hier 1h bzw. 3600 Sekunden). --timelapse gibt den Intervall (hier aller 5s). Die Bildnummer wird automatisch hochgezählt.
Um daraus ein Video zu machen, kann man ffmpeg verwenden.
ffmpeg -i bwzr_%04d.jpg zeitraffer_bwzr.mp4 ffmpeg-Optionen darf jeder selbst ermitteln.
Ich schreibe mir gerne Skripte dafür. Ein Zeitrafferskript könnte so aussehen:
Display Spoiler
#!/bin/bash
#
## !! inkompatibel zu dash (cron, at)
mySHELL=$(basename $SHELL)
[ $mySHELL = 'bash' ] || exit 255
#
#
# Kleines Shellskript um Zeitrafferaufnahmen zu machen
#
# Im Variablenbereich werden alle notwendigen Einstellungen,
# die benötigt werden, eingestellt.
#
#
## Variablen ##
# Falls Programme nicht im Pfad liegen, wenn das Skipt durch cron, at, etc. aufgerufen wird
# benötigter voller Pfad
myPATH=''
#
# Zielordner der Bilder
myPixDest="$HOME/Picture/zeitraffer"
# Präfix, der jedem Bildnamen vorgestellt wird
myPfx='ZR'
# Dateiendung
# wer andere Formate verwenden möchte, mußt die Option -e Typ bei myOption mit angeben
# jpg ist default
myExt='jpg'
# Optionen für rpicam-still
# -o -n -v0 sind bereits integriert
# Nachtaufnahme, z.B für Mondaufgang
#myOption='--shutter 8010000 --gain 16 --awbgains 1,1 --immediate --denoise off --mode 2028:1520'
# Normales Bild bei Tag
# -t : Zeit bis zur Aufnahme (sollte nicht zu kurz sein, damit Autofokus und Belichtung besser klappen)
# sollte aber auch nicht die Intervallzeit gefährden.
myOption='-t 500'
# Zeitintervall in Sekunden
myIntervall=3
# Anzahl Bilder, die gemacht werden sollen
# (bei 12s Intervall auf 24 h = 7200 -> bei 25fps 4,8 min)
# (bei myIntervall=3 auf 1 h = 1200 Bilder -> bei 25fps 48 Sekunden Film)
# HINT: berechne den evtl. benötigten Speicherplatz und prüfe, ob er vorhanden ist!
maxPix=1200
#
#
################################
## ab hier nichts mehr ändern ##
################################
PATH=$PATH:$myPATH
export PATH
bomb () {
printf '%s %3s %s\n' 'ERROR' "($2)" "$1"
if [ "x$2" != 'x' ] ; then
exit $2
else
exit 1
fi
}
checkProgramme () {
# überprüfe, ob bestimmte Programme vorhanden und ausführbar sind
# die Programme müssen in $PATH liegen
PRG="rpicam-still"
myfail=''
for p in $PRG
do
type $p > /dev/null 2>&1
[ $? -eq 0 ] || myfail="$p $myfail"
done
if [ "x$myfail" != 'x' ] ; then
bomb "Folgende Programme konnten nicht gefunden werden: $myfail" '3'
fi
}
#######################################################
# Schalter für Skriptentwicklung auf nicht Raspberry Pi
machine=$(uname -m)
if [ "$machine" = 'armv7l' ] || [ "$machine" = 'aarch64' ] ; then
## unbedingt nach der Pfaderweiterung aufrufen!
checkProgramme
else
printf '\t%s \n\t%s\n\t%s %s\n' 'Programmcheck übersprungen.' 'Skript läuft vermutlich nicht auf einem Raspberry Pi' 'uname -m => ' "$machine"
fi
#
#######################################################
# Zielordner check
if [ ! -d "$myPixDest" ] ; then
mkdir -p "$myPixDest" > /dev/null 2>&1
[ $? = 0 ] || bomb 'Konnte Verzeichnis für die Bilder nicht erstellen.' '2'
fi
# die Abarbeitungsschleife
z=${#maxPix} # für Anzahl führender Nullen im Dateinamen
count=0
while [ $count -lt $maxPix ]
do
timestamp=$(date +%s)
((count++))
datetime=$(date +'%Y-%m-%d_%H-%M-%S')
nr="$(printf "%0${z}d" "$count")"
pix="${myPfx}_${nr}__$datetime.$myExt"
# Camshot
printf '%s' $pix
rpicam-still -v 0 --nopreview -o "$myPixDest/$pix" $myOption > /dev/null 2>&1
if [ $? -eq 0 ] ; then
printf '\t%s\n' 'done'
else
printf '\t%s\n' 'fail'
fi
# Wartezeit berechnen
ts2=$(date +%s)
shottime=$(expr $ts2 - $timestamp)
if [ "$shottime" -lt "$myIntervall" ] ; then
sleeping=$(expr $myIntervall - $shottime)
sleep $sleeping
fi
done
#
exit 0
# eof
Display More
Ist sicherlich verbesserungswürdig, aber funktioniert.
3.2 fbi - Bildbetrachter mit framebuffer (ohne X, ohne Wayland) (Edit: 22.11.2024)
Für diejenigen, die keine GUI installiert haben, aber dennoch das Bild direkt am RPi betrachten wollen: Raspberry Pi OS Lite 12 (bookworm) wird standardmäßig mit aktiviertem framebuffer ausgeliefert. Dadurch bekommt man ja auch die Vorschau von den Programmen aus dem Paket rpicam-apps. Aber ein Bildbetrachter ist nicht enthalten. Ergo muß man sich einen installieren. Ich habe mir fbi ausgesucht. Dieser kann die Formate PhotoCD, jpeg, ppm, gif, tiff, xpm, xwd, bmp, png and webp. Wer andere Formate anschauen will, kann diese mit convert aus dem Paket imagemagick konvertieren.
sudo apt install fbi
Allerdings funktioniert fbi nur auf tty. Also nicht mit ssh, was sehr schade ist. Aus der man-Page:
Quote from man fbiBUGS
...
Fbi also needs access to the linux console (/dev/ttyN) for sane console switch handling. That is obvi‐
ously no problem for console logins, but any kind of a pseudo tty (xterm, ssh, screen, ...) will not
work.
Aber wenn man remote die Bilder betrachten will, kann man die ja per scp holen oder man erstellt einen NFS-Export.