Sistema dedicado para la detección de objectos con un sensor de movimiento Arduino en el cuál realiza una captura de imagen a partir de una webcam, posteriormente lo sube a imgur y finalmente se publica un mensaje a partir de una cuenta de Twitter con la fecha, hora y la imagen con el enlace de imgur.
- Cano Canalejas, Esperanza
- Dávila Guerra, Adrián
- Sensor de movimiento Arduino
- Raspberry Pi 3 Model B+
- Componentes del Ultimate Starter Kit de la Raspberry Pi)
- WebCam compatible para la Raspberry
En esta imagen podremos ver los slots correspondientes de la tarjeta GPIO (ojo, hemos utilizado este modelo en concreto, puede variar algunos IDs descritos en la placa). Como podéis ver, hemos señalado qué pines vamos a utilizar:
- Utilizaremos el PIN 14 para encender/apagar el LED cuando enviamos datos en él.
- Para el detector de movimiento insertamos tres cables DuPont (macho-macho) para cada uno de los pines correspondientes. Uno en el PIN 18 que será el que enviará datos (output) del sensor de movimiento a la Raspberry Pi, GND que será para la toma de tierra y 5v0 para la corriente.
Ahora si queremos ver cuáles son los pines que corresponde a los tres cables DuPont, debemos quitar la capsula del sensor de movimiento y mirar en su interior qué pines corresponden cada una de estos, de izquierda a derecha serían:
- Corriente (+5V)
- Envío de datos
- Toma de tierra
Debemos seguir una serie de pasos para crear nuestra APP de imgur y obtener la clave de API:
- Es necesario registrarse en imgur https://imgur.com/
- Una vez creada la cuenta de imgur crearemos nuestra propia aplicación https://api.imgur.com/oauth2/addclient.
- Durante el proceso del registro de la APP, el tipo de autenticación marcamos 'OAuth 2 authorization without a callback URL', lo siguiente sería insertar nuestro correo electrónico y la descripción de la APP.
- Una vez registrada la aplicación, nos vamos a la configuración de la cuenta y a la sección de apps para obtener el Client ID ClientSecret https://imgur.com/account/settings/apps
- Finalmente, si tenemos Python 2.7 instalado en nuestra PC, debemos insertar en nuestro terminal las siguientes líneas para obtener el access_token y refresh_token.
python
>> from imgurpython import ImgurClient
client_id = 'YOUR CLIENT ID'
client_secret = 'YOUR CLIENT SECRET'
client = ImgurClient(client_id, client_secret)
authorization_url = client.get_auth_url('pin')
print(authorization_url)
# Con esto nos generará un enlace de la página para obtener dicho PIN
credentials = client.authorize('PIN obtenido para la autenticación', 'pin')
print(credentials)
#Obtenemos el 'access_token' y 'refresh_token'
Al igual que todo el proceso para obtener la clave API de imgur, debemos seguir una serie de pasos:
- Creamos nuestra aplicación en https://apps.twitter.com/
- Una vez creada, nos vamos a la sección de 'Keys and Access Tokens'
- Necesitaremos las claves de Consumer Key (API Key), Consumer Secret (API Secret).
- Click en Create my acccess token para obtener Access Token y Access Token Secret. https://apps.twitter.com/
Para ello tendremos que instalar en una tarjeta microSD el SO Raspbian, una vez hecho tendremos que añadir dos ficheros de configuración durante el boot. Nos situamos en /media/usuario/boot para añadir los siguientes ficheros:
- Un fichero llamado ssh, que esté vacío y sin extensión.
- Creamos un fichero wpa_supplicant.conf y editamos:
# /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="mi_ssid"
psk="mi_psk"
key_mgmt=WPA-PSK
}
Con ello, de forma automática el boot generará los ficheros necesarios dentro de /media/usuario/rootfs. Dentro de este directorio añadimos unas líneas al fichero /media/usuario/rootfs/etc/dhcpd.conf para que podamos conectar de forma estática, por ejemplo:
interface wlan0
static ip_address=192.168.0.3/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1
Esto ya dependerá de la red que dispongas.
En caso de que no se detecte la dirección ip escrita de forma estática, ya sea porque quizás está accediendo a una intefaz distinta (en vez de wlan0), escribimos nmap 192.168.0.0/24
por ejemplo, para localizar todas las direcciones IPs de dicha red.
Una vez listo entramos por la terminal, escribiendo:
ssh pi@tu_ip_local
La contraseña por defecto será raspberry.
Se debe crear una carpeta en el directorio /home/pi llamado motionDetector, dentro del directorio se debe crear dos ficheros necesarios, uno dentro de al ejecución del app motiondetection de Mule y otro independientemente para detectar el movimiento y lanzar la petición a la dirección http://localhost:8081/update.
File: movementmonitor.py
import urllib2
import RPi.GPIO as GPIO
import time
from time import gmtime, strftime
GPIO.setmode(GPIO.BCM)
PIR_PIN = 18
GPIO.setup(PIR_PIN, GPIO.IN) # Corresponde al sensor de movimiento (cable de datos)
GPIO.setup(17, GPIO.OUT) # Corresponde al LED
try:
while True:
if GPIO.input(PIR_PIN):
GPIO.output(17,True)
time.sleep(1)
timex = strftime("%d-%m-%Y %H:%M:%S", gmtime())
print timex + " MOVIMIENTO DETECTADO"
time.sleep(1)
GPIO.output(17,False)
print urllib2.urlopen("http://localhost:8081/update").read() #Hacemos la peticion a mule
time.sleep(1)
except KeyboardInterrupt:
print "Salir"
GPIO.cleanup()
File: imgurScript.py
import imgurpython
from imgurpython import ImgurClient
from datetime import datetime
from time import gmtime, strftime
import calendar
import time
import sys
import os
z = 1
while z<10:
os.system("fswebcam -r 800x600 -d /dev/video0 /home/pi/motionDetector/screenshots/image_"+str(z)+".jpg")
z = z + 1
client_id = 'client_id a insertar'
client_secret = 'client_secret a insertar'
access_token = 'access_token a insertar'
refresh_token = 'refresh_token a insertar'
client = ImgurClient(client_id, client_secret, access_token, refresh_token)
fields = {}
fields['title'] = "Otro album de Copernico - "+strftime("%a, %d %b %Y %H:%M:%S", gmtime())
fields['privacy'] = 'public'
album = client.create_album(fields)
str = "https://imgur.com/a/"+album['id']
def ImgUR():
z = [1]
while z[0] < 10:
imagen = client.upload_from_path("/home/pi/motionDetector/screenshots/image_%01d.jpg"% z[0],None,False)
client.album_add_images(album['id'], imagen['id'])
z[0] = z[0] + 1
if z[0] == 10:
return strftime("%a, %d %b %Y %H:%M:%S", gmtime())+ " - "+str+" https://imgur.com/"+imagen['id']
result = ImgUR()
Para hacerlo más simple sin necesidad de crear un álbum, hacer nueve capturas de pantalla y subir esas diez imágenes en imgur, en su lugar, eliminamos la opción de crear un álbum y se sube una única foto. Así se realizará todo el proceso de manera más rápida y óptima.
File: imgurScript.py (version 2.0)
import imgurpython
from imgurpython import ImgurClient
from datetime import datetime
from time import gmtime, strftime
import calendar
import time
import sys
import os
os.system("fswebcam -r 800x600 -d /dev/video0 /home/pi/motionDetector/screenshots/image.jpg")
client_id = 'client_id a insertar'
client_secret = 'client_secret a insertar'
access_token = 'access_token a insertar'
refresh_token = 'refresh_token a insertar'
client = ImgurClient(client_id, client_secret, access_token, refresh_token)
def ImgUR():
imagen = client.upload_from_path("/home/pi/motionDetector/screenshots/image.jpg",None,False)
return strftime("%a, %d %b %Y %H:%M:%S", gmtime())+ " - https://imgur.com/"+imagen['id']
result = ImgUR()
Standalone Mule 3.9.0
https://developer.mulesoft.com/download-mule-esb-runtime
Para ello, recomiendo la instalación del Standalone de Mule a partir de este tutorial, teniendo en cuenta de que se está utilizando otra versión, por lo que es recomendable seguir los pasos con cuidado.
https://dzone.com/articles/running-mule-4-on-raspberry-pi
Una vez hecho, insertamos la línea su - mule
y entramos en la siguiente dirección:
cd /opt/mule/mule-standalone-3.9.0/app
Pondremos nuestro proyecto comprimido con un .zip, no será necesario descomprimirlo dado que MuleSoft lo realiza de forma automática cuando ejecute dicha app. Acto seguido, nos movemos a la siguiente ruta:
cd /opt/mule/mule-standalone-3.9.0/bin/
Ejecutamos mule vía sh, añadimos dos argumentos: uno para arrancar la aplicación y el otro para que ejecute el código de Python en Cpython en lugar de Jpython, para que podamos utilizar los módulos de imgurpython y requests necesarios.
mule@raspberrypi:/opt/mule/mule-standalone-3.9.0/bin$ sudo ./mule -app motiondetection -M-Dpython.path=/home/pi/.local/lib/python2.7/site-packages
Una vez hecho esto, el archivo comprimido motiondetection.zip se descomprimirá en el directorio /app de mule-standalone-3.9.0.
Cuando aparezca la siguiente imagen, se debe ejecutar otro terminal (se tendría que acceder otro terminal por ssh) el comando python movementmonitor.py
para activar la detección de movimiento.