Erste Schritte mit dem Kameramodul für den Raspberry Pi

Da ist es mir doch glatt gelungen, für rund 30€ eines der neuen Kameramodule zu ergattern, die inzwischen für den Raspberry Pi auf dem Markt sind — während manche Händler erstmal restlos ausverkauft sind und Versandtermine im September oder Oktober anpeilen. Es war zwar durchaus vorher schon möglich, Webcams am RasPi zu betreiben und diesen so etwa als Camserver zu verwenden, jedoch war dies stark von der verwendeten Hardware abhängig, da nicht alle Treiber zuverlässig liefen. Das Kameramodul hingegen ist an den Pi angepasst und wird direkt über die gerade dafür vorgesehene CSI-Schnittstelle angeschlossen.

Technische Details

Kameramodul

Das Kameramodul

Die Rahmendaten, die das Kameramodul aufweist, sind natürlich nicht überragend — das gesamte Raspberry-Projekt ist ja in erster Linie für Tüftler und zu Lehrzwecken gedacht — können sich aber immerhin sehen lassen. So verfügt das Modul über einen 5 Megapixel Sensor und ermöglicht Videoaufnahmen — ohne Ton — mit 1080p (bei 30fps), 720p (bei 60fps) und VGA (bei 90fps), sowie Einzelbilder mit maximal 2592 x 1944 Pixel. Dabei ist die Platine kaum 10mm dick und nicht breiter als 2,5cm.

Auspacken und anschließen

Anschluss des Kabels

Anschluss des Verbindungskabels

Geliefert wird die kleine Kamera in einem Antistatik-Beutel und man ist wohl auch gut damit beraten, die Warnung darauf ernst zu nehmen: Damit die Elektronik keinen Schaden nimmt sollte man sich erden bevor man die Kamera anfasst, indem man etwa einen Heizkörper berührt. Die eigentliche Installation ist unkompliziert: Man zieht den Verschluss des CSI-Port nach oben (siehe Abbildung), achtet beim Einsetzen des Flachbandkabels darauf, wo die Kontakte sitzen und dass das Kabel auf beiden Seiten ebenmäßig in der Schnittstelle verschwindet, und drückt den Verschluss wieder nach unten. Das war’s mit der Hardware.

Kamera-Support aktivieren

Um die Kamera dann unter Raspbian ((Auch andere Betriebssysteme laufen auf dem Pi, in der Entwicklung ist gerade sogar eine Portierung von Android.)) zum Laufen zu kriegen, muss der Kamerasupport aktiviert werden. Verwendet man eine aktuelle Version, ist dieser wohl schon integriert; ((Eine Schritt-für-Schritt-Anleitung wie man Raspbian installiert und konfiguriert, bietet etwa raspiprojekt.de.)) andernfalls muss man sein System zunächst auf den neuesten Stand bringen:

[white_box]sudo apt-get update
sudo apt-get upgrade
[/white_box]

Anschließend muss man den Support noch in der Konfiguration aktivieren, indem man diese über [white_box]sudo raspi-config[/white_box] aufruft und den entsprechenden Menüpunkt anwählt. Zum Abschluss muss noch rebootet werden, bevor der eigentliche Spaß beginnen kann.

Der eigentliche Spaß

Nach dem die Prozedur der Einrichtung überstanden ist, stehen zwei Kommandozeilenprogramme zur Verfügung: raspistill dient der Aufnahme von Bildern, raspivid dementsprechend der Aufnahme von Videos. Beide bringen vielfältige Optionen mit, um die Aufnahme zu steuern. Ein einfacher Programmaufruf, um ein Bild aufzunehmen, sähe etwa so aus:
raspistill -o /pfad/bild.jpg -o oder -output definiert dabei den Speicherort bzw. den Dateinamen des aufgenommenen Bildes.

Und ein simpler Aufruf, um ein Video von 20 Sekunden aufzuzeichnen, so:
[white_box]raspivid -o /pfad/video.h264 -t 20000[/white_box] Auch hier wird mit -o der Ausgabeort und der Dateiname festgelegt. Der Parameter -t bestimmt die Länge des Videos.

Das sind natürlich nur die Grundlagen, die tatsächlichen Möglichkeiten reichen noch deutlich weiter. Eine ausführliche, englischsprachige Dokumentation gibt es natürlich auch.

