Sensor de movimientos HC-SR501 conectado por GPIO

Vamos a conectar un sensor HC-SR501 cómo el de la foto a una OrangePi, un clon chino de la RaspberryPi, que tiene también una serie de puertos GPIO's. La librería que vamos a utilizar funciona para esta placa, pero la idea y concepto es aplicable también a una Raspberry Pi utilizando por ejemplo la librería Python RPi.GPIO

Lo primero que hacemos es conocer el pinout del HC-SR501, que prácticamente tiene dos pines para la alimentación (GND y VCC) y un pin de salida (OUT) que será el que nos indique si ha detectado algún movimiento.

Luego lleva un par de resistencia variables o potenciómetros que nos permiten ajustar los parámetros de sensibilidad y duración de la señal, es decir, durante cuanto tiempo vamos a querer que en pin OUT tener la salida informada. Esto irá configurado dependiendo de la utilización y disposición del HC-SR501.

Primero y si no lo tenemos instalado, es instalar git:

orangepi@OrangePI:~$ sudo apt-get install git

Vamos a utilizar la librería en Python orangepi_PC_gpio_pyH3 para acceder los puerto de conexión GPIO's. Ésta librería la podeis encontrar en el GitHub del usuario duxingkei33, y básicamente es una adaptación de la librería pyA20 0.2.1 que se utiliza en la placa A20-OLinuXino-MICRO.

Vamos a clonar primero el repositorio:

git clone https://github.com/duxingkei33/orangepi_PC_gpio_pyH3.git

Y ahora para instalar ejecutamos:

cd orangepi_PC_gpio_pyH3
sudo python setup.py install

Ahora que ya tenemos el software vamos a ver como conectamos el hardware. El sensor HC-SR501 funciona a 5v, por lo buscamos los pines que nos proporcionan la alimentación (en la imagen de abajo corresponden a los pines 4 y 6 de la referencia CONN. de color azul). El pin con el estado del sensor lo he conectado al puerto 7 de GPIO (en la imagen de abajo corresponde dentro de la línea azul CONN. al conector número 7)

(La imagen es de http://electroniqueamateur.blogspot.com.es)


Una vez tenemos conectado nuestro sensor HC-SR501 a nuestra placa OrangePi, vamos a generar un pequeño script de ejemplo para leer el valor del conector GPIO 7, o tal y como lo veremos en el código el port.PA6:

from pyA20.gpio import gpio
from pyA20.gpio import port
from pyA20.gpio import connector

gpio.init() #Inicializamos el modulo. Siempre lo primero

gpio.setcfg(port.PA6, gpio.INPUT) #Configura PA6 como entrada

while True:
  if gpio.input(port.PA6) == 1:
    print "PA6/PIN 7 = 1"
  else:
    print "PA6/PIN 7 = 0"

Si vemos en la imagen anterior con el pinout, el conector GPIO 7 corresponde al nombre del puerto PA6 (línea PORT de color amarillo de la imagen). La librería pyA20 utiliza esta nomenclatura de puertos ya que la placa a la que está orientada originariamente (no ésta modificación/adaptación) tiene diferentes fuentes de GPIO's y es una forma de darles un nombre único dentro de todas las conexiones.

El ejemplo es muy sencillo y únicamente lo que hace es leer el valor del sensor, que puede ser "0" (no detecta movimiento) o "1" (se detecta movimiento). Problema que veo por ahora: la inicialización del módulo requiere root, por lo que el script de Python lo tenemos que ejecutar con sudo

Recordad que el sendor HC-SR501 tenía dos potenciómetros los cuales nos ayudan a calibrar la sensibilidad y el tiempo en el que dejamos en HIGH la salida en caso de ser activado.

Cómo información adicional, si miramos dentro del código de la librería orangepi_PC_gpio_pyH3 el fichero mapping.h tiene la relación entre PUERTO y CONECTOR. Por ejemplo, el que yo he utilizado lo encontraremos definido así ("PA6" cómo 7):

...
{   "PA6",  SUNXI_GPA(6),  7   },
...