Foto’s maken met Raspberry Pi en uploaden via FTP

IMG_4102

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 640×480 (mode 6) tot 2592×1944 (mode 2) en 1920×1080 (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, met filename=$(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:
Latest from Pi webcam

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

6 gedachten over “Foto’s maken met Raspberry Pi en uploaden via FTP

  • 29 november 2016 om 11:42
    Permalink

    Hoi Marc, mooie beelden! Leuk dat je een link naar mijn pagina hebt opgenomen. Je hebt een goed werkende opstelling gemaakt!

  • 24 oktober 2016 om 21:47
    Permalink

    Hi Rudi,
    Mooi, die timestamp probeer ik binnenkort. Je script is handig en eenvoudig. Was me eerder niet gelukt maar nu ze hier met de bouw beginnen moest ik wel ff aan de slag. En met hulp van jouw script was dat goed te doen. Heb het iets aangepast en wat toegevoegd voor de liefhebber op mijn webpagina met een link naar deze pagina. Zie hier geen contactknop maar hoop dat dat ok is.

    https://www.gasoline.nl/blog/70-livecam-timelaps-raspberry-pi-3

  • 24 oktober 2016 om 19:42
    Permalink

    Ik gebruik daar convert voor en de volgende aanpassing in het script:

    date=$(date +"%d-%m-%Y_%H:%M:%S")

    raspistill -v -o /tmp/latest-hr.jpg -md 2 -q 40
    convert /tmp/latest-hr.jpg -font Arial \
    -pointsize 50 -fill white -annotate +2100+1929 \
    $date \
    -pointsize 50 -draw "gravity southwest \
    fill white text 15,6 'Tesselhoes tuincamera' " \
    -resize '1024' /tmp/latest.jpg

  • 24 oktober 2016 om 19:26
    Permalink

    Ik heb het al werkend ;). Werkt goed. Enige wat ik nog zou willen dat er een timestamp op de foto komt. Enig idee welke code ik moet toevoegen?

  • 24 oktober 2016 om 16:32
    Permalink

    Mooi script, heb het nu werkend inclusief cronjob maar de foto’s worden niet geupload naar mijn webserver. Wel naar de /tmp map op de Pi (alleen de files, niet latest.jpg). Enig idee wat ik nog moet doen om die filetransfer naar mijn webserver werkend te krijgen?

    filename=$(date -u +”%Y%m%d%H%M%S”).jpg
    host=ftp.mijnserver.nl
    user=mijnusername
    pass=mijnpassword

    #Capture image
    raspistill -o /tmp/$filename -md 2 -q 40 -t 150
    #Optional, include GPS coordinates
    #raspistill -o /tmp/$filename -md 2 -q 40 -x GPS.GPSLatitude=53/1,9/1,0/1 -x GP$
    #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

  • Pingback:Raspbian installatie op Raspberry Pi | Rudi Niemeijer

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *