• No results found

2 3 PHILOSOPHERS

4.2. UNDERSTANDING CHINESE TRADE POLICY

A continuación se hará una descripción de las conexiones de los módulos requeridos con el propósito ya sabido. Así mismo, se incluirá la configuración y programación indispensable para el satisfactorio acople de todos y cada uno.

Para los scripts programados en la plataforma de la Raspberry, se usó el lenguaje de programación Python, instalado de forma predeterminada con el sistema operativo Raspbian. A lo largo del capítulo se hará mención de varios scripts en Python y una descripción de las funciones de cada uno y su relación entre sí, los cuales son “principal.py”, “pulsador.py”, “temporales.py”, “picam.py”, ”iniciogps.py”, “envioFTP.py”, “envioEmail.py” y un script en PHP nombrado “mapa.php”. Todos estos códigos están guardados en la ruta “/home/pi” de la Raspberry Pi y podrán ser observados con detalle en los anexos.

Scripts iniciales

Habrán tres scripts que se ejecutarán automáticamente al iniciar el arranque con el encendido de la Raspberry Pi y controlan la ejecución de los demás scripts.

A continuación, se adiciona el código del script “principal.py”, este es el primero en iniciar y estará en ejecución constantemente para realizar captura de datos de la cámara y el GPS automáticamente cada 10 minutos contados a partir de la última captura finalizada. Este script hace un llamado de la función “principal” en el script “picam.py” y define el estado como “Automático”, este mismo se incluirá en la publicación final de la página web y se tendrá en cuenta en los siguientes scripts.

Seguido a esto, se inicia el script “pulsador.py”, el cual tiene como función testear continuamente la pulsación del botón de pánico incorporado a los pines GPIO 03 (numeración BCM) y Ground o pines GPIO 05 y 09 (numeración estándar). Se toma el pin GPIO 03, aprovechando su resistencia de pull-up interna que viene activada por defecto, así no es necesario agregar resistencias externas.

Este script también está en continua ejecución, esperando un voltaje bajo en el pin 03 configurado como entrada. Al tener un estado bajo en el GPIO 03, inicialmente se modifica el estado a “S.O.S.” o de emergencia. Seguidamente, se hace llamado a la función “principal” en picam.py. Este último proceso, permitirá grabar un video de 10 segundos, configurables, ya que al tratarse de un estado de

52

emergencia, requerirá de mayor precisión en los datos, por esto obtendremos mejor visualización de la situación con un video y no con una fotografía, como en el caso del estado “Automático”.

Por último, se inicia el script “temporales.py”. El propósito de este script es, intentar realizar una conexión efectiva con el servidor para enviar los archivos que estén en la carpeta “/home/pi/TemporalEnvio”, los cuales están almacenados y que no lograron ser enviados al servidor en el momento de obtenerlos, por alguna falla en la conexión. Este proceso se repite cada 5 minutos, intentando realizar conexión con el servidor en cada momento.

Para iniciar los scripts al encender la Raspberry se utiliza la herramienta “cron” de los sistemas Unix, cron es un administrador de procesos en segundo plano. Al agregar líneas de texto en el archivo “crontab” se incluyen estos procesos al cron, dependiendo de su configuración. En este caso se agregan las siguientes líneas:

Conexión y configuración de la Cámara

Antes de conectar la cámara, localizar la CSI y luego tirar de la pestaña suavemente hacia arriba. Ahora empujar el cable plano del módulo de la cámara en la ranura, con los contactos de plata en el cable de espaldas al puerto Ethernet. Recordar que no se debe empujar el cable muy profundo.

53

Ahora mantenerlo en su lugar con una mano y empujar la lengüeta CSI hacia abajo con la otra mano para bloquear la cinta de la cámara.

Figura 17: Conexión de la cámara a la interfaz CSI de la Raspberry Pi. [39]

Con el hardware en su lugar, ahora es el momento de instalar el software. Antes de activar la cámara, asegurar de que se está ejecutando la última versión del firmware Raspberry Pi con estos comandos: sudo apt-get update

sudo apt-get upgrade

Dependiendo de qué tan antigua es la instalación de Raspbian, y la velocidad de conexión a internet, estos comandos pueden tomar más de media hora para completar.

Una vez que se ha completado, iniciar el script "ROSSP-config", este ayuda a configurar la Pi: sudo ROSSP-config

Desplazarse por la lista hasta el elemento que dice "Enable Camera" y pulsar la tecla enter. En la siguiente pantalla, se pedirá confirmar la elección seleccionando la opción "Enable". A continuación, volverá a la pantalla principal de la utilidad de configuración. Ahora puede seleccionar la opción "Finish" y reiniciar el Raspberry Pi.

Una vez que se haya reiniciado el Raspberry Pi, ahora se puede usar las dos utilidades de línea de comandos, raspistill y raspivid para capturar imágenes fijas y vídeos respectivamente. [40]

Detección de movimiento

Para detectar el movimiento con la cámara se utiliza el script en Python escrito por miembros de la comunidad de Raspberry Pi.

El script se basa en la biblioteca de imágenes de Python que es una biblioteca para el análisis y la manipulación de las imágenes, así que hay que realizar la siguiente instalación:

sudo apt-get install python-imagen-tk

54

wget –c http://pastebin.com/?raw.php i = Yh77jhZ9W –o picam.py chmod +x picam.py

Después que el script “principal.py” o “pulsador.py” hagan el llamado de la función “principal.picam (estado)”, empezará a ejecutarse el código de “picam.py”, con el cual se busca detectar movimiento antes de tomar una fotografía.

Tendremos que ajustar algunos aspectos de la secuencia de comandos para asegurar que funciona para nuestras necesidades. Básicamente, se realizaron modificaciones en el script en la parte de la toma de la fotografía final y el almacenamiento de la misma.

El script está diseñado para almacenar las imágenes en un directorio llamado "PICAM" bajo el directorio personal, pero para nuestra conveniencia esta ruta se modificó por /home/pi/TemporalEnvio.

El script encenderá el LED de color rojo de la cámara y empezará a tomar imágenes de baja resolución. Luego va a compararlas y determinar si hay movimiento mediante la comparación de los píxeles de las imágenes. Si detecta cambios, el script capturará una imagen de mayor resolución. El script es muy eficiente y elimina automáticamente las imágenes de baja resolución que captura para la comparación y sólo almacena las imágenes de alta resolución que han capturado el movimiento.

Al lograr detectar una variación considerable en los pixeles de las imágenes de test, se modifica el valor de la variable takePicture (takePicture = True), de esta manera la condición y el código mostrado en la imagen se ejecutan.

A continuación, se invoca la función interna “saveImage (camerasettings, saveWidth, saveHeight, saveQuality, diskSpaceToreserve)”. En estas líneas de código es donde se obtiene la fotografía o video definitivo con la configuración, resolución y calidad, predefinidos al inicio del script, para lograr una estabilidad entre calidad de la imagen y el tamaño de almacenamiento. El nombre del archivo de la foto está definido como “image + fecha + hora + .jpg”, por ejemplo “image20150715164615.jpg”, asegurando que ningún nombre de archivo se pueda repetir, evitando perdida de información. Y análogamente el nombre de archivo del video está definido de igual forma, únicamente cambiando la palabra “image” por “video” y el formato por .mp4, por ejemplo “video20150715164615.mp4”. Estos archivos se enviarán seguidamente al servidor FTP, en caso de no lograr enviarlo o de no poder conectar con el servidor, serán almacenados en la carpeta “/home/pi/TemporalEnvio”, a la espera de poder ser enviados.

55

La variable “FTPnamePic” hace referencia al nombre con el cual se guardará la imagen en el servidor de archivos, lo cual es necesario especificar al realizar el envío de los archivos a través del protocolo FTP.

Después de guardar la foto o video se ejecuta el script “iniciogps.py” con la ayuda de la función “os.system ()”, que permite escribir líneas de comando de la Shell del sistema. Con este script se obtendrán datos como coordenadas GPS, dirección, fecha y hora de la adquisición de los datos, todos estos alojados en un archivo temporal en la ruta “/home/pi/datos.txt”. En este mismo archivo de texto se adiciona la ruta de almacenamiento de la imagen en el servidor, el estado, anteriormente mencionado y el identificador de dispositivo. Más adelante, se hará referencia a dicho archivo con más detalle.

Conexión y configuración del módulo GPS

El módulo no tiene pines soldados donde conectar los cables, así que, o se sueldan los cables directamente a la placa, o se adquiere una cabecera de pines y se sueldan.

Para comunicar el módulo Ublox M6 con la

RaspberryPi

se usará el puerto serie

/dev/ttyAMA0

”. Para ello se conecta el

módulo

GPS

a la Raspberry tal como indica el esquema, los cables TX y RX deben estar cruzados, es decir, el pin TX de la Raspberry va conectado al pin RX del módulo GPS y el

56

pin RX de la Raspberry va conectado al pin TX del módulo GPS. Se alimenta el módulo desde los pines GPIO de 3.3V y GND de la Raspberry.

Figura 18: Esquema y conexión de módulo Ublox M6 a Raspberry pi. [41]

El puerto serie “

dev/ttyAMA0

”, no está disponible por defecto y hay que desbloquearlo. Para ello se abre el archivo “

/boot/cmdline.txt

”, desde la Raspberry y cambiar:

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1

root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

por:

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4

elevator=deadline rootwait

Seguidamente abrir el archivo “

/etc/inittab

”, y en la última línea poner un ‘#’. Modificaría:

T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

Por:

#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

Para que estos cambios tengan efecto reiniciar la Raspberry Pi, una vez reiniciada ya se tiene el puerto serie listo para usarlo. Ahora instalar algunas dependencias que harán falta para interpretar los datos del módulo GPS con este comando desde la terminal:

sudo apt-get install gpsd gpsd-clients python-gps

GPSD

es una aplicación que corre en segundo plano y que recoge los

datos GPS

del módulo y los envía a través de un socket que necesita ser activado cada vez que inicia la Raspberry, por eso introducir en la terminal:

57

sudo gpsd /dev/ttyAMA0 -F /var/run/gpsd.sock

Para que el socket se inicie automáticamente al arrancar la Raspberry, se abre el archivo “

etc/rc.local

” y se pone justo antes de “

exit 0

”, la línea anterior.

Si se ha hecho todo bien al introducir el comando “cgps -s”, debería mostrar algo como esto:

Figura 19: Pantalla de terminal con datos del GPS. [41]

Ahora que las pruebas de conexión del GPS con la Raspberry Pi están finalizadas y satisfactorias se puede implementar un script para su accionar. [41]

Al tener iniciado el socket GPSD y ya teniendo el receptor GPS activado y conectado con los satélites, solo basta obtener las coordenadas de posición. En el script, constantemente está obteniendo los datos latitud y longitud, en busca de valores efectivos, por esto se realiza una condición para que al obtener datos diferentes a 0 (cero), guarde las coordenadas en variables locales y al igual la dirección de esa ubicación.

El script “iniciogps.py” importa, entre otras, principalmente las librerías “gps” y “pygeocoder”, librerías exclusivas para el uso con un receptor GPS. La primera, se encarga de crear un streaming de datos GPS y constantemente está obteniendo datos de posición, y la segunda tiene como único propósito traducir las coordenadas geográficas obtenidas, en una dirección legible, conocido como geo codificación inversa.

58