Was man damit machen kann…

Ein Anwendungsbeispiel, das ich in den kommenden Tagen gerne mal ausprobieren möchte, ist die Aufnahme von Zeitrafferaufnahmen. raspistill bringt dafür schon alles mit, was man braucht. Ein Beispiel: Der Befehl
[white_box]raspistill -o /pfad/bild_%04d.jpg -t 18000000 -tl 30000[/white_box] nimmt für eine Dauer von 5 Stunden (18000000ms) alle 30 Sekunden (30000ms) ein Bild auf und benennt es fortlaufend mit „bild_0001.jpg, bild_0002.jpg“ usf.

Nun gehört es zu den Eigenheiten von Linux, einen Prozess, der von einem Nutzer gestartet wurde, zusammen mit dessen Session zu beenden — unabhängig davon, ob der Prozess gerade aktiv ist oder nicht. Bedient man seinen RasPi also via SSH, so wird der Prozess beendet, sobald die Verbindung getrennt wird. Ideal ist das nicht. Vielmehr möchte ich den RasPi nicht dauerhaft am LAN-Kabel halten oder nur im Empfangsereich meines WLAN verwenden. Dazu ist es notwendig, den Befehl nohup vorzuschalten, der Prozesse auch nach Beenden der Session „am Leben erhält“, bis der Prozess sein reguläres Ende erreicht hat. Das sähe dann so aus:
[white_box]nohup raspistill -o a%04d.jpg -t 18000000 -tl 30000 > /dev/null 2>&1 &[/white_box] Zur Erläuterung:
Der Programmaufruf von eben — raspistill -o a%04d.jpg -t 18000000 -tl 30000 — wird als der Prozess übergeben, der auch bei Beenden der Session beibehalten werden soll.
> /dev/null und 2>&1 dienen der Umleitung der Ausgabe (STDOUT und STDERR) des Prozesses — STDOUT wird nach /dev/null und STDERR in den Standardoutput umgeleitet.
Das abschließende & sorgt schließlich dafür, dass der gesamte Vorgang im Hintergrund ausgeführt wird.

Möchte man den Vorgang dann doch vorzeitig abbrechen, kann man sich des Kommandos [white_box]sudo pkill raspistill[/white_box] bedienen, um den Prozess zu terminieren.

Und wie komme ich an die Aufnahmen?

Um relativ einfach an die Bilder zu kommen, bediene ich mich einer Kombination zweier Möglichkeiten. Zum einen ist das Verzeichnis /boot/, das bei der Installation des Betriebssystems auf der SD-Karte angelegt wird, in FAT32 formatiert, sodass dieses auch angezeigt wird, wenn man die Karte auf einem Windows-Rechner ausliest. Dementsprechend habe ich die Größe dieses Verzeichnisses angepasst (er nimmt jetzt den größten Teil meiner Speicherkarte ein) und dort einen Ordner namens speicher angelegt, in dem meine Aufnahmen abgespeichert werden.

Zusätzlich habe ich für besagten Ordner eine Samba-Freigabe angelegt, womit auf die darin gespeicherten Inhalte auch von Windows-Rechnern (oder anderen Geräten) im gleichen Netzwerk zugegriffen werden kann. Wie das geht, wird etwa hier beschrieben.

Zu viel zu tippen?

Wem das zu viel zu tippen ist oder wer ohnehin größtenteils vorgefertigte Parameter verwenden möchte — oder sich schlicht die elende Umrechnung aller Zeiteinheiten in Millisekunden ersparen möchte — der kann sich natürlich das Leben etwas leichter machen indem er ein eigenes Skript schreibt, das ihm die Arbeit abnimmt. Ich habe mich mal daran versucht einen Code zu schreiben, der das Aufnehmen von Time-Lapse-Serien nach der oben genannten Methode etwas vereinfacht. Da mir aber leider die Zeit fehlt, um ein ausgereiftes Skript zu programmieren, das eventuelle Fehler abfängt oder insgesamt „sauberer“ programmiert ist, dient der folgende Code eher zu Inspirationszwecken. Er ist zwar an sich lauffähig aber wie gesagt in einem eher rudimentären Entwickklungsstadium… Daher ist wohl der folgende Warnhinweis angebracht:
[alert_box]Die Benutzung des folgenden Codes erfolgt auf eigene Gefahr![/alert_box]

#!/bin/bash

#Variable für Ordnernamen mit aktuellem Datum setzen
FOLDERNAME=$(date -u "+%d-%m-%Y")

#Falls Ordner noch nicht vorhanden ist, diesen erstellen
if [ ! -d "/boot/speicher/$FOLDERNAME" ];
    then
    sudo mkdir "/boot/speicher/$FOLDERNAME"
fi

#Variablendeklaration und setzen von Standardwerten
DAUER=3600000    #1 Stunde
INTERVALL=30000  #30 Sekunden

DAUER=$[$1*3600000]
INTERVALL=$[$2*1000]

#Programmaufruf und Rückmeldung
sudo nohup raspistill -o /boot/speicher/$FOLDERNAME/bild_%04d.jpg -t $DAUER -tl $INTERVALL > /dev/null 2>&1 &
echo "Ausführung gestartet. Für $1 Stunde(n) alle $2 Sekunden ein Bild."

Um dieses Skript nutzen zu können, legt man eine neue Datei mit der Endung .sh an — in meinem Fall heißt sie tlapse.sh. In dieser wird der vorgenannte Code eingetragen und die Datei gespeichert. Nun muss die Datei ausführbar gemacht werden:
[white_box]chmod +x tlapse.sh[/white_box] Um nun global auf die Datei zugreifen zu können, verschiebt man sie noch wie folgt:
[white_box]sudo cp tlapse.sh /usr/bin/tlapse ((Sollte man nicht der einzige Nutzer auf dem System sein, sollte man die Datei besser nach /usr/local/bin verschieben.))[/white_box] Danach kann das Skript von jedem Verzeichnis des Systems aus aufgerufen werden:
[white_box]tlapse 3 30[/white_box] nimmt beispielsweise für eine Dauer von 3 Stunden alle 30 Sekunden ein Bild auf und speichert es am voreingestellten Ort.

