Permalink

10

Erste Schritte mit dem Kameramodul für den Raspberry Pi

Da ist es mir doch glatt gelun­gen, für rund 30€ eines der neu­en Kame­ra­mo­du­le zu ergat­tern, die inzwi­schen für den Raspber­ry Pi auf dem Markt sind — wäh­rend man­che Händ­ler erst­mal rest­los aus­ver­kauft sind und Ver­sand­ter­mi­ne im Sep­tem­ber oder Okto­ber anpei­len. Es war zwar durch­aus vor­her schon mög­lich, Web­cams am RasPi zu betrei­ben und die­sen so etwa als Cam­ser­ver zu ver­wen­den, jedoch war dies stark von der ver­wen­de­ten Hard­ware abhän­gig, da nicht alle Trei­ber zuver­läs­sig lie­fen. Das Kame­ra­mo­dul hin­ge­gen ist an den Pi ange­passt und wird direkt über die gera­de dafür vor­ge­se­he­ne CSI-Schnitt­stel­le ange­schlos­sen.

Technische Details

Kameramodul

Das Kame­ra­mo­dul

Die Rah­men­da­ten, die das Kame­ra­mo­dul auf­weist, sind natür­lich nicht über­ra­gend — das gesam­te Raspber­ry-Pro­jekt ist ja in ers­ter Linie für Tüft­ler und zu Lehr­zwe­cken gedacht — kön­nen sich aber immer­hin sehen las­sen. So ver­fügt das Modul über einen 5 Mega­pi­xel Sen­sor und ermög­licht Video­auf­nah­men — ohne Ton — mit 1080p (bei 30fps), 720p (bei 60fps) und VGA (bei 90fps), sowie Ein­zel­bil­der mit maxi­mal 2592 x 1944 Pixel. Dabei ist die Pla­ti­ne kaum 10mm dick und nicht brei­ter als 2,5cm.

Auspacken und anschließen

Anschluss des Kabels

Anschluss des Ver­bin­dungs­ka­bels

Gelie­fert wird die klei­ne Kame­ra in einem Anti­sta­tik-Beu­tel und man ist wohl auch gut damit bera­ten, die War­nung dar­auf ernst zu neh­men: Damit die Elek­tro­nik kei­nen Scha­den nimmt soll­te man sich erden bevor man die Kame­ra anfasst, indem man etwa einen Heiz­kör­per berührt. Die eigent­li­che Instal­la­ti­on ist unkom­pli­ziert: Man zieht den Ver­schluss des CSI-Port nach oben (sie­he Abbil­dung), ach­tet beim Ein­set­zen des Flach­band­ka­bels dar­auf, wo die Kon­tak­te sit­zen und dass das Kabel auf bei­den Sei­ten eben­mä­ßig in der Schnitt­stel­le ver­schwin­det, und drückt den Ver­schluss wie­der nach unten. Das war’s mit der Hard­ware.

Kamera-Support aktivieren

Um die Kame­ra dann unter Raspbi­an1 zum Lau­fen zu krie­gen, muss der Kame­ra­sup­port akti­viert wer­den. Ver­wen­det man eine aktu­el­le Ver­si­on, ist die­ser wohl schon inte­griert;2 andern­falls muss man sein Sys­tem zunächst auf den neu­es­ten Stand brin­gen:

sudo apt-get update
sudo apt-get upgrade

Anschlie­ßend muss man den Sup­port noch in der Kon­fi­gu­ra­ti­on akti­vie­ren, indem man die­se über

sudo raspi-config
auf­ruft und den ent­spre­chen­den Menü­punkt anwählt. Zum Abschluss muss noch reboo­tet wer­den, bevor der eigent­li­che Spaß begin­nen kann.

Der eigentliche Spaß

Nach dem die Pro­ze­dur der Ein­rich­tung über­stan­den ist, ste­hen zwei Kom­man­do­zei­len­pro­gram­me zur Ver­fü­gung: raspistill dient der Auf­nah­me von Bil­dern, raspivid dem­entspre­chend der Auf­nah­me von Vide­os. Bei­de brin­gen viel­fäl­ti­ge Optio­nen mit, um die Auf­nah­me zu steu­ern. Ein ein­fa­cher Pro­gramm­auf­ruf, um ein Bild auf­zu­neh­men, sähe etwa so aus:
raspistill -o /pfad/bild.jpg -o oder -output defi­niert dabei den Spei­cher­ort bzw. den Datei­na­men des auf­ge­nom­me­nen Bil­des.

Und ein simp­ler Auf­ruf, um ein Video von 20 Sekun­den auf­zu­zeich­nen, so:

