Other than messing around with a few FORTRAN benchmarks and learning how to code using Python, I haven’t really used my Raspberry Pi computers for very much that’s been practical. However, having bought a Raspberry Pi camera to play with over Christmas, I decided to have a go at building a motion sensitive camera for the garage. It’s cheap and easy to find passive infrared detectors these days, so I acquired three for the princely sum of £5.
The first challenge was working out the function of the three pins in the foreground. A little bit of searching led me to the conclusion that the top pin is the ground, the bottom pin the 5v supply, with the middle being the status pin. If the middle pin goes high, it means that motion has been detected. The sensitivity of the device, and the length of time the status pin stays high for, can be adjusted using the two potentiometers.
I connected the power pins to a couple of the available 5v supply and ground pins on a Raspberry Pi 2. I used physical pin 26 (GPIO pin 7) to connect up to the status pin.
The next challenge was writing some code to detect changes in the status pin and take a photograph when motion is detected. Fortunately, there are plenty of code snippets available that made this task relatively straightforward. The current version of my code is below.
import RPi.GPIO as GPIO import time from picamera import PiCamera # Initialise the camera settings camera=PiCamera() camera.resolution=(1024,768) camera.rotation=(180) camera.meter_mode=('backlit') # Use GPIO pin 7 (physical pin 26) for the PIR detector GPIO.setmode(GPIO.BCM) GPIO_PIR=7 GPIO.setup(GPIO_PIR,GPIO.IN) # Variables used to determine when a picture should be taken. # GPIO pin 7 => high (ts==1) from low (qs==0) # triggers the camera. ts=0 qs=0 try: # Wait until PIR GPIO pin is low (0) print "Waiting ..." while GPIO.input(GPIO_PIR)==1: ts=0 print "... detector is ready" # Loop until quit signal while 1: # Read PIR state ts=GPIO.input(GPIO_PIR) # DEBUG print ts if ts==1 and qs==0: # Create unique filename with timestamp and set qs high t=time.localtime() timestamp=time.strftime('%Y%m%d-%H%M%S',t) filename=("img" + timestamp + ".jpg") camera.capture(filename) print "Movement detected - ",filename," created" qs=1 elif ts==0 and qs==1: # GPIO pin 7 has returned to low, therefore set qs low qs=0 # Wait for a second time.sleep(1) except KeyboardInterrupt: # Cleanup GPIO GPIO.cleanup() print "PIR-PiCamera program terminated"
My Raspberry Pi 2 is now set up in the garage with the motion detector and camera. At the moment it’s simply saving the images onto a drive available to my home network, but I’m probably going to experiment with sending email alerts as well.