Detección de movimiento con el Sensor de presencia HC-SR501
Publicado el 10 de Junio de 2016En 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.
Copyright © 2024 desde 2016. Todos los derechos reservados | Diseño JaviPSantos