Raspberry PiCam
ein kleines Tutorial mit FTP-Upload, Tagesvideo und Langzeitbelichtung

Auf dem Klippeneck läuft seit dem 07.06.2014 ein weiterer Raspberry Pi – in diesem Fall mit Kameramodul. Wir haben ja bereits seit längerer Zeit eine Webcam bei uns oben auf dem Mast laufen, allerdings ist dies eine analoge CCTV-Kamera, die an eine kommerzielle Überwachungsanlage geht. In unserem Fall ist das eine etwa 10 Jahre alte Convision V610A. Leider erlaubt diese nur eine Auflösung von 384px × 288px, was in Zeiten von HD-Monitoren natürlich ein Witz ist. Daher wurde nach einer anderen Lösung gesucht.
Eine kommerzielle Kamera sollte hier abhilfe schaffen, zumindest 640x480px sollte diese können. Für günstiges Geld bestellt, aber die Einstellmöglichkeiten der Kamera waren ebenso bescheiden, dass man weiter suchte.

Tobias (DL1TOB) und Felix (DO5RC) hatten schon länger Raspberry Pis zu Hause liegen bzw. im Einsatz. Irgendwann stieß man auf ein Kameramodul. Also wurde dies bestellt und gleich gestestet. Der erste Eindruck: S-U-P-E-R! Ein sehr gutes Bild, verglichen mit der Größe des Chips / der Platine.
Das Problem daran war: Wir hatten bestimmte vorstellungen, wie es aussehen sollte, doch eine fertig programmierte und gut DOKUMENTIERTE Lösung, war mal wieder nicht im Internet zu finden. Aus verschiedenen Ideen wurde dann schließlich ein Programm durch Felix geschrieben, welches zunächst in einer Schleife die Bilder erstellt und hochlädt. Dies führte aber immer mal wieder dazu, dass sich die Schleife aufhing. So konnte man die Kamera nicht oben an unserem Mast anbringen, nein, da muss schon eine stabil laufende Lösung her. So wurde aus der Schleife ein Script, welches nur einmal ausgeführt wird – einmal pro Minute, um genau zu sein. Allerdings nicht mehr per Schleife, sondern per cronetab!

 

Unsere Anforderungen waren:

·         HD Bild

·         Datum und Uhrzeit im Bild

·         Automatische Blende / Belichtungszeit für Tag- und Nachteinsatz

·         FTP-Upload

 

Nützliche Programme für den Raspberry Pi:

MiniTool Partition Wizard

http://www.heise.de/download/minitool-partition-wizard.html

Win32 Disk Imager

http://www.heise.de/download/win32-disk-imager-1192033.html

 

 

Hier zum Nachbauen eine Anleitung:

Es wird ein Raspberry Pi, das Pi Kamera-Modul, eine Speicherkarte (ab 4GB, Class 10), sowie ein Internetanschluss benötigt.

 

Zunächst wird das Betriebssystem ganz normal aufgesetzt. Hier kann man z.B. das normale Raspbian verwenden. Beim ersten Start wird die Raspi-Config automatisch geöffnet, diese kann aber auch jederzeit im Terminal über „sudo raspi-config“ gestartet werden.

Hier sollte man unter Punkt (1) das Filesystem auf die ganze Speicherkarte erweitern und das (2) Passwort ändern. Weiterhin wird hier das (5) Kamera-Modul aktiviert, als auch im Untermenü (8) Advanced Options der (A4) SSH-Zugang, der sich speziell bei Kameras empfiehlt, auf die man nicht mit Maus, Tastatur und Monitor zugreift. Weiterhin sollte dann eine (3) feste IP vergeben werden.

 



 

Für den FTP-Upload wird ein entsprechendes FTP-Programm benötigt und für das Einblenden von Datum, Uhrzeit und sonstigen Informationen z.B. das Programm imagemagick.

 

Zunächst laden wir aber einmal die Updates und die Upgrades herunter, indem wir eingeben: sudo apt-get update

Anschließend machen wir noch ein Upgrade mit: sudo apt-get upgrade

 

Nun sind wir auf dem aktuellen Stand unseres Betriebssystems. Wie gesagt, benötigen wir noch ein FTP-Programm. Dieses erhalten wir durch die Eingabe von: sudo apt-get install ftp

Auf gleichem Wege installieren wir nun noch das Bildprogramm: sudo apt-get install imagemagick

 

Auf der Konsole sieht das dann so aus:

pi@picam ~ $ sudo apt-get update

pi@picam ~ $ sudo apt-get upgrade

pi@picam ~ $ sudo apt-get install ftp

pi@picam ~ $ sudo apt-get install imagemagick

 

Nun haben wir die Grundvorraussetzungen geschaffen, um das Script zu schreiben. Hierfür verwenden wir einen Editor, z.B. nano, den wir mit einem neuen Scriptnamen aufrufen:

 

pi@picam ~ $ nano picam.sh

 

Jetzt wird automatisch die Datei picam.sh angelegt, in diese kopieren wir unten stehendes Programm hinein und passen noch die FTP-Daten an:
Kopieren: Markieren und dann die Tastenkombination [STRG]+[C] drücken oder per rechter Maustaste auf den markierten Bereich.
Einfügen: Sofern per Putty auf den Raspberry zugegriffen wird und eine leere Datei im nano geöffnet ist, einfach in dieses Fenster mit der rechten Maustaste klicken. Schon wird der Text an der aktuellen Cursorposition eingefügt.

 

#!/bin/bash

#configure your FTP server
HOST=ftpserver.com # This is the FTP server, can be IP address.
USER=ftpuser@ftpserver .com # This is the FTP user.
PASS=passwd # This is the FTP user password.

cd /home/pi

rm raspistill.jpg
rm pre_webcam.jpg
rm w1.jpg
rm image.jpg


raspistill -v -o raspistill.jpg -w 1280 -h 720 -vfhf

composite -gravity center bg.png raspistill.jpg pre_webcam.jpg

convert -pointsize 13 -fill orange -draw "text 10,711 '$(date +"%d.%m.%Y %T UTC") '" pre_webcam.jpg w1.jpg
convert -pointsize 13 -fill orange -draw "text 1080,711 'www.amateurfunk-klippeneck.de'" w1.jpg image.jpg

# Start the FTP client. -i to turn off interactive prompting.
# -n prevents auto login. -v enables verbose output.
ftp -inv $HOST << EOF
user $USER $PASS
put image.jpg
bye
EOF

 

Mit [STRG]+[O] speichern wir die Datei mit [STRG]+[X] schließen wir den Editor.

 

Nun haben wir ein lauffähiges Bash-Script, welches wir testen können, indem wir es aufrufen.

pi@picam ~ $ ./picam.sh

Dieses wird jedoch einen Fehler liefern, da das Bild „bg.png“ nicht gefunden werden kann. Dieses findet ihr hier zum herunterladen: bg.png (1280x720) oder bg_1024.png (1280x1024) (Rechtsklick, speichern unter...)
Es ist die graue Leiste am unteren Bildschirmrand, auf der die Uhrzeit und Daten geschrieben sind. Dieses muss im gleichen Verzeichnis wie das Script liegen (ansonsten den Pfad anpassen ;))

 

Wenn jetzt alles richtig eingegeben wurde, haben wir nun ein Bild auf dem Server.

 

Sitzt die Kamera hinter einer Glasscheibe, so kann die rote Aufnahme-LED stören. Diese lässt sich natürlich auch abschalten.

Hierfür editiert man in den config.txt die entsprechende Zeile. Die Konfig wird über sudo nano /boot/config.txt geöffnet. Dort dann einfach Folgendes ans Ende anfügen: disable_camera_led=1

 

Was macht das Script denn nun eigentlich?

 

#!/bin/bash

MUSS in erster Zeile, an erster Stelle stehen und sagt dem Compiler, wie er die folgenden Daten zu behandeln hat.

 

#configure your FTP server
HOST=ftpserver.com # This is the FTP server, can be IP address.
USER=ftpuser@ftpserver .com # This is the FTP user.
PASS=passwd # This is the FTP user password.

Konfiguration der Daten unseres FTP-Servers

 

rm raspistill.jpg
rm pre_webcam.jpg
rm w1.jpg
rm image.jpg

Löscht die Bilder des vorherigen Durchgangs, rm = remove

 

raspistill -v -o raspistill.jpg -w 1280 -h 720 -vf -hf

Nimmt ein Bild mit den Abmessungen 1280x720p (720p HD) auf und spreichert dieses als raspistill.jpg.

 

composite -gravity center bg.png raspistill.jpg pre_webcam.jpg

Fügt die beiden Bilder bg.png und raspistill.jpg zusammen in die neue Datei pre_webcam.jpg

 

convert -pointsize 13 -fill orange -draw "text 10,711 '$(date +"%d.%m.%Y %T UTC") '" pre_webcam.jpg w1.jpg

Erstellt die Datums und Uhrzeitinformationen auf dem Bild pre_webcam.jpg und spreichert dieses als w1.jpg ab.
10,711 gibt die Position des einzufügenden Textes an, also 10 Pixel vom linken und 711 Pixel vom oberen Rand. Die Schriftgröße beträgt 13 Point, die Schriftfarbe ist orange.

 

convert -pointsize 13 -fill orange -draw "text 1080,711 'www.amateurfunk-klippeneck.de'" w1.jpg image.jpg

Jetzt wird noch eine Information, in diesem Fall unsere URL abgespeichert in das Bild image.jpg

 

# Start the FTP client. -i to turn off interactive prompting.
# -n prevents auto login. -v enables verbose output.
ftp -inv $HOST << EOF
user $USER $PASS
put image.jpg
bye
EOF

Jetzt wird noch der FTP-Zugang geöffnet und das Bild image.jpg abgelegt. Anschließend wird das Programm beendet und wartet auf den nächsten Aufruf.

 

Da die Kamera Sommer wie Winter im Freien montiert ist, musste natürlich ein ordentliches Gehäuse her. Hierfür wurde ein altes Kameragehäuse der Firma Bischke genommen. Uwe Bischke war der Entdecker der Videoüberwachung in Deutschland und brachte mit seinen visionären Ideen die Videoüberwachung voran.

Man kann aber natürlich auch andere Gehäuse nehmen, bereits ab rund 25€ bekommt man wetterfeste Kameragehäuse für den Aussenbereich.

 

 

Für Fragen, Anregungen und Kritik stehen wir gerne zur Verfügung.

vy 55 es 73 de DO5RC, Felix

 

 

 

 

IMG_20140607_120626_339-Bearbeitet-2Und hier noch unser Aufbau im Detail:

·         Links oben der PoE-Adapter, in die freie LAN-Buchse kommt ein Kabel, welches Netzwerk und Strom zur Kamera bringt.

·         An die DC-Buchse ist ein 5V-StepDown-Wandler angeschlossen, der aus den etwa 19V, die uns der Ubiquity liefert, eine saubere 5V Spannung für USB liefert.

·         Daran angeschlossen ist ein normales micro-USB-Lagekabel für Android-Smartphones (ein kürzeres war gerade nicht da ;))
Natürlich könnte man auch direkt über die GPIO-Pins den Raspberry Pi mit Strom versorgen, hier ist aber wichtig zu wissen, welche Version man hat und welche Ports dafür entsprechend zur Verfügung stehen.
https://www.elektronik-kompendium.de/sites/raspberry-pi/1907101.htm

·         In der rechten Buchse ist das eigentliche Netzwerkkabel eingesteckt, welches den PoE-Adapter mit dem Raspberry Pi verbindet.

·         Und schließlich dann rechts der Raspberry Pi mit Kameramodul am Metallwinkel.

 

 

 

Tagesfilm

Wenn man zusätzlich zu dem obigen Script das Bild noch (z.B.) alle 3 Minuten in ein anderes Verzeichnis kopiert, so hat man am Ende des Tages etwa 480 Bilder. Hierbei sollte man den Bildern gleich eine fortlaufende Nummer als Dateinamen geben, da es hiermit am einfachsten funktioniert, ohne das noch einmal umbenannt oder angepasst werden muss.

Kurze Berechnung der Bilderanzahl:
- Alle 3 Minuten Foto sichern = 60min : 3 = 20 Bilder * 24h = 480 Bilder.
- Alle 2 Minuten Foto sichern = 60min : 2 = 30 Bilder * 24h = 720 Bilder.

Aufgepasst: Soll jede Minute oder gar häufiger das Bild gespeichert werden, muss ggf. die Variable angepasst werden, da
%03d nur 3 Stellen hat, also z.B. %05d verwenden, natürlich auch auch beim erstellen des Tagesfilms.

[copy.sh]

#!/bin/sh
cd /home/pi/time_lapse
 
DateString=$(date +"%Y%m%d")
mkdir $DateString

read run < /home/pi/time_lapse/$DateString/var.txt
run=`expr $run + 1`
echo $run > /home/pi/time_lapse/$DateString/var.txt

cp /var/www/cam1.jpg /home/pi/time_lapse/$DateString/$(printf "image_%03d.jpg " $run);

Im einzelnen passiert folgendes:

DateString=$(date +"%Y%m%d")

Erzeugt eine Variable mit dem Namen “DateString”, wo das aktuelle Datum eingespeichert ist. Am 13.03.2016 ist der Inhalt dieser Variablen also 20160313. Mit mkdir $DateString wird anschließend das Verzeichnis des aktuellen Tages erstellt.

read run < /home/pi/time_lapse/$DateString/var.txt
run=`expr $run + 1`
echo $run > /home/pi/time_lapse/$DateString/var.txt

Nun lesen wir aus der Datei var.txt in die Variable "run" ein. Anschließend erhöhen wir den Wert der Variablen um 1. Schließlich wird der Wert der neuen Variablen wieder in die Datei geschrieben. Warum machen wir das so kompliziert, reicht es nicht einfach die Variable zu nutzen? Jein – denn nach einem Neustart des Raspberrys, sei es zu Servicezwecken oder durch einen Stromausfall würde die Variable wieder leer sein und somit die bisher erstellten Bilder des Tages verloren gehen.

Beim Schreiben in die Datei aufgepassen, ein > überschreibt den Inhalt der Datei, zwei >> ergänzt die Datei, hängt also eine weitere Zeile an!

 

Jetzt liegen die Bilder alle in einem Verzeichnis. Um hieraus ein Video zu erstellen, bietet sich avconv an. Ursprünglich hatten wir hier eine Lösung mit mencoder versucht, waren aber nicht sonderlich erfolgreich. Mit diesem neuen Script time_lapse.sh werden die Bilder zu einem mp4-Video umgewandelt. Hierbei ist jedoch zu beachten, dass es avconv als einzelne Installation nicht gibt:

Das Kommandozeilenprogramm avconv ist nämlich Bestandteil einer anderen Installation, daher wird sudo apt-get install libav-tools ausgeführt. 

 
 
 
 
Auf meinem System ist die aktuellste Version bereits installiert.  

 

 [time_lapse.sh]

#!/bin/sh
cd /home/pi/time_lapse/
DateString=$(date +"%Y%m%d")

cd $DateString/
sudo avconv -r 10 -i image_%03d.jpg -r 10 -vcodec libx264 -crf 20 -g 15 $DateString.mp4
sudo mv $DateString.mp4 /var/www/$DateString.mp4
sudo cp /var/www/$DateString.mp4 /var/www/timelapse.mp4

cd /home/pi/time_lapse/

Zunächste wechseln wir dazu mit cd $DateString/ in das aktuelle Tagesverzeichnis.

sudo avconv -r 10 -i image_%03d.jpg -r 10 -vcodec libx264 -crf 20 -g 15 $DateString.mp4

Das Kommandozeilenprogramm avconv setzt nun die Bilder zu einem Video zusammen und gibt anschließend das Tagesvideo als .mp4 aus.

-r 10

Framerate setzen (in Frames/Sekunde), in unserem Fall 10fps

-i image_%03d.jpg

Definiert den Input, also die Quelle. Diese setzt sich zusammen aus „image_“ und der laufenden Nummer und der Dateiendung

%03d

Ist ein Platzhalter für fortlaufende Nummern, in unserem Fall mit 3 Stellen, wobei von links mit Nullen aufgefüllt wird. Das 5. Bild heißt also image_005.jpg

-vcodec libx264

Gibt an, welcher Codec für das Video verwendet werden soll

$DateString.mp4

Hier wird das Video mit dem Tagesdatum versehen als Dateiname abgespeichert

 

Wie kommt man nun an das Video dran, wenn man es der Öffentlichkeit zeigen will (oder selber anschauen, denn das geht über die Konsole ja nicht wirklich ;))?


Lösung 1: Upload auf den FTP-Server
, wie mit den Bilder auch schon geschehen.

[time_lapse.sh]

#!/bin/sh
cd /home/pi/time_lapse/
DateString=$(date +"%Y%m%d")

cd $DateString/
sudo avconv -r 10 -i image_%03d.jpg -r 10 -vcodec libx264 -crf 20 -g 15 $DateString.mp4
sudo mv $DateString.mp4 /var/www/$DateString.mp4
sudo cp /var/www/$DateString.mp4 /var/www/timelapse.mp4

cd /home/pi/time_lapse/

 

# Start the FTP client. -i to turn off interactive prompting.
# -n prevents auto login. -v enables verbose output.
#configure your FTP server

HOST=ftpserver.com # This is the FTP server, can be IP address.
USER=ftpuser@ftpserver .com # This is the FTP user.
PASS=passwd # This is the FTP user password.

put $DateString.mp4
delete timelapse_7.mp4
rename timelapse_6.mp4 timelapse_7.mp4
rename timelapse_5.mp4 timelapse_6.mp4
rename timelapse_4.mp4 timelapse_5.mp4
rename timelapse_3.mp4 timelapse_4.mp4
rename timelapse_2.mp4 timelapse_3.mp4
rename timelapse_1.mp4 timelapse_2.mp4
rename $DateString.mp4 timelapse_1.mp4
bye
EOF

rm -rf $DateString.mp4
rm -rf $DateString/

Hier wird wieder eine FTP-Verbindung zum Server aufgebaut und mit put $DateString.mp4 die aktuelle Datei hochgeladen.
Aber was kommt nun in der Datei? Eigentlich ganz einfach: Ein 7-Tages Archiv für die Tagesfilme der letzten Woche. Da die Filme in der html-Datei statisch eingebunden sind, also keine unterschiedlichen Namen entsprechend dem Datum haben (was natürlich möglich wäre), wird mit
delete timelapse_7.mp4 zunächst das älteste Video gelöscht. Die Befehle sind hier anders, da es sich nicht mehr um die Konsole handelt, sondern hier die FTP-Verbindung mittels des Programms ftp genutzt wird.
Daher wird dann auch mit rename die Datei von vor 6 Tagen in das älteste Video, also vor 7 Tagen umbenannt:
rename timelapse_6.mp4 timelapse_7.mp4

Um unseren lokalen Speicher frei zu halten, wird schließlich noch das Tagesvideo gelöscht, ebenso der Ordner mit den einzelnen Bildern.


Lösung 2: Interner Webserver

Der Raspberry Pi selber kann natürlich auch als Webserver fungieren. Dazu muss lediglich ein entsprechender Serverdienst installiert werden, z.B. Apache oder lighttpd.

 
 
 
 
 
Hierzu gibt es im Internet bereits fertige und gute Anleitungen:
-       http://raspberry.tips/raspberrypi-tutorials/raspberry-pi-als-webserver-teil-1/ 
-       https://www.elektronik-kompendium.de/sites/raspberry-pi/1907241.htm
 
Ich verwende inzwischen den lighttpd mit User für SFTP bei mir, so kann ich anschließend auch mit einem FTP-Programm, z.B. FileZilla auf den Raspberry zugreifen und so Dateien schnell und einfach übertragen.

 

HTML-Code

Haben wir alles richtig gemacht, liegt am nächsten Morgen in unserem Ordner das Tagesvideo von gestern. Bei Browsern, die HTML5 untersützen, lässt sich das Video sehr einfach einbinden:

[index.html]

<html>
  <head>
     <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
     <meta http-equiv="refresh" content="120" >
  </head>
  <body>
     <h1>Meine PiCam</h1>
 
     <p><img src="./image.jpg" target="_blank" /></p>
 
     <h4>Aktuelles Tagesvideo:</h4>
     <video src="./timelapse.mp4" width="800" height="600" autobuffer controls>
        <div>Schade - hier k&auml;me ein Video, wenn Ihr 
        Browser HTML5 Unterst&uuml;tzung h&auml;tte, wie z.B. der 
        aktuelle Firefox</div>
     </video>
 
 
  </body>
</html>
 
Mit der Zeile <meta http-equiv="refresh" content="120" > wird ein automatisches Neuladen der Seite nach 120 Sekunden erzeugt. 

 

Automatisierung 1.0

Natürlich macht es keinen Sinn, wenn man nun die Scripte manuell aufrufen muss, schließlich haben wir es schon so weit automatisiert. Auch hier gibt es verschiedene Lösungen.

Beim Starten des Raspberrys wird die rc.local ausgeführt. Hierüber lassen sich Dateien ganz normal aufrufen:
-       https://www.raspberrypi.org/documentation/linux/usage/rc-local.md 

[rc.local]

#!/bin/sh –e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address


#_IP=$(hostname -I) || true
#if [ "$_IP" ]; then

#fi

sudo mount -t nfs4 192.168.2.40:/ /home/pi/www

sudo /home/pi/start.sh &

exit 0

 

Der Befehl sudo mount -t nfs4 192.168.2.40:/ /home/pi/www mounted, also verbindet eine NTFS-Netzwerkfreigabe in unser Home-Verzeichnis unter dem Namen www. Wenn wir in der Konsole arbeiten, haben wir nun einen Ordner www, dessen Daten aber nicht lokal auf dem Raspberry, sondern z.B. auf einer Netzwerkfestplatte bzw. Freigabe liegen.

Weiterhin wird die Datei start.sh gestartet. Diese Datei kann dann wiederum andere Scripte aufrufen. Diese Datei wurde im Anfang genutzt, um die verschiedenen Scripte aufzurufen:

[start.sh]

#!/bin/bash
#This File will be started @reboot

boot=0
run=0
run3=0

if [ $boot -eq 0 ]; then
        sudo /home/pi/log.sh >> /boot/log.txt
        boot=1
fi


#while true; do
#
#        #Run every minute
#        sudo /home/pi/picam.sh
#
#        #Run every 3 minutes
#        if [ $run3 -eq 1 ]; then
#                sudo /home/pi/time_lapse/copy.sh
#
#                run3=0
#        fi
#
#
#        run=`expr $run + 1`
#        run3=`expr $run3 + 1`
#        sleep 60

#echo $run
#echo $run3
#
#done

Der per Raute auskommentierte Bereich ist eine Schleife, die ohne Ende durchlaufen wird, und das Bild erstellt, bzw. das script picam.sh aufruft. Für den Fall, dass die Variable $run3 der 1 (für alle 2 Minuten ein Bild, Vergleich mit eq 2, für alle 3 Minuten) entspricht, dann wird das Kopierscript copy.sh aufgerufen, um die Bilder für das Tagesvideo zu kopieren. Dieses ist jedoch eine unpräzise Art für „alle 3 Minuten“, da hier der Timer erst dann läuft, wenn der Befehl ausgeführt wurde. Bei einer Nachtaufnahme mit dem Raspberry von 6 Sekunden kommen noch ein paar Sekunden hinzu für das Berechnen. Dann noch die Schriften etc hinzufügen und schon ist man bei fast 3.5 oder gar 4 Minuten.

Meine Bedenken waren: Dieses kann sinnvoll sein, falls es beim Erstellen der Bilder bzw. der Tagesvideo dazu kommt, dass der Raspberry noch am erstellen der Bilder ist, gleichzeitig per Crontab schon der Befehl des kopierens der Bilder für das Tagesvideo ausgeführt wird, was zu Defekten Bildern führen kann. Eventuell lässt sich dies durch eine Pause umgehen bzw. zur 45 Sekunde o.ä. ausführen.

Da sich das Raspberry-Kamera Projekt aber mit der Zeit entwickelt hat, gibt es dafür natürlich auch eine andere, wesentlich genauere Art:

 

Automatisierung 2.0

Wesentlich eleganter ist da natürlich die Verwendung der Crontab.

[/etc/crontab]

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
* *     * * *   root    /home/pi/picam.sh
*/3  *  * * *   root    /home/pi/time_lapse/copy.sh

59 23   * * *   root    /home/pi/time_lapse/time_lapse.sh
#

Für Details zur Nutzung der crontab bietet sich diese Seite an: http://www.raspberrypi-tutorials.de/software/cronjobs-auf-dem-raspberry-pi-erstelleneinrichten.html

Kurz erwähnt, was die obere crontab macht:
Zu jeder Minute jeder Stunde wird das picam.sh-Script ausgeführt, also ein Foto erstellt etc.
Alle 3 Minuten jeder Stunde wird noch copy.sh ausgeführt, was uns die Bilder in den Ordner legt, für die nächste Aktion:
um 23:59 UTC, also der Standard Linux-Systemzeit wird das Script
time_lapse.sh ausgeführt, welches uns das Tagesvideo erstellt.

UTC ist zur MESZ (MittelEuropäischen Sommer Zeit) 2 Stunden, zur MEZ 1 Stunde verschoben. Zeigt die Küchenuhr im Juli also 16:50 an, so ist für den Raspberry „erst“ 14:50.

 

 

Und wie gehts weiter?

 

Zusatz 1: SHT21

Inzwischen haben wir das Kamerabild noch um einen Temperatur-Sensor erweitert. Zur Verwendung kommt hier ein fertiges Board, das SHT21 Breakout Board von Emsytech, welches in einer wasserdichten Box direkt unterhalb des Kameragehäuses montiert wurde. Dieses ist über I²C-Bus angeschlossen. Abgefragt werden die aktuellen Daten über ein externes Script und in Variablen gespeichert. Diese können dann wiederum ins Bild eingeblendet werden.

#Temperatur von SHT21 einlesen
Sht21Temp=$(/home/pi/Raspi-SHT21-V3_0_0/source-neu/sht21 T)
Sht21Hum=$(/home/pi/Raspi-SHT21-V3_0_0/source-neu/sht21 H)

 

Zusatz 2: LDR – Langzeitbelichtung