raspivid -o /pfad/video.h264 -t 20000
Auch hier wird mit -o der Aus­ga­be­ort und der Datei­na­me fest­ge­legt. Der Para­me­ter -t bestimmt die Län­ge des Vide­os.

Das sind natür­lich nur die Grund­la­gen, die tat­säch­li­chen Mög­lich­kei­ten rei­chen noch deut­lich wei­ter. Eine aus­führ­li­che, eng­lisch­spra­chi­ge Doku­men­ta­ti­on gibt es natür­lich auch.

Was man damit machen kann…

Ein Anwen­dungs­bei­spiel, das ich in den kom­men­den Tagen ger­ne mal aus­pro­bie­ren möch­te, ist die Auf­nah­me von Zeit­raf­fer­auf­nah­men. raspistill bringt dafür schon alles mit, was man braucht. Ein Bei­spiel: Der Befehl

raspistill -o /pfad/bild_%04d.jpg -t 18000000 -tl 30000
nimmt für eine Dau­er von 5 Stun­den (18000000ms) alle 30 Sekun­den (30000ms) ein Bild auf und benennt es fort­lau­fend mit »bild_0001.jpg, bild_0002.jpg« usf.

Nun gehört es zu den Eigen­hei­ten von Linux, einen Pro­zess, der von einem Nut­zer gestar­tet wur­de, zusam­men mit des­sen Ses­si­on zu been­den — unab­hän­gig davon, ob der Pro­zess gera­de aktiv ist oder nicht. Bedient man sei­nen RasPi also via SSH, so wird der Pro­zess been­det, sobald die Ver­bin­dung getrennt wird. Ide­al ist das nicht. Viel­mehr möch­te ich den RasPi nicht dau­er­haft am LAN-Kabel hal­ten oder nur im Emp­fangs­ereich mei­nes WLAN ver­wen­den. Dazu ist es not­wen­dig, den Befehl nohup vor­zu­schal­ten, der Pro­zes­se auch nach Been­den der Ses­si­on »am Leben erhält«, bis der Pro­zess sein regu­lä­res Ende erreicht hat. Das sähe dann so aus:

nohup raspistill -o a%04d.jpg -t 18000000 -tl 30000 > /dev/null 2>&1 &
Zur Erläu­te­rung:
Der Pro­gramm­auf­ruf von eben — raspistill -o a%04d.jpg -t 18000000 -tl 30000 — wird als der Pro­zess über­ge­ben, der auch bei Been­den der Ses­si­on bei­be­hal­ten wer­den soll.
> /dev/null und 2>&1 die­nen der Umlei­tung der Aus­ga­be (STDOUT und STDERR) des Pro­zes­ses — STDOUT wird nach /dev/null und STDERR in den Stan­dar­d­out­put umge­lei­tet.
Das abschlie­ßen­de & sorgt schließ­lich dafür, dass der gesam­te Vor­gang im Hin­ter­grund aus­ge­führt wird.

Möch­te man den Vor­gang dann doch vor­zei­tig abbre­chen, kann man sich des Kom­man­dos

sudo pkill raspistill
bedie­nen, um den Pro­zess zu ter­mi­nie­ren.

Und wie komme ich an die Aufnahmen?

Um rela­tiv ein­fach an die Bil­der zu kom­men, bedie­ne ich mich einer Kom­bi­na­ti­on zwei­er Mög­lich­kei­ten. Zum einen ist das Ver­zeich­nis /boot/, das bei der Instal­la­ti­on des Betriebs­sys­tems auf der SD-Kar­te ange­legt wird, in FAT32 for­ma­tiert, sodass die­ses auch ange­zeigt wird, wenn man die Kar­te auf einem Win­dows-Rech­ner aus­liest. Dem­entspre­chend habe ich die Grö­ße die­ses Ver­zeich­nis­ses ange­passt (er nimmt jetzt den größ­ten Teil mei­ner Spei­cher­kar­te ein) und dort einen Ord­ner namens speicher ange­legt, in dem mei­ne Auf­nah­men abge­spei­chert wer­den.

Zusätz­lich habe ich für besag­ten Ord­ner eine Sam­ba-Frei­ga­be ange­legt, womit auf die dar­in gespei­cher­ten Inhal­te auch von Win­dows-Rech­nern (oder ande­ren Gerä­ten) im glei­chen Netz­werk zuge­grif­fen wer­den kann. Wie das geht, wird etwa hier beschrie­ben.

Zu viel zu tippen?

Wem das zu viel zu tip­pen ist oder wer ohne­hin größ­ten­teils vor­ge­fer­tig­te Para­me­ter ver­wen­den möch­te — oder sich schlicht die elen­de Umrech­nung aller Zeit­ein­hei­ten in Mil­li­se­kun­den erspa­ren möch­te — der kann sich natür­lich das Leben etwas leich­ter machen indem er ein eige­nes Skript schreibt, das ihm die Arbeit abnimmt. Ich habe mich mal dar­an ver­sucht einen Code zu schrei­ben, der das Auf­neh­men von Time-Lap­se-Seri­en nach der oben genann­ten Metho­de etwas ver­ein­facht. Da mir aber lei­der die Zeit fehlt, um ein aus­ge­reif­tes Skript zu pro­gram­mie­ren, das even­tu­el­le Feh­ler abfängt oder ins­ge­samt »sau­be­rer« pro­gram­miert ist, dient der fol­gen­de Code eher zu Inspi­ra­ti­ons­zwe­cken. Er ist zwar an sich lauf­fä­hig aber wie gesagt in einem eher rudi­men­tä­ren Ent­wick­klungs­sta­di­um… Daher ist wohl der fol­gen­de Warn­hin­weis ange­bracht:

Die Benut­zung des fol­gen­den Codes erfolgt auf eige­ne Gefahr!

Um die­ses Skript nut­zen zu kön­nen, legt man eine neue Datei mit der Endung .sh an — in mei­nem Fall heißt sie tlapse.sh. In die­ser wird der vor­ge­nann­te Code ein­ge­tra­gen und die Datei gespei­chert. Nun muss die Datei aus­führ­bar gemacht wer­den:

chmod +x tlapse.sh
Um nun glo­bal auf die Datei zugrei­fen zu kön­nen, ver­schiebt man sie noch wie folgt:
sudo cp tlapse.sh /usr/bin/tlapse3
Danach kann das Skript von jedem Ver­zeich­nis des Sys­tems aus auf­ge­ru­fen wer­den:
tlapse 3 30
nimmt bei­spiels­wei­se für eine Dau­er von 3 Stun­den alle 30 Sekun­den ein Bild auf und spei­chert es am vor­ein­ge­stell­ten Ort.
  1. Auch ande­re Betriebs­sys­te­me lau­fen auf dem Pi, in der Ent­wick­lung ist gera­de sogar eine Por­tie­rung von Andro­id. 

  2. Eine Schritt-für-Schritt-Anlei­tung wie man Raspbi­an instal­liert und kon­fi­gu­riert, bie­tet etwa raspiprojekt.de

  3. Soll­te man nicht der ein­zi­ge Nut­zer auf dem Sys­tem sein, soll­te man die Datei bes­ser nach /usr/local/bin ver­schie­ben. 

    2 Klicks für mehr Datenschutz: Erst nach einem Klick wird der Button aktiv, da schon beim Aktivieren Daten an Dritte übertragen werden können.

Kategorien Technik & IT Schlagwörter , , , ,

10 Kommentare

  1. Hal­lo Flo­ri­an,

    tol­le Anlei­tung. Funk­tio­niert bei mir super.
    Beim Date For­mat in Zei­le 4 fehlt noch das + Zei­chen. Es müss­te

    FOLDERNAME=$(date -u »+%d-%m-%Y«)

    hei­ßen.
    Dann klappt es 😉

  2. Lei­der habe ich so mei­ne Pro­ble­me mit dem aus­füh­ren des Scrip­tes.

    habe das script im ord­ner /me­dia/2E7E-88A0 unter dem namen camera.sh

    dann gehe ich in das Ver­zeich­nis /me­dia/2E7E-88A0

    und füh­re fol­gen­den befehl aus chmod +x camera.sh
    anschlie­ßend
    sudo cp camera.sh /usr/bin/camera

    bei der Aus­füh­rung aus einem beli­bi­gen Ver­zeich­nis von
    came­ra 3 30
    bekom­me ich fol­gen­de aus­ga­be

    bash: /usr/bin/Camera.sh: Kei­ne Berech­ti­gung

    Mein Script habe ich wie folgt ange­passt:

    #!/bin/bash

    #Varia­ble für Ord­ner­na­men mit aktu­el­lem Datum set­zen
    FOLDERNAME=$(date -u »+%d-%m-%Y«)

    #Falls Ord­ner noch nicht vor­han­den ist, die­sen erstel­len
    if [ ! -d »/media/2E7E-88A0/Camera/$FOLDERNAME« ];
    then
    sudo mkdir »/media/2E7E-88A0/Camera/$FOLDERNAME«
    fi

    #Varia­blen­de­kla­ra­ti­on und set­zen von Stan­dard­wer­ten
    DAUER=3600000 #1 Stun­de
    INTERVALL=30000 #30 Sekun­den

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

    #Pro­gramm­auf­ruf und Rück­mel­dung
    sudo nohup ras­pi­still -o /media/2E7E-88A0/Camera/$FOLDERNAME/bild_%04d.jpg -t $DAUER -tl $INTERVALL > /de/null 2>&1 &
    echo »Aus­füh­rung gestar­tet. Für $1 Stunde(n) alle $2 Sekun­den ein Bild.«

    • Also vor­weg: Der Arti­kel ist ja nun schon etwas älter, Raspbi­an wur­de wei­ter­ent­wi­ckelt und ich habe mich in der Zwi­schen­zeit eher weni­ger mit der Mate­rie aus­ein­an­der gesetzt. Zudem sind mei­ne Ras­Pis der­zeit alle im Ein­satz und ich kann die Sache nicht tes­ten. Nichts­des­to­trotz ist das Skript eigent­lich so sim­pel, dass das Pro­blem nicht beson­ders schwer­wie­gend sein kann.

      Die Anpas­sun­gen im Skript bestehen ja ledig­lich in der Pfad­an­ga­be und dem Namen des Skrip­tes, wenn ich das rich­tig sehe; dar­an soll­te es also nicht lie­gen. Außer­dem weist der Feh­ler ja auf ein Pro­blem mit der Rech­te­ver­ga­be hin. Wel­che Rech­te die Datei hat, lässt sich mit ls -al her­aus­fin­den. Für wei­te­re Infor­ma­tio­nen zur Rech­te­ver­ga­be ver­wei­se ich mal exem­pla­risch auf die Sei­te von selflinux.org.

      Um nun ohne Kennt­nis der Benut­zer­rech­te noch einen Lösungs­vor­schlag abzu­ge­ben: Mei­ne ers­te Idee wäre chmod u+x camera.sh aus­zu­füh­ren (anstatt chmod +x camera.sh). Ansons­ten wür­de ich mal ver­su­chen das Skript als Super­user mit sudo camera 3 30 auf­zu­ru­fen. Ich hof­fe, ich konn­te Dir damit etwas hel­fen!

      • jetzt kommt die­se Feh­ler­mel­dung:
        /usr/bin/Camera.sh: Zei­le 16: *3600000: Syn­tax Feh­ler: Ope­ra­tor erwar­tet. (Feh­ler­ver­ur­sa­chen­des Zei­chen ist \«*3600000\«).
        /usr/bin/Camera.sh: Zei­le 17: *1000: Syn­tax Feh­ler: Ope­ra­tor erwar­tet. (Feh­ler­ver­ur­sa­chen­des Zei­chen ist \«*1000\«).
        Aus­füh­rung gestar­tet. Für Stunde(n) alle Sekun­den ein Bild.
        /usr/bin/Camera.sh: Zei­le 20: /de/null: Datei oder Ver­zeich­nis nicht gefun­den

        Also sowie es aus­sieht muss ich es zwangs­wei­se nach usr\bin kopie­ren.

        • Ok, das sieht jetzt schon eher nach nem Feh­ler aus, der im Skript begrün­det liegt… Ich bin mir gera­de nicht sicher, wo der Feh­ler genau her­kommt — bei mir muss es damals ja funk­tio­niert haben und auch Cala­maio berich­te­te in sei­nem Kom­men­tar, dass es funk­tio­niert habe. Da der Feh­ler anschei­nend vom Mal-Zei­chen abhängt, könn­test Du mal ver­su­chen die bei­den *-Zei­chen mit einem \ zu escapen — also etwa DAUER=$[$1 \* 3600000].

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

          Da hast du das Skript doch mit sudo cp camera.sh /usr/bin/camera ohne­hin schon hin­ko­piert, oder habe ich da was falsch ver­stan­den? Der Feh­ler hat jeden­falls nichts mehr mit Zugriffs­rech­ten zu tun. (Btw.: Was hat denn zum »Erfolg« geführt? chmod u+x? Dann kann ich das oben ergän­zen…)

          • Geht lei­der auch nicht mit DAUER=$[$1 \* 3600000] — glei­cher feh­ler wie vor­her.

            Ich habe es öfters mit »chmod u+x« ver­sucht -irgend­wann hat es geklappt

  3. Ergän­zung :

    jetzt stößt er nur noch bei Zei­le 20 auf einen Feh­ler

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

      • Autsch. Tipp­feh­ler sind immer bit­ter bei sowas… (Ich fra­ge mich, wo der her­kam. Soweit ich mich erin­ne­re, habe ich mein Skript 1:1 kopiert.) Jeden­falls dan­ke für den Hin­weis, ich hab’s oben kor­ri­giert!

        Falls Du das gan­ze noch etwas aus­bau­en möch­test, habe ich gera­de bei der Recher­che die­sen Bei­trag hier gefun­den, der die glei­che Auf­ga­be deut­lich aus­ge­feil­ter mit einem Python3-Skript angeht. Scheint mir jeden­falls einen Blick wert.

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.