Al obtener las coordenadas y la dirección, se realiza validación si el estado actual es “S.O.S.” para hacer un envío inmediato de un correo electrónico con los datos básicos de ubicación, haciendo un llamado a la función “enviar” en el script “envioEmail.py”. Esto, con el propósito de poder tener una reacción oportuna a la emergencia. Se podrá ver en detalle el código del script “envioEmail.py” en los anexos.

Figura 20: Correo electrónico recibido de emergencia.

Posteriormente, se realiza lectura del archivo “mapa.php” guardado con anterioridad en la ruta “/home/pi/mapa.php”, se busca la palabra clave “coordenadas” dentro de todo el texto en el archivo y se modifica por “latitud, longitud”, siendo latitud y longitud las coordenadas obtenidas por el GPS. Se guarda el archivo modificado en la ruta “/home/pi/TemporalEnvio” con un nombre diferente de la misma forma en que se nombró la imagen, quedando como “map + fecha + hora + .html”.

Adicionalmente, se crea un archivo temporal “datos.txt” para agregar los datos obtenidos (latitud, longitud, dirección, fecha, hora, URL del mapa, …). Al finalizar el script de “iniciogps.py” y retomar el final del script “picam.py” se adicionan más datos al archivo “datos.txt” (…, URL de la imagen, estado, idUser). Al completar la escritura de este archivo se guarda en la ruta “/home/pi/TemporalEnvio” con el mismo formato para el nombre utilizado para la imagen y el mapa, quedando como “date + fecha + hora + .txt”. En la siguiente imagen se observa la forma en que se guarda el texto.

Figura 21: Datos almacenados para la importación en la base de datos.

Obsérvese que cada dato está encerrado entre los caracteres “|”. La finalidad de este carácter especial está en la importación de estos datos a la base de datos, previo envío del archivo al servidor, y ya encontrándose guardado en una carpeta exclusiva dentro del servidor.

59

Los archivos definitivos se almacenan en conjunto en la ruta “/home/pi/TemporalEnvio”, como ya se ha mencionado. Al final de los scripts “iniciogps.py” y “picam.py” se intenta realizar el envío inmediato de los archivos respectivos al servidor a través del protocolo FTP. Es en este momento, cuando se realiza el llamado de la función “enviar” dentro del script “envioFTP.py”

Transmisión de archivos al servidor remoto

Como ya se ha venido mencionando, el envío de los archivos se hace a un servidor de archivos a través del protocolo FTP, mientras se tenga una conexión estable a internet. La librería “ftplib” importada en el script “envioFTP.py” permite de forma sencilla realizar el envío de los archivos. Para concretar la transacción, inicialmente se debe establecer una conexión con el servidor, por esto se debe indicar el nombre del servidor o su IP publica, usuario, clave y carpeta donde se guardará el archivo. Si la conexión es satisfactoria, se realiza el envío indicando la ruta de archivo origen y ruta de archivo destino. Finalizada la transacción el archivo enviado se elimina del almacenamiento local. Si por cualquier motivo no se logra concretar la conexión con el servidor y/o no se puede enviar el archivo, el script “envioFTP.py” finalizará su ejecución sin insistir en la conexión y el archivo seguirá guardado temporalmente en el dispositivo local, hasta que se ejecute el script “temporales.py” y seguida la función “listaArchivos” del script “envioFTP.py” y se realice nuevamente un intento satisfactorio de conexión con el servidor, enviando efectivamente los archivos pendientes.

La intención de la función “listaArchivos” es realizar un listado de todos los archivos guardados en la carpeta “/home/pi/TemporalEnvio”, los cuales se encuentran en espera de envío al servidor. Este programa es ejecutado por el script “temporales.py” y se ejecuta automáticamente desde el arranque de la Raspberry Pi, realizando el mismo proceso cada 5 minutos. Para dar cumplimiento, se agrega una línea de código en el “crontab”, ya mostrado anteriormente.