Añadir sensor PIR a Raspberry para encendido y apagado automático de pantalla

sku_397782_4

Hace poco más de un mes publiqué un post explicando cómo utilizar la RaspberryPi mostrando un tablero de Trello, a modo de dashboard para la oficina. El principal inconveniente hasta el momento es tener que encender y apagar el monitor cada vez que entro o salgo del despacho. Para solucionar el problema he comprado un sensor PIR (Passive Infra Red) que detecta cuando hay movimiento, con la idea de vincular a este sensor una orden de encendido y/o apagado de la pantalla. Este tipo de sensores cuestan poco más de 2 euros.

Conectar el sensor PIR a la Raspberry Pi

El primer paso es conectar el sensor a la Raspberry Pi. Lo podemos hacer mediante breadboard, pero teniendo en cuenta que pretendo dejar instalado el sensor de forma permanente y que ocupe lo menos posible, haré una conexión directa: si no vienen con el sensor, tendremos que comprar tres cables por separado.

En la parte inferior del sensor encontraremos tres pines a los que conectar un extremo de los cables. Por lo general, impreso en la misma placa se indica qué es cada pin, pero no siempre ocurre. En todo caso, corresponden a la toma de corriente (5V), al Output y a la toma de tierra (GND o Ground) en este orden colocando el sensor boca abajo y los pines en la parte horizontal inferior (la más cercana a nosotros).

El otro extremo de los cables lo conectamos a los pines correspondientes de la Raspberry Pi. Y aunque no viene impreso en la Raspberry Pi a qué corresponde cada pin, nos podemos guiar por este esquema:

a-and-b-gpio-numbers

De este modo, tan solo nos debemos asegurar que el pin de 5V del sensor está conectado a uno de los pines mostrados en rojo en el esquema, el GND a uno de los negros y el Output a uno de los amarillos. Para el ejemplo aquí mostrado, lo conectamos al GPIO 7, al que luego le indicaremos al código que debe dirigirse.

Comprobar su funcionamiento mediante script Python

Para poner a prueba el sensor utilizamos un script en Python. Nos podemos directamente descargar el propuesto en raspberrypi-spy. Le echamos un vistazo al código:

# Import required Python libraries
import RPi.GPIO as GPIO
import time
# Use BCM GPIO references
# instead of physical pin numbers
GPIO.setmode(GPIO.BCM)
# Define GPIO to use on Pi
GPIO_PIR = 7
print "PIR Module Test (CTRL-C to exit)"
# Set pin as input
GPIO.setup(GPIO_PIR,GPIO.IN)      # Echo
Current_State  = 0
Previous_State = 0
try:
  print "Waiting for PIR to settle ..."
  # Loop until PIR output is 0
  while GPIO.input(GPIO_PIR)==1:
    Current_State  = 0
  print "  Ready"
  # Loop until users quits with CTRL-C
  while True :
    # Read PIR state
    Current_State = GPIO.input(GPIO_PIR)
    if Current_State==1 and Previous_State==0:
      # PIR is triggered
      print "  Motion detected!"
      # Record previous state
      Previous_State=1
    elif Current_State==0 and Previous_State==1:
      # PIR has returned to ready state
      print "  Ready"
      Previous_State=0
    # Wait for 10 milliseconds
    time.sleep(0.01)
except KeyboardInterrupt:
  print "  Quit"
  # Reset GPIO settings
  GPIO.cleanup()

Como se puede ver, el código está perfectamente comentado. En GPIO_PIR se indica el valor del GPIO al que hemos conectado el OUTPUT del sensor, y ahora está definido como 7 (el que hemos utilizado en esta guía). Si el sensor se activa (“Pir is triggered”) se imprimirá en pantalla “Motion detected”, y cuando vuelve al estado normal se imprime “Ready”. También nos será interesante el tiempo de espera indicado “time.sleep”, que por el momento lo dejamos en 10 milisegundos, pero nos puede interesar en otro uso que sea mayor.

Para finalmente ejecutar el script, desde consola nos situamos en la carpeta en la que lo tengamos ubicado:

sudo python pir_1.py

Adaptar el script a nuestros intereses

El script propuesto nos resulta muy útil para cualquier acción que queramos llevar a cabo de forma automatizada. Simplemente tendremos que modificar el comando a ejecutar en los momentos en que se detecta o no actividad: en el script original el comando es “print”, que muestra mensajes en pantalla.

Para ejecutar comandos de la terminal en Python, recurrimos a la siguiente sintaxis:

import os

os.system(“COMANDO”)

Por tanto, simplemente cambiaremos la orden “print” del script Python que hemos descargado, por esta sintaxis, indicando qué comando queremos ejecutar. Para encender el monitor recurrimos a “xset dpms force on” y para apagarlo “xset dpms force off”. El script quedaría de la siguiente manera:

# Import required Python libraries
import RPi.GPIO as GPIO
import time

# Use BCM GPIO references
# instead of physical pin numbers
GPIO.setmode(GPIO.BCM)

# Define GPIO to use on Pi
GPIO_PIR = 7

print “PIR Module Test (CTRL-C to exit)”

# Set pin as input
GPIO.setup(GPIO_PIR,GPIO.IN) # Echo

Current_State = 0
Previous_State = 0

try:

print “Waiting for PIR to settle …”

# Loop until PIR output is 0
while GPIO.input(GPIO_PIR)==1:
Current_State = 0

print ” Ready”

# Loop until users quits with CTRL-C
while True :

# Read PIR state
Current_State = GPIO.input(GPIO_PIR)

if Current_State==1 and Previous_State==0:
# PIR is triggered
import os
os.system(“xset dpms force on”)
# Record previous state
Previous_State=1
elif Current_State==0 and Previous_State==1:
# PIR has returned to ready state
import time
time.sleep(120)
import os
os.system(“xset dpms force off”)
Previous_State=0

# Wait for 10 milliseconds
# time.sleep(5)

except KeyboardInterrupt:
print ” Quit”
# Reset GPIO settings
GPIO.cleanup()

También he trasladado la orden “time.sleep” que ya incluía el código original, y la he colocado junto a la orden de apagar el monitor. De esta manera, aunque el sensor no detecte movimiento, esperará el tiempo indicado (en segundos) para apagarse, no siendo necesario un movimiento continuado para permanecer encendido. Tanto el tiempo como la sensibilidad del sensor pueden regularse también mediante las dos pequeñas “tuercas” que incluyen, y que ajustamos con un destornillador.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s