10 Kommentare

  1. Calamaio

    Hallo Florian,

    tolle Anleitung. Funktioniert bei mir super.
    Beim Date Format in Zeile 4 fehlt noch das + Zeichen. Es müsste

    FOLDERNAME=$(date -u „+%d-%m-%Y“)

    heißen.
    Dann klappt es 😉

    • FlorianKo

      Hallo Calamaio,

      besten Dank für den Hinweis! Hab’s oben im Code korrigiert.

  2. Bastian

    Leider habe ich so meine Probleme mit dem ausführen des Scriptes.

    habe das script im ordner /media/2E7E-88A0 unter dem namen camera.sh

    dann gehe ich in das Verzeichnis /media/2E7E-88A0

    und führe folgenden befehl aus chmod +x camera.sh
    anschließend
    sudo cp camera.sh /usr/bin/camera

    bei der Ausführung aus einem belibigen Verzeichnis von
    camera 3 30
    bekomme ich folgende ausgabe

    bash: /usr/bin/Camera.sh: Keine Berechtigung

    Mein Script habe ich wie folgt angepasst:

    #!/bin/bash

    #Variable für Ordnernamen mit aktuellem Datum setzen
    FOLDERNAME=$(date -u „+%d-%m-%Y“)

    #Falls Ordner noch nicht vorhanden ist, diesen erstellen
    if [ ! -d „/media/2E7E-88A0/Camera/$FOLDERNAME“ ];
    then
    sudo mkdir „/media/2E7E-88A0/Camera/$FOLDERNAME“
    fi

    #Variablendeklaration und setzen von Standardwerten
    DAUER=3600000 #1 Stunde
    INTERVALL=30000 #30 Sekunden

    DAUER=$[$1*3600000]
    INTERVALL=$[$2*1000]

    #Programmaufruf und Rückmeldung
    sudo nohup raspistill -o /media/2E7E-88A0/Camera/$FOLDERNAME/bild_%04d.jpg -t $DAUER -tl $INTERVALL > /de/null 2>&1 &
    echo „Ausführung gestartet. Für $1 Stunde(n) alle $2 Sekunden ein Bild.“

    • FlorianKo

      Also vorweg: Der Artikel ist ja nun schon etwas älter, Raspbian wurde weiterentwickelt und ich habe mich in der Zwischenzeit eher weniger mit der Materie auseinander gesetzt. Zudem sind meine RasPis derzeit alle im Einsatz und ich kann die Sache nicht testen. Nichtsdestotrotz ist das Skript eigentlich so simpel, dass das Problem nicht besonders schwerwiegend sein kann.

      Die Anpassungen im Skript bestehen ja lediglich in der Pfadangabe und dem Namen des Skriptes, wenn ich das richtig sehe; daran sollte es also nicht liegen. Außerdem weist der Fehler ja auf ein Problem mit der Rechtevergabe hin. Welche Rechte die Datei hat, lässt sich mit ls -al herausfinden. Für weitere Informationen zur Rechtevergabe verweise ich mal exemplarisch auf die Seite von selflinux.org.

      Um nun ohne Kenntnis der Benutzerrechte noch einen Lösungsvorschlag abzugeben: Meine erste Idee wäre chmod u+x camera.sh auszuführen (anstatt chmod +x camera.sh). Ansonsten würde ich mal versuchen das Skript als Superuser mit sudo camera 3 30 aufzurufen. Ich hoffe, ich konnte Dir damit etwas helfen!

      • Bastian

        jetzt kommt diese Fehlermeldung:
        /usr/bin/Camera.sh: Zeile 16: *3600000: Syntax Fehler: Operator erwartet. (Fehlerverursachendes Zeichen ist \“*3600000\“).
        /usr/bin/Camera.sh: Zeile 17: *1000: Syntax Fehler: Operator erwartet. (Fehlerverursachendes Zeichen ist \“*1000\“).
        Ausführung gestartet. Für Stunde(n) alle Sekunden ein Bild.
        /usr/bin/Camera.sh: Zeile 20: /de/null: Datei oder Verzeichnis nicht gefunden

        Also sowie es aussieht muss ich es zwangsweise nach usr\bin kopieren.

        • FlorianKo

          Ok, das sieht jetzt schon eher nach nem Fehler aus, der im Skript begründet liegt… Ich bin mir gerade nicht sicher, wo der Fehler genau herkommt – bei mir muss es damals ja funktioniert haben und auch Calamaio berichtete in seinem Kommentar, dass es funktioniert habe. Da der Fehler anscheinend vom Mal-Zeichen abhängt, könntest Du mal versuchen die beiden *-Zeichen mit einem \ zu escapen – also etwa DAUER=$[$1 \* 3600000].

          Also sowie es aus­sieht muss ich es zwangs­weise nach usr\bin kopieren

          Da hast du das Skript doch mit sudo cp camera.sh /usr/bin/camera ohnehin schon hinkopiert, oder habe ich da was falsch verstanden? Der Fehler hat jedenfalls nichts mehr mit Zugriffsrechten zu tun. (Btw.: Was hat denn zum „Erfolg“ geführt? chmod u+x? Dann kann ich das oben ergänzen…)

          • Bastian

            Geht leider auch nicht mit DAUER=$[$1 \* 3600000] – gleicher fehler wie vorher.

            Ich habe es öfters mit „chmod u+x“ versucht -irgendwann hat es geklappt

  3. Bastian

    Ergänzung :

    jetzt stößt er nur noch bei Zeile 20 auf einen Fehler

    sudo nohup raspistill -o /boot/speicher/$FOLDERNAME/bild_%04d.jpg -t $DAUER -tl $INTERVALL > /de/null 2>&1 &

    • Bastian

      Fehler gefunden in der zeile 20 fehlt bei „dev“ das „v“ da steht nur „de“

      • FlorianKo

        Autsch. Tippfehler sind immer bitter bei sowas… (Ich frage mich, wo der herkam. Soweit ich mich erinnere, habe ich mein Skript 1:1 kopiert.) Jedenfalls danke für den Hinweis, ich hab’s oben korrigiert!

        Falls Du das ganze noch etwas ausbauen möchtest, habe ich gerade bei der Recherche diesen Beitrag hier gefunden, der die gleiche Aufgabe deutlich ausgefeilter mit einem Python3-Skript angeht. Scheint mir jedenfalls einen Blick wert.

Schreibe einen Kommentar

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

© 2024 In meinem Kopf…

Theme von Anders NorénHoch ↑