====== Raspberry Pi Dash-cam ======
Developers: Gabriel Alvarado Morales & Fabiola Muñoz Ugalde
===== Objective =====
The aim here is to provide continuous, high-quality video recording in a vehicle to capture significant events without human intervention.\\
These devices are sometimes called 'dash cams' and lately have become quite popular since many drivers now rely on dashboard cameras for insurance and legal purposes.\\
In case you're involved in an accident, you will have a video record of the event for your insurance company, or if you witness an accident or any other dangerous situation, your video may help law enforcement and other emergency responders.
===== Hardware Description =====
We have used the latest Raspberry Pi model B with an 8 GB SD card, along with the Raspberry Pi camera module to improve video-recording quality and simplify the programming due to compability terms.\\
For information and details about the Raspberry Pi and it´s camera module you can visit:
http://www.raspberrypi.org/
To provide internet access to our device we used an USB Wi-Fi dongle with the Raspberry Pi.
To keep the RPi running when the ignition of the vehicle is not on, we also added an external portable battery.
===== Getting Started =====
==== Installing OS Raspbian on the Raspberry Pi ====
The Raspberry Pi will not start without a properly formatted SD Card, containing the bootloader and a suitable operating system, you should install the OS and software to the Raspberry Pi before mounting it all together. We have chosen Raspbian, as it's one of the most advanced OS for the Raspberry with loads of help and tutorials on the internet.
You need to prepare the SD card to be able to run Raspbian on the Raspberry, in order to do this, we recommend following the instructions shown in the following link:
http://elinux.org/RPi_Easy_SD_Card_Setup
==== Enabling camera support in Raspbian ====
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo raspi-config
Navigate to 'camera' and select 'enable' then select 'Finish' and reboot.
==== Firmware Update ====
In order to keep your Raspberry Pi secure, and to get updated functionality, you should get the firmware and the software updated. The firmware is a small package of code that helps the software know how to talk to the hardware.
Install software needed to perform the update:
sudo apt-get install ca-certificates git-core binutils
Download the script:
sudo wget https://raw.github.com/Hexxeh/rpi-update/master/rpi-update
Copy the script to /usr/local/bin:
sudo cp rpi-update /usr/local/bin/rpi-update
Make the script executable:
sudo chmod +x /usr/local/bin/rpi-update
Run the script:
sudo rpi-update
Every time you want to check for firmware updates, then execute:
sudo rpi-update
===== Implementation =====
==== Auto Start & Auto Login ====
Edit the file /etc/inittab and comment out the line:
1:2345:respawn:/sbin/getty -noclear 38400 tty1
Below it add the line:
1:2345:respawn:/bin/login -f pi tty1 /dev/tty1 2>&1
This does is an automatic login on tty1 (the first terminal), so a sudo reboot should now login the user pi automatically.
To start a script off when the RPi boots, follow the next steps.
Edit .bashrc and add this code to the end of the file:
if [ -z "$DISPLAY" ] && [ $(tty) == /dev/tty1 ]; then
./dashcam.sh &
fi
After those modifications the Raspberry Pi will auto-boot when powered up and our dashcam application will then auto-run.
==== dashcam.sh ====
This is a shell script that is run automatically, when the Raspberry Pi boots up. It does a few initialisation tasks and runs our dashcam.py Python code in the background.
It has a control loop that records 5 minute video segments, each with a filename that is based on the start time and date (e.g. 2013_12_11_16:34:45.h264). After each recording the allocated storage space is measured and older files deleted to bring usage down below a pre-set limit (in our case it´s 6 GB).
The program loop runs until the contents of a file called dashcam.mode (which is created the first time the program runs in the directory /home/pi) are changed from 'exit' or 'shutdown' to 'record' or 'parked'.
#!/bin/sh
echo `date +%s` "! started dashcam.sh"
# Start the dashcam python code
sudo python dashcam.py &
cd /home/pi
# Set limit of rolling videos to 6GB
limit=6000000
echo "record" > dashcam.mode
# Creates a file named dashcam.mode and adds the content "record" on it
mode=$(cat dashcam.mode)
# The variable mode saves the content that is currently in the dashcam.mode file
previous="dummy.h264"
current="dummy.h264"
# Variables destined to set the videos names
# Main process
while [ true ]; do
# check Video folder disk space used
used=$(du Video | tail -1 | awk '{print $1}')
echo `date +%s` "U Video" $used
# Compare $used with $limit
# Free up disk space if needed
while [ $limit -le $used ]; do
remove=$(ls -1tr Video | grep .h264 | head -n 1)
echo `date +%s` "-" $remove
rm Video/$remove
# Calculate disk space used
used=$(du Video | tail -1 | awk '{print $1}')
done
# Check commands
# if exit is requested, then stop and shutdown
mode=$(cat dashcam.mode)
if [ "$mode" = "exit" ]
then
echo `date +%s` "! stopped dashcam.sh"
# Shutdown the RPi, so we can safely remove power
sudo shutdown -h now
exit
fi
# if car ignition is on or if motion is detected then record video
if [ "$mode" = "record" ] || [ "$mode" = "parked" ]
then
# New file name
previous=$current
current=$(date +"%Y_%m_%d_%H:%M:%S.h264")
echo `date +%s` "+" $current
# Capture a 5 minute segment of video
raspivid -n -b 9000000 -w 1280 -h 720 -o Video/$current -t 300000
fi
done
==== dashcam.py ====
This is a Python script that is also auto-started. It monitors the GPIO pins and writes control commands to the dashcam.mode file. This code uses the event_detected() function to detect changes to the switches and from the sensors.
import datetime
import RPi.GPIO as GPIO
import time
import os
import subprocess
import gps
def Log(t, s):
print time.time(),t,s
Log("!", "started dashcam.py")
# Listen on port 2947 (gpsd) of local host
session = gps.gps("localhost", "2947")
session.stream(gps.WATCH_ENABLE | gps.WATCH_NEWSTYLE)
# Set mode
GPIO.setmode(GPIO.BOARD)
# Hide warnings
GPIO.setwarnings(False)
# Setup inputs
# Record = Button1 = GPIO15 = Board 10
GPIO.setup(10, GPIO.IN, pull_up_down=GPIO.PUD_UP)
# Parking = Button2 = GPIO17 = Board 11
GPIO.setup(11, GPIO.IN, pull_up_down=GPIO.PUD_UP)
# Ignition power = Button5 = GPIO22 = Board 15
GPIO.setup(15, GPIO.IN, pull_up_down=GPIO.PUD_UP)
# Intialise dashcam
mode = 'recording'
Log("M", "%s" % mode)
# Record button pressed
def mode_record(channel):
global mode
if mode != 'recording':
mode='recording'
Log("M", "%s" % mode)
GPIO.add_event_detect(10, GPIO.FALLING, callback=mode_record, bouncetime=500)
# Parked button pressed
def mode_parked(channel):
global mode
if mode != 'parked':
mode = 'parked'
Log("M", "%s" % mode)
GPIO.add_event_detect(11, GPIO.FALLING, callback=mode_parked, bouncetime=500)
# Ignition cut event
def ignition_cut(channel):
global mode
Log("=", "ignition cut")
if mode != "parked":
GPIO.cleanup()
os.system("./exit.sh &")
Log("!", "stopped dashcam.py")
time.sleep(1)
exit(0)
GPIO.add_event_detect(15, GPIO.FALLING, callback=ignition_cut, bouncetime=1000)
# Main program loop
while True:
try:
report = session.next()
except KeyError:
pass
except KeyboardInterrupt:
quit()
except StopIteration:
session = None