Foto’s maken met Raspberry Pi en uploaden via FTP
Mijn Raspberry Pi B+ is uitgerust met een cameramodule, een Edimax WiFi dongle en een MC-RP002-CLR doorzichtige behuizing met uitsparing voor de camera. Met wat software moet het mogelijk zijn om periodiek een foto te maken en deze te uploaden naar een website. "Moet niet ingewikkeld zijn," dacht ik nog. Zoekend op het internet kwam ik diverse oplossingen tegen, maar uiteindelijk heb ik mijn eigen koers gevaren met de volgende stappen:
- Foto maken met
raspistill
- Optie foto bewerken met ImageMagick's
convert
- Uploaden naar een website met
ftp
- Periodiek herhalen met
cron
Vergeet niet de cameramodule aan te zetten in het raspi-config menu. Het programma raspistill
maakt een foto met de cameramodule en bewaart deze foto als een JPG. Er zijn verschillende instellingen mogelijk, hieronder enkele belangrijke:
- Resolutie, met parameter
-md
, van 640x480 (mode 6) tot 2592x1944 (mode 2) en 1920x1080 (mode 1) - JPG kwaliteit, met parameter
-q
, van 0 (lage kwaliteit en klein bestand) tot 100 (hoge kwaliteit en groot bestand) - EXIF informatie instellen, met parameter
-x
, zoals GPS metadata:-x GPS.GPSLatitude=53/1,9/1,0/1 -x GPS.GPSLongitude=4/1,51/1,34/1
voor N 53° 9' 0" en E 4° 51' 34". Overigens vereist de GPS-notatie enige bewerking - Naam van het uitvoerbestand, met parameter
-o
. Handig is hierbij om bestandsnamen te nummeren of uit datum-tijd te laten bestaan, metfilename=$(date -u +"%Y%m%d%H%M%S").jpg
Met een basis ftp
client is het eenvoudig genoeg om een bestand te uploaden naar een website, vooringenomen dat deze over een FTP-server beschikt. Het is nog wel bewerkelijk om de commando's binnenin de ftp
client in hetzelfde script op te nemen als de andere commando's. Het geheim zit in het omleiden van de console input: ftp << EOF
.
Voor een webpagina is het handig om een afbeelding met een vaste naam te hebben. De gemaakte foto wordt daarom altijd naar 'latest.jpg' gekopieerd, die daarmee overschreven wordt. Ik heb geen manier gevonden om via het ftp-protocol een bestandsnaam te kopiëren, anders dan de upload twee keer te doen. Da's wel jammer, want de foto's zijn aardig groot.
Script capload.sh
:
filename=$(date -u +"%Y%m%d%H%M%S").jpg host=ftp.myserver.nl user=myusername pass=mypassword #Capture image raspistill -o /tmp/$filename -md 2 -q 40 #Optional, include GPS coordinates #raspistill -o /tmp/$filename -md 2 -q 40 -x GPS.GPSLatitude=53/1,9/1,0/1 -x GPS.GPSLongitude=4/1,51/1,34/1 #Transfer image ftp -ivn $host << EOF user $user $pass #Optional, uncomment when connecting succeeds, but uploading is not #passive put /tmp/$filename $filename put /tmp/$filename latest.jpg bye EOF #Remove transfered image file #This is optional, as /tmp gets cleaned up after each reboot rm /tmp/$filename
Ik gebruik de volgende cron job (crontab -e
) om iedere vijftien minuten een foto te uploaden:
# Run the capload ('Capture Image and Upload') script every fifteen minutes 00 * * * * /home/pi/capload.sh 15 * * * * /home/pi/capload.sh 30 * * * * /home/pi/capload.sh 45 * * * * /home/pi/capload.sh
Hieronder een voorbeeld van een geuploade afbeelding:
Soms is het handig om bestanden van een bepaalde leeftijd op te ruimen op de gebruikte ftp-server, om te voorkomen dat een schijf volloopt. Ik heb daar het volgende stukje opschooncode voor bedacht:
removefiles=$(date -d '7 days ago' +"%Y%m%d")*.jpg mdel $removefiles
Rudi
Hoi Marc, mooie beelden! Leuk dat je een link naar mijn pagina hebt opgenomen. Je hebt een goed werkende opstelling gemaakt!