Detecting movement with Raspberry

Photo from adafruit web site

Photo from adafruit web site

Detecting movement with Raspberry

This tutorial will deal with the possibility to turn on / off a screen with a infrared motion sensor.
The PIR (motion) sensor seems to be a good cheap product (about $10 on adafruit.com).

You need

  • PIR (motion) sensor
50% Complete

PIR (motion) sensor

PIR sensors are used to detect motion from pets/humanoids from about 20 feet away (possibly works on zombies, not guaranteed). This one has an adjustable delay before firing (approx 2-4 seconds), adjustable sensitivity and we include a 1 foot (30 cm) cable with a socket so you can easily reposition the sensor or mount it using the two drills on either side

Runs on 5V-16V power (if you need to run it off of 3V you can do that by bypassing the regulator, but that means doing a bit of soldering). Digital signal output is 3.3V high/low. Sensing range is about 7 meters (120 degree cone)
For a full tutorial with wiring diagrams, code examples and project ideas, PIR sensor tutorial page!

Plug-in the PIR on the Rasberry

Regarding this tutorial you simply have to connect the PIR ground to the raspberry ground, the PIR power to pin 1 or 2 on the raspberry and the output to a GPIO (I will use the 4).

Installing Python (optional)

While my raspberry system come with OSMC, I didn't have a valid Python program installed, so I have to upgrade to a new version with this command :

sudo apt-get install python3-dev

sudo apt-get install mercurial

sudo apt-get install python3-pip

Detecting movement

You need a small Python program to convert PIR's output signal to instructions.

Write the file /home/osmc/MotionDetect.py

#!/usr/bin/env python

import sys
import time
import RPi.GPIO as io
import subprocess

io.setmode(io.BCM)
SHUTOFF_DELAY = 60 # seconds
PIR_PIN = 4
LED_PIN = 16

def main():
    io.setup(PIR_PIN, io.IN)
    io.setup(LED_PIN, io.OUT)
    turned_off = False
    last_motion_time = time.time()

    while True:
        if io.input(PIR_PIN):
            last_motion_time = time.time()
            io.output(LED_PIN, io.LOW)
            print ".",
            sys.stdout.flush()
            if turned_off:
                turned_off = False
                turn_on()
        else:
            if not turned_off and time.time() > (last_motion_time +  SHUTOFF_DELAY):
                turned_off = True
                turn_off()
            if not turned_off and time.time() > (last_motion_time + 1):
                io.output(LED_PIN, io.HIGH)
        time.sleep(.1)

def turn_on():
    subprocess.call("sh /home/pi/photoframe/monitor_on.sh", shell=True)

def turn_off():
    subprocess.call("sh /home/pi/photoframe/monitor_off.sh", shell=True)

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        io.cleanup()

Turning the monitor HDMI on and off

Enable HDMI :

Add these two lines to /boot/config.txt and reboot Raspbmc:

hdmi_force_hotplug=1

hdmi_drive=2

hdmi_force_hotplug=1 sets the Raspbmc to use HDMI mode even if no HDMI monitor is detected.
hdmi_drive=2 sets the Raspbmc to normal HDMI mode (Sound will be sent if supported and enabled). Without this line, the Raspbmc would switch to DVI (with no audio) mode by default.

In file monitor_off.sh

tvservice -o

In file monitor_on.sh 

tvservice -p; fbset -depth 8; fbset -depth 16

Make files to be executed :

chmod 0744 monitor_*

Turning monitor on/off with a cron job

You can force the monitor to turn on and off with a cron job with a crontab like this one :

(this cron will turn on every day at 10:00, and turn off from Monday to Thursday at 20:30,  Friday at 21:00, Saturday and Sunday at 23:00)

# Allumage de l'ecran (tout les jours a 10:00)
00 10 * * * sh /home/osmc/monitor_on.sh
# extinction de l'écran
30 20 * * 1-4 sh /home/osmc/monitor_off.sh
00 21 * * 5 sh /home/osmc/monitor_off.sh
00 23 * * 6,7 sh /home/osmc/monitor_off.sh

Copyright © 2015 Alex-design.fr All rights reserved.