Raspberry Pi Timelapse

This weekend, Byers Imports unveiled the new Jaguar F-Type Coupe and invited people to autocross for free. I set up a Raspberry Pi at the start line to record a picture every 10 seconds. It managed to capture every car that autocrossed and a pretty cool view of the moving clouds.

Connect the camera

The folks over at Raspberry Pi have created a nice tutorial of how to setup the camera and connect it to Pi.

Enable the camera

I will assume that you know how to start up a Raspberry Pi running Raspbian and connect a monitor and keyboard/mouse to it. If not, some quick google searches should help you get there.

Open a LXTerminal in Pi and open raspi-config.

sudo raspi-config

Select Enable camera and hit Enter, then go to Finish and you will be asked to reboot.

Taking pictures

The raspistill command is used to take pictures along with various configuration flags.

raspistill -o test.jpg

This will place a test.jpg file in your home folder. The ‘raspistill’ command takes about six seconds to take a picture.

Timelapse script

I wrote a simple python script to take a picture every ten seconds.

import os
import time
import RPi.GPIO as GPIO
from datetime import datetime

# Determine the current date and time

d = datetime.now()
startYear = "%04d" % (d.year)
startMonth = "%02d" % (d.month)
startDate = "%02d" % (d.day)
startHour = "%02d" % (d.hour)
startMin = "%02d" % (d.minute)

#Define the location where files need to be saved

saveFolder = "/home/pi/timelapse/timelapse_" + str(startYear) + str(startMonth)+str(startDate)+ str(startHour) + str(startMin)

os.mkdir(saveFolder)

#First File

fileIndex = 1

#Infinite Loop

while True:
	d = datetime.now()
	if True:
		#Set file number

		fileNumber = "%04d" %(fileIndex)

		#Get current time

		hour = "%02d" %(d.hour)
		mins = "%02d" %(d.minute)

		imgWidth = 800
		imgHeight = 600

		print "===============Saving file at " + hour + ":" + mins

		#Capture image

		os.system("raspistill -w " + str(imgWidth) + " -h " + str(imgHeight) + " -o " + str(saveFolder) + "/" + str(fileNumber) + "_" + str(hour) + str(mins) + ".jpg -sh 40 -awb auto -mm average -ex auto")

		#Increment file number

		fileIndex += 1

		#Wait ten seconds before the next image

		time.sleep(10)

	else:
		print "==================Nothing is happening"

The code is pretty well commented, but I will delve into the actual capture image part. I have included some flags with the raspistill command, and they are described below.

Flag Description Value
-w width 800
-h height 600
-o output file name /path/to/file.jpg
-sh sharpness 40
-awb auto white balance auto
-mm metering mode average
-ex exposure auto

More detailed flag specifications are available here.

Automatic startup on boot

In order to make the Pi start taking pictures when it was powered on, I added a cron job to the crontab.

Navigate to the home directory in Pi using cd. Then, use crontab -e and add the following command to the crontab.

@reboot python /path/to/timelapse/file.py

Make sure you shutdown.

sudo shutdown -h "now"

This will ensure that your timelapse.py script will start running every time you reboot the Pi.

Making the Video

Install the mencoder package that converts all the pictures into a video.

sudo apt-get install mencoder

Then, navigate to your directory that has all the pictures and execute the following commands

/* This adds all the pictures to a list */
ls *.jpg stills.txt
/* Make the video */
mencoder -nosound -ovc lavc -lavcopts vcodec=mpeg4:aspect=16/9:vibrate=8000000 -vf scale=1920:1080 -o timelapse.avi -mf type=jpeg:fps=24 mf://@stills.txt

Now you can copy the timelapse.avi file from the Pi using a FTP client or from the SD card itself. Enjoy your video!

BONUS! - Pi Remote Access

Instead of having to keep connecting the Pi to the monitor and keyboard and switching out the SD card every time I needed to copy files, I bought a USB wireless dongle and added it to a USB port on the Pi. The dongle is very easy to install and connect to WiFi using the Raspbian Desktop environment.

Once it was online, I found out the hostname for the Pi using this command:

hostname -I

This should give you an address that looks something like 192.168.1.199.

Now, using a Mac/Linux terminal or Putty on Windows, you can create an ssh connection directly to the Pi.

ssh pi@192.168.1.199

If you set up a different username, you can replace ‘pi’ with that username. Now, you should be able to access your Pi remotely and copy files over using an FTP client like FileZilla or a bash command like scp.