Wer eine PiCam außerhalb des Hauses einsetzt, z.B. für einen schönen Ausblick, der kennt sicherlich das „Problem“, dass die Kamera bei Nacht nicht gerade viel sieht. Oder besser gesagt: aufnimmt. Wer sich etwas mit Fotografie auskennt, der weiß, dass es da verschiedene Möglichkeiten gibt: Andere Blende am Objektiv einstellen, höhere ISO-Einstellungen oder längere Belichtungszeit. Da die Blende in der Regel ausfällt bei einer Raspberry Pi Camera und ein zu hoher ISO-Wert zu einem Bild-Rauschen führt, bleibt fast nur die Belichtungszeit. Doch wie soll man diese einstellen. Vielleicht über die Zeit vom Sonnenaufgang bzw. Sonnenuntergang? Sicherlich, dies wäre möglich, führt aber dazu, dass nicht die aktuelle Dunkelheit berücksichtigt wird.
Daher habe ich mich für eine andere Lösung entschieden.

Ich verwende in diesem Fall einen fertigen Sensor, den man für etwa 3€ bei eBay bekommt. Dieser Photosensor ist mit einer kleinen Logik bestück, was uns sehr nützlich ist, da wir über den Poti den Schwellwert einstellen können, ab welcher Dunkelheit der Raspberry in den „Nachtmodus“ geht. Praktischerweise wird der Nachtmodus mit dem erlischen einer LED angezeigt, eine weitere LED zeigt an, dass das Modul mit Spannung versorgt wird.
3 Kabel reichen, wer mit dem Raspberry bastelt, hat wahrscheinlich entsprechende Kabel „weiblich-weiblich“ da und kann das Modul direkt anstecken, ansonsten hilft der Lötkolben…
Ist das Modul angeschlossen und der Raspberry gestartet, so leuchtet eine oder beide LEDs. Stellen wir das Poti mit einem kleinen Schraubendreher zunächst so ein, dass beide LEDs leuchten. Anschließend warten wir bis es dunkel wird und haben auf dem Computer das zuletzt erstellte Bild offen. Wenn nun die Stufe erreicht ist, wo wir meinen, dass es „dunkel genug“ ist, dann drehen wir solange an dem Poti bis die LED erlischt. Das nächste Bild wird dann mit längerer Belichtung aufgenommen. Ist dies noch zu hell, einfach nochmal mit dem Poti testen, bis es gefällt. Hat bei mir auch zwei oder drei Abende gebraucht. Die Kamera sollte dafür dann natürlich schon am endgültigen Standort montiert sein.
Alternativ kann man auch ohne dieses Modul arbeiten und direkt einen Light Directed Resistor, also lichtempfindlichen Widerstand verwenden. Hier ist der Wert dann analog abzufragen und so kann entsprechend auch per Fernzugriff der Schwellwert justiert werden.

Dieses Modul gibt uns nämlich keinen analogen Wert aus, sondern ein HIGH oder LOW Signal, besser gesagt: 0 oder 1.

Damit dies funktioniert brauchen wir die GPIO-Ports. VCC wird mit 5V verbunden, GND mit GND und „DO“ beispielsweise mit GPIO 17. Dabei ist jedoch darauf zu achten, welches Modell man verwendet. Hierzu am besten hier nachschauen: https://www.elektronik-kompendium.de/sites/raspberry-pi/1907101.htm

[picam.sh]

#!/bin/bash
cd /home/pi

# Langzeitbelichtung bei Dunkelheit
# 0 = Tag
# 1 = Nacht
ldr=$(gpio -g read 17)
echo $ldr

if [ $ldr == 0 ]
  then
    raspistill -vfhf -v -w 1280 -h 720 -o raspistill.jpg
  else
    echo "ACHTUNG: Langzeitbelichtung"
    raspistill -hf -vf -w 1280 -h 720 -ss 5000000 -ISO 200 -st -o raspistill.jpg
fi

composite -gravity center bg.png raspistill.jpg pre_webcam.jpg
convert -pointsize 13 -fill orange -draw "text 10,711 '$(date +"%d.%m.%Y %T UTC") '" pre_webcam.jpg w1.jpg
convert -pointsize 13 -fill orange -draw "text 1080,711 'www.amateurfunk-klippeneck.de'" w1.jpg image.jpg


read ldrold < /home/pi/ldr.txt
if [ $ldr != $ldrold ]
  then
    echo "ungleich"
    sudo /home/pi/aufnahme.sh >> /boot/aufnahme.txt
    sudo echo $ldr > /home/pi/ldr.txt
  else
    echo "muss wohl gleich sein"
    #echo $ldr > ldr.txt
fi

 

Nehmen wir das Script wieder auseinander:

#!/bin/bash
cd /home/pi

# Langzeitbelichtung bei Dunkelheit
# 0 = Tag
# 1 = Nacht
ldr=$(gpio -g read 17)
echo $ldr

Hier wird eine Variable ldr deklariert und initialisiert, d.h. zur Verfügung gestellt zum „Rechnen“, sowie gleichzeitig mit einem Wert gefüllt. Dieser Wert wird direkt vom gpio-Pin 17 eingelesen. Am Tag hat diese Variable den Wert 0, bei Nacht 1.

 

if [ $ldr == 0 ]
  then
    raspistill -vfhf -w 1280 -h 720 -o raspistill.jpg
  else
    echo "ACHTUNG: Langzeitbelichtung"
    raspistill -hf -vf -w 1280 -h 720 -ss 5000000 -ISO 200 -st -o raspistill.jpg
fi

An dieser Stelle wird per if-Abfrage entschieden, ob eine Langzeitaufnahme gemacht werden soll, oder der Standard-Aufnahmebefehl verwendet wird. Wenn die Variable $ldr 0 ist, also am Tag, soll natürlich die „normale“ Aufnahme gemacht werden. Andernfalls (else) wird eine Langzeitaufnahme gemacht. Dabei gibt der Parameter -ss 5000000 an, wie lange belichtet wird, in diesem Beispiel 5 Sekunden. Der ISO-Wert wird mit -ISO 200 angegeben. Hier muss man testen, wie hoch man gehen möchte, bzw. welches Bildrauschen noch akzeptabel ist. -st soll eine Bildverbesserung bringen, der Unterschied ist aber nur gering. Natürlich sind noch weitere Parameter zur Bildanpassung möglich.

Für die weitere automatisierte Verwendung ist es natürlich wichtig, dass beide Ausgaben den gleichen Namen haben. So kann die „Beschriftung“ zusammen erfolgen und braucht nicht in jedem Zweig der if-Abfrage geschrieben werden.

composite -gravity center bg.png raspistill.jpg pre_webcam.jpg
convert -pointsize 13 -fill orange -draw "text 10,711 '$(date +"%d.%m.%Y %T UTC") '" pre_webcam.jpg w1.jpg
convert -pointsize 13 -fill orange -draw "text 1080,711 'www.amateurfunk-klippeneck.de'" w1.jpg image.jpg

 

Vertrauen ist gut, Kontrolle ist besser!

Besagt schon ein altes Sprichwort. Daher habe ich noch ein kleines Script angehängt, welches mir einfach die „Umschalt-Uhrzeiten“, also wann er von normaler Belichtung auf Langzeitbelichtung umschaltet und andersherum, in eine Datei herein schreibt. Diese Datei habe ich ins Boot verzeichnis gelegt, sodass sie auch ohne laufendes Raspbian direkt in Windows etc. geöffnet werden kann. Aber Achtung, all zu groß ist das Boot Verzeichnis nicht!

read ldrold < /home/pi/ldr.txt
if [ $ldr != $ldrold ]
  then
    echo "ungleich"
    sudo /home/pi/aufnahme.sh >> /boot/aufnahme.txt
    sudo echo $ldr > /home/pi/ldr.txt
  else
    echo "muss wohl gleich sein"
    #echo $ldr > ldr.txt
fi

[aufnahme.sh]

#!/bin/bash

echo "Aufnahme-Art gewechselt "
date
echo " "

 

Ebenso liegt hier die reboot-log-Datei, die mir anzeigt, wann der Raspberry neu gestartet wurde. Hierzu wird über die start.sh das script log.sh aufgerufen. Die Ausgabe erfolgt durch die start.sh in die Datei log.txt.

[log.sh]

#!/bin/bash

echo "Neustart durchgeführt: "
date
echo " "



 

 

 

Vielen Dank

an dieser Stelle auch an alle Interessenten, die sich bisher zu diesem Projekt gemeldet haben und Fragen und Kritik geäußert haben. Das macht die Sache gleich noch viel spannender, wenn immer wieder neue Ideen und Anregungen dazukommen.

Sollte euch dieses Projekt gefallen haben, und ihr eine entsprechende öffentliche Kamera gebaut haben, so würde es mich freuen, wenn ich eure Seite hier als Beispielkamera verlinken darf.


Für weitere Fragen, Anregungen und Kritik stehe ich euch gerne zur Verfügung:
raspberry@kuenneke.info

Viel Erfolg & Grüße / vy 73 es 55
Felix, DO5RC