Timelapse camera met een Pi Zero
De Raspberry Pi Zero wordt samen met de Pi Cameramodule een goedkope en compacte timelapse-camera
Een timelapse-camera is leuk om vanuit een vaste positie wolkenluchten, stadsverkeer of het opengaan van bloemknoppen vast te leggen. Maar je kunt hem ook als dashcam voor autoritten gebruiken, of als bodycam bij wandel- en fietstochten.
De Raspberry Pi Zero is – zelfs met behuizing – zo klein dat je er heel veel handige toepassingen mee kunt maken. Daarbij is het kleine computertje ook nog erg goedkoop en zeer zuinig met energie. Een leuke toepassing met het oog op de komende mooie (vakantie)dagen is om er een timelapse-camera van te maken. Dat is leuk bij stationair gebruik om bewegingen in de omgeving vast te leggen, zoals de baan van de zon of het scheepvaartverkeer op een rivier. Maar je kunt hem net zo goed gebruiken voor een dashcam in de auto of een fietscam bij een fietstocht.
Een timelapse-camera maakt gedurende langere tijd om de paar seconden een foto. Al die beeldjes kun je na afloop samenvoegen tot een compact filmpje. Ideaal om te uploaden naar social media. Je hebt daar behalve een Raspberry Pi Zero W en een officiële Pi Zero behuizing ook de originele Pi Camera voor nodig. Die laatste is ook meteen het duurste onderdeel. Daarnaast heb je nog een drukknopje nodig om de Pi netjes af te sluiten, en een statusledje. Al die dingen zijn te koop bij Kiwi-Electronics.nl, de officiële distributeur van de Pi Zero voor de Benelux. Het hele hardwarelijstje staat in de tabel verderop.
Image overzetten
Het eerste wat je moet doen is een image van het besturingssysteem Raspbian Jessie op een sd-kaartje van minimaal 16 GB zetten. Neem bij voorkeur Jessie Lite, want dan hou je meer ruimte over voor nuttige data en ben je minder tijd kwijt met het updaten van grafische programma's die je toch niet nodig hebt. De Pi Zero wordt namelijk 'headless' gebruikt, dus zonder aangesloten monitor en toetsenbord. Omdat de Pi Zero W een wifimodule ingebouwd heeft, kun je hem via ssh op afstand programmeren. Die wifi komt later ook van pas om de gemaakte opnames eraf te halen. In tegenstelling tot behuizingen voor de grote Pi's heeft de officiële Pi Zero-behuizing namelijk geen opening om het sd-kaart eruit te trekken en in je desktopcomputer te steken. Je zou het hele bordje daarvoor weer uit de behuizing moeten halen – een beetje onhandig met een ingebouwde camera.
Om te beginnen moet je de image downloaden en met een tool als Etcher (voor Windows, macOS en Linux) of Win32DiskImager op het kaartje zetten. Vervolgens maak je (nog steeds op je Windows-machine) in de partitie boot van het kaartje (bij Linux is dat
de directory /boot/) twee bestandjes aan. Een zonder extensie met de naam ssh – het maakt niet uit of er iets in staat of niet. Dat bestandje zorgt ervoor dat de ssh-server bij de opties geactiveerd wordt. Het tweede bestand heet wpa_supplicant.conf. Daar zet je de volgende regels in:
network={ ssid="SSID" psk="wachtwoord" key_mgmt=WPA-PSK
}
SSID en wachtwoord moeten natuurlijk vervangen worden door de gegevens van je wifinetwerk – de aanhalingstekens moeten blijven staan. Als je het sd-kaartje dan in de Pi stopt en daarmee opstart, wordt dat bestand automatisch naar de directory /etc/ wpa_supplicant/ verplaatst. Vervolgens zal de Pi automatisch verbinding maken met het wifinetwerk. Daarna kun je met een netwerkscanner als fing het ip-adres van de Pi achterhalen en vervolgens vanaf een andere computer via ssh inloggen als user pi met het standaardwachtwoord raspberry. Vanaf een Windows-computer kan dat bijvoorbeeld met het programma PuTTY.
Als je toch bezig bent met het plaatsen van bestanden op de boot-partitie of in de boot-directory, kun je het bash-script waar de camera straks mee wordt aangestuurd ook vast daar neerzetten. Dat script (timelapse.sh) is een enigszins aangepaste versie van het gelijknamige script van Phillip Burgess (learn.adafruit.com/users/pburgess) en is te downloaden via de link onderaan dit artikel.
Knutseluurtje
Voordat je de pi kunt starten moet je de hardware nog assembleren. Allereerst moet je het drukknopje en het ledje met draadjes aan de GPIO-aansluitingen verbinden. Als ledje gebruiken we een led-sequin: dat is een minuscuul printje met een plat ledje (SMD) en weerstand. Je kunt in één keer een 40-pins header op je Zero solderen, of alleen de benodigde pinnen, of je kunt de componenten rechtstreeks op de gaatjes vast solderen. De led-sequin zet je met de plus op GPIO5 (pin29) en met de min op de tegenoverliggende GND (pin30). Het knopje komt op GPIO21 (pin40) en de tegenoverliggende GND (pin39). Bij de link onderaan staat daar een diagram van. Voordat je de Pi in z'n behuizing plaatst, moet je de camera aansluiten. Het printje past in het meegeleverde dekseltje. De korte kabel moet met de brede kant in de cameramodule en met de smalle in het moederbordje (zie foto). Zorg dat hij goed vastzit. Plaats dan het sd-kaartje in de Pi en de Pi in zijn doosje, zodat het ledje en het knopje aan de onderkant uitsteken.
Hoe en waar je de dashcam uiteindelijk in de auto of waar dan ook bevestigt, is helemaal afhankelijk van de mogelijkheden en de bevestigingsmiddelen die je hebt. Als voeding is een kleine smartphone-powerbank (circa 10 tot 15 euro) ideaal. Het geheel is dan zeer portable en makkelijk in bijvoorbeeld een waterdichte behuizing te stoppen. De Pi verbruikt zo weinig stroom dat hij het er uren op volhoudt.
Raspi-config
Het eerste wat je moet doen als de Pi opgestart is en een netwerkverbinding heeft, is het systeem updaten en een aantal opties instellen met de configuratie-wizard. Maak verbinding met de Pi Zero vanaf een andere computer via ssh (op Linux) of PuTTY (op Windows) en typ de volgende commando's in:
sudo sudo sudo
apt-get update apt-get upgrade -y raspi-config
In raspi-config kun je bij 1 het standaard wachtwoord voor de gebruiker pi vervangen. Bij 4 moet je de juiste tijdzone (Europe / Amsterdam) instellen, de juiste toetsenbordlayout (English (US) / English (international AltGr dead keys)) en Nederland als wifiland. Bij 5 (Interfacing options) moet je de camera activeren.
Daarna moet de Pi eventueel opnieuw opgestart worden en kun je de benodigde software voor het aansturen van de GPIOpins installeren:
sudo apt-get install wiringpi -y
Het script dat je eerder in de directory / boot op het sd-kaartje gezet hebt, kopieer je dan naar de nieuw aan te maken direc-
tory /home/pi/timelapse. Maak het meteen executable.
sudo mkdir /home/pi/timelapse sudo cp /boot/timelapse.sh
/home/pi/timelapse
sudo chmod +x
/home/pi/timelapse/timelapse.sh
Om het script automatisch bij het booten van de Pi te laten uitvoeren, moet je het bestand /etc/rc.local uitbreiden met de volgende regel, net voor het afsluitende exit 0:
sh /home/pi/timelapse/timelapse.sh 2>
/dev/null &
Starten en stoppen
De Pi boot op het moment dat je de voeding aansluit. Bij het starten wordt het camerascript automatisch uitgevoerd. Hij begint dan meteen met opnemen. Bij het stoppen van de Pi is het belangrijk om niet domweg de voedingsstekker eruit te trekken, anders kun je bestanden verliezen en zelfs het sd-kaartje beschadigen. Hou in plaats daarvan het op GPIO21 (pin40) aangesloten drukknopje minstens 2 seconden ingedrukt. Het besturingssysteem wordt dan eerst netjes afgesloten – dat duurt 20 seconden. Het commando gpio -g write $LED 1 in het script onder # check halt-knop activeert de led als het afsluiten begint. Als het is voltooid dooft de led en kun je de voeding loskoppelen.
Code
Foto's maken met de Pi-camera doe je met het commandlineprogramma raspistill. Wanneer je die naam zonder opties op de commandline intypt, krijg je een lijst van alle opties te zien. Het basiscommando voor het maken van een foto is:
raspistill -o cam.jpg
Met -o wordt de output naar het bestand cam.jpg geschreven. Voor dit project wordt een bashscript gebruikt (het volledige script staat in de link onderaan dit artikel). Maar je zou hetzelfde ook met Python kunnen doen met behulp van de picamera-bibliotheek voor Python (sudo apt-get install pythonpicamera).
Het script begint heel overzichtelijk met het aanmaken van variabelen voor de camera-instellingen:
INTERVAL=15 WIDTH=1280 HEIGHT=720 ROTATE=270 QUALITY=51 DEST=/home/pi/timelapse PREFIX=img
Het interval tussen twee opnames is 15 seconden, het afbeeldingsformaat is 1280 × 720 pixels, voor de rotatie kun je een waarde kiezen tussen 0 en 359 (in ons geval 270, voor een liggend formaat). De kwaliteit is de jpgcompressie (van 0 tot 100). DEST staat voor destination, de doeldirectory, en PREFIX laat de bestandsnaam steeds beginnen met img.
Daarna volgen de GPIO-instellingen voor de led en de drukknop, en de GPIOstates:
HALT=21 LED=5 prevtime=0
GPIO21 is gereserveerd voor de halt-knop (het tweede pootje moet op GND). De led-sequin komt op GPIO5 (plus) en GND (min). De variabele prevtime moet in de beginsituatie 0 zijn, zodat de eerste opname kan beginnen.
Dan volgen de commando's om de twee GPIO-pinnen in hun uitgangsmodus te zetten:
gpio -g mode $HALT up gpio -g mode $LED out
GPIO21 wordt hoog gezet en GPIO5 als output.
De variabele FRAME fungeert als bestandsteller. Eerst wordt gecontroleerd of er al bestanden van hetzelfde stramien aanwezig zijn en wat het hoogste nummer daarvan is. Zo worden bestaande timelapse-
bestanden niet overschreven. Telkens als er een nieuwe opname gemaakt is, wordt FRAME met 1 verhoogd:
FRAME=$(($(find $DEST -name "*.jpg"
-printf %f\\n | sed 's/^[^1-9]*//g' | sort -rn | head -1 | sed 's/[^0-9]//g')
+ 1))
Daarna volgt de dubbele loop voor het maken van de opnames (zie het kader met listing). Het centrale deel daarvan is natuurlijk het feitelijke raspistill-commando:
raspistill -n -w $WIDTH -h $HEIGHT -q $QUALITY -rot $ROTATE -th none -t 250
-o $OUTFILE
De thumbnail-optie -th is uitgeschakeld en de optie -t 250 zorgt ervoor dat er altijd een pauze is van 250 milliseconden voordat de foto daadwerkelijk gemaakt wordt. Daarnaast zorgt de loop voor de tijdsafstand in seconden tussen twee foto's ($INTERVAL) en wordt gekeken of de drukknop ingedrukt is of niet. De gpio -g write $LED regels voor en na het raspistil-commando zorgen ervoor dat de led even oplicht bij elke foto die wordt weggeschreven.
De beelden bekijken
Uiteindelijk komen in de timelapse-directory een gigantische hoeveelheid jpg-bestanden te staan. Om die van de headless Pi af te halen, kun je via het wifinetwerk en ssh met het commando scp (bijvoorbeeld: scp /home/ pi/timelapse/img* tester@192.168.0.109:/ home/tester/timelapse) de bestanden makkelijk vanaf je Pi naar een map op een andere Linux-computer kopiëren. Bij Windows kan dat met het programma winscp. Vervolgens kun je de plaatjes één voor één bekijken of er een timelapse-video van maken. Dat kan bijvoorbeeld met de Time-Lapse Tool – gratis tot een uitvoer van 480p (852 × 480 pixels), hogere resoluties vanaf 39 euro. Maar er zijn ook andere tools, zoals ffmpeg (Linux), Moviemaker (Windows), Panolapse (Windows en Mac OS) en Startrails (zie de link onderaan). Wat betreft de hardware zijn er een paar beperkingen: de Pi heeft geen gps voor plaatsbepaling en geen real-time clock (RTC). Deze kun je met aparte hardwaremodules overigens wel toevoegen. Met name de real-time clock is een gemis als je de Pi Zero zonder internetverbinding gebruikt. Bij Kiwi-Electronics kun je de zeer nauwkeurige DS3231 Precision RTC Breakout (€ 15,95) van Adafruit kopen, die moet je dan zelf in de behuizing van de Zero een plaatsje zien te geven (jmu)