¿Nos ayudas a pagar el Hosting?

Compartir en facebook Compartir en twitter Compartir en linkedin

Detección de movimiento con el Sensor de presencia HC-SR501

Publicado el 10 de Junio de 2016

En este artículo voy a explicar como conectar un sensor de movimiento al BUS GPIO de la placa Orange Pi y como realizar una lectura del sensor para provocar una acción cualquiera, como puede ser encender y apagar una luz, activar un marco digital, disparar una cámara, etc. El límite, como siempre, es nuestra imaginación.

Que necesitas:

Yo voy a utilizar el módulo HC-SR501 que se basa en la tecnología de infrarrojos. Se puede comprar por menos de 1€. Puedes descargar su ficha de datos aquí.

Para conectarlo necesitaremos saber como conectar los pines. Asegúrate de que tu dispositivo tiene esta distribución, si cambia el modelo, pueden cambiar los pines. En el caso del HC-SR501 se distribuyen así:

El voltaje de funcionamiento es entre 5V y 20V, así que podemos conectar el Positivo a la patilla 2 del BUS. El negativo a cualquiera de las masas (GND), por ejemplo a la patilla 6. Y la salida del sensor (lectura), para este ejemplo, la colocaremos en la patilla 7. Si necesitas una referencia de los pines del BUS de la Orange Pi, pulsa aquí.

Necesitamos instalar cualquiera de las librerías que manejan el BUS GPIO. Para este ejemplo usaré la librería orangepi_PC_gpio_pyH3 basada en pyA20. Para instalar consulta este otro artículo.

Con el sensor conectado, necesitamos detectar cualquier cambio en la patilla Lectura, para lo que escribiremos un archivo en Python que realizará una lectura del pin 7 e imprimirá una salida en pantalla dependiendo de si en dicho Pin hay un 1 (HIGH) o un 0 (LOW).

Crea un nuevo archivo llamado detector.py:

sudo nano detector.py

Y añade el siguiente código:

#!/usr/bin/env python

from time import sleep

from pyA20.gpio import gpio
from pyA20.gpio import port
sensor = port.PA6
gpio.init()
gpio.setcfg(sensor, gpio.INPUT)
print "Sensor inicializado."
print "Detectando movimiento."
while True:
    if gpio.input(sensor) == 1:
      	print "Movimiento detectado."
    sleep(0.5)

Es un código muy sencillo que explicaré por encima. Con las 2 primeras líneas importamos las librerías necesarias para interactuar con el BUS GPIO. La tercera línea asigna la variable sensor al PIN 7 del BUS GPIO y la cuarta lo inicializa. La quinta línea lo configura como PIN de entrada de datos.

La línea

while True:
ejecuta el código que le sigue en un bucle infinito.

Y con

if gpio.input(sensor) == 1:
comprobamos si en el Pin 7 hay un 1 o un 0. En caso de que sea un 1, quiere decir que el sensor ha detectado una presencia y realizamos una acción. Eso es todo.

Si ejecutamos el script con:

sudo python detector.py

al pasar una mano por delante del sensor, debería imprimirse en pantalla:

Movimiento detectado.

Y vuelve a leer el sensor a la espera de más movimiento.

Yo he usado este código en el proyecto del marco digital. Al activar el marco, se puede prefijar un tiempo en el que se apague, o que detecte presencia. Si no detecta ninguna presencia, activamos el protector de pantalla y se irá a negro. Puedes hacerlo con:

xset dpms force off

y ejecutar el siguiente codigo que es el mismo que el anterior, pero ejecutando una tarea (en este caso, reactivar la pantalla):

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
# author    : "javier pérez santos para orangepiweb.es"
# credits   : "javier pérez santos, orangepiweb.es"
# copyright : "Copyright 2017, orangepiweb.es"

"""
   ___                             ____  ___        __   _
  / _ \ _ __ __ _ _ __   __ _  ___|  _ \(_) \      / /__| |__   ___  ___
 | | | | '__/ _` | '_ \ / _` |/ _ \ |_) | |\ \ /\ / / _ \ '_ \ / _ \/ __|
 | |_| | | | (_| | | | | (_| |  __/  __/| | \ V  V /  __/ |_) |  __/\__ \
  \___/|_|  \__,_|_| |_|\__, |\___|_|   |_|  \_/\_/ \___|_.__(_)___||___/
                        |___/

Detección de movimiento con el Sensor de presencia HC-SR501
"""

from time import sleep

from pyA20.gpio import gpio
from pyA20.gpio import port
import subprocess
from datetime import datetime
import time

sensor = port.PA6

gpio.init()

gpio.setcfg(sensor, gpio.INPUT)

print "Sensor inicializado: " + str(datetime.now())
time.sleep(3)

print "Detectando movimiento: " + str(datetime.now())

while True:
    if gpio.input(sensor) == 1:
        print "---"
        print "Movimiento detectado a " + str(datetime.now())
        subprocess.call(["xset", "dpms", "force", "on"])
        print "Esperamos 1 hora"
        time.sleep(3600)
        subprocess.call(["xset", "dpms", "force", "off"])
        print "Detecting motion again at " + str(datetime.now())
    time.sleep(0.5) # Detectando movimiento cada medio segundo

Sencillo pero efectivo. Con la librería subprocess hacemos una llamada a un script externo. Aquí, activamos la pantalla durante, 1 hora detecte o no movimiento y la desactivamos de nuevo para volver a realizar la lectura. También podríamos lanzar desde aquí el script de Visualización de diapositivas y programar que se apagase automáticamente transcurrida 1 hora. Recuerda que el límite es tu imaginación.

Espero que te haya sido de utilidad, no dudes en escribir un comentario si ves algún error o si puedo ayudarte.


Utiliza este espacio si quieres añadir algún comentario adicional o si tienes alguna duda.
No olvides añadir tu distribución y tu placa.

Todos los comentarios serán validados antes de su publicación.

Nombre*

Email* Nunca será publicado ni compartido

Comentario*



Copyright © 2024 desde 2016. Todos los derechos reservados | Diseño JaviPSantos

Solicitamos su permiso para obtener datos estadísticos de su navegación en esta web, en cumplimiento del Real Decreto-ley 13/2012. Si continúa navegando consideramos que acepta el uso de cookies.

OK | Más información