Raspberry Pi y Arduino: Mejorando la alarma de ingreso

Raspberry Pi y Arduino son dos plataformas complementarias en distintos aspectos: mientras la relativa sencillez del Arduino lo hace muy eficaz trabajando con sensores y actuadores, la mayor potencia de Raspberry Pi sirve muy bien para conexiones inalámbricas y video, al poderle instalar un sistema operativo completo.

Alarma con Arduino y Raspberry Pi
Demostración del funcionamiento de la alarma con Raspberry Pi y Arduino, donde la alerta se dispara al detectar una proximidad menor a 5 cm.

En un artículo anterior se detallaban los pasos para fabricar una alarma casera conectando un Arduino a una laptop vieja. Obviamente la desventaja principal de esta solución era el volumen de la laptop, que restringía bastante el uso práctico de todo el sistema. En este nuevo artículo se realizará una conexión entre Raspberry Pi y Arduino. El Raspberry Pi reemplazará a la laptop como entorno donde funcione Node.js y la cámara de video.

Elementos físicos que conforman a la alarma.

 

Preparación del Raspberry Pi

Se adquirió un Raspberry Pi 3 modelo B versión 1.2, el cual venía con una tarjeta de memoria Micro SD con NOOBS pre-instalado. Para poder realizar la configuración inicial se le conecta un monitor y teclado; luego ya no será necesario ya que accederemos vía SSH.

En la pantalla inicial se escoge que se instale el sistema operativo Raspbian, que es la distribución oficial de Linux para Raspberry Pi. Es una adaptación de Linux Debian.

Conexión al Internet

Una vez que se haya terminado de instalar, se debe conectar el Raspbian al Internet para poderlo actualizar. Para empezar se ingresa al dispositivo utilizando el usuario por defecto «pi«, con clave «raspberry«, y se elevan los permisos:

sudo su

Se buscan las redes inalámbricas disponibles:

iwlist wlan0 scan

Se edita el archivo /etc/wpa_supplicant/wpa_supplicant.conf para poder configurar la conexión a Internet vía wifi:

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="NombreDeRedInalámbricaDisponible"
psk="contraseña"
}

Para que la configuración tenga efecto, se reinicia el servicio:

ifdown wlan0
ifup wlan0

Si no funciona por cualquier motivo, se reinicia el dispositivo:

init 6

Actualización de Raspbian

Es casi seguro que existen actualizaciones disponibles del sistema operativo. Primero se actualizan los paquetes con update, y luego se suben las versiones disponibles con dist-upgrade.

sudo su
apt-get update
apt-get dist-upgrade

Envío de la señal del sensor de distancia con Raspberry Pi y Arduino

Se compilará la última versión de Node.js (por defecto Raspbian trae una versión beta) para el envío vía websocket de la señal del sensor ultrasónico de distancia, a fin de realizar la integración entre Raspberry Pi y Arduino.

Actualización de Node.js

Se debe quitar la versión instalada de Node.js:

apt-get remove nodejs npm

Y luego instalar la última versión:

curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash -
sudo apt-get install -y nodejs
sudo apt-get install -y build-essential

Conexión con el Arduino

La conexión entre Raspberry Pi y Arduino es vía USB, de la misma forma que se conectaba a la laptop. De igual manera. la conexión con Node.js se logra mediante la librería johnny-five, según se detalla en el artículo anterior y con la única diferencia que, una vez se haya cargado el software de control en el Arduino, se debe desconectar el cable USB de la laptop y conectarlo en algún puerto USB disponible del Raspberry Pi.

Video en tiempo real

Se compilará el software ffmpeg para conectarse con la cámara de video y así generar el streaming de video en tiempo real.

Compilación de ffmpeg

Primero se compila la librería de VideoLAN:

cd /usr/src
git clone git://git.videolan.org/x264
cd x264
./configure --host=arm-unknown-linux-gnueabi --enable-static --disable-opencl
make
make install

Luego se compila el software en sí. Observar que el último paso de la compilación puede durar algunas horas (para modelos B+ con procesador multi-nucleo, se puede reemplazar el paso «make» por «make -j4» para -teóricamente- utilizar todos los núcleos y acelerar la compilación, si bien no se lo ha probado lo cual en las pruebas realizadas aceleró la compilación de varias horas a poco más de 30 minutos):

cd /usr/src
git clone git://source.ffmpeg.org/ffmpeg.git
cd ffmpeg/
sudo ./configure --arch=armel --target-os=linux --enable-gpl --enable-libx264 --enable-nonfree
make
make install

Se crea el archivo de configuración /etc/ffserver.conf con el siguiente contenido:

Port 8090
# bind to all IPs aliased or not
BindAddress 0.0.0.0
# max number of simultaneous clients
MaxClients 10
# max bandwidth per-client (kb/s)
MaxBandwidth 1000
# Suppress that if you want to launch ffserver as a daemon.
NoDaemon

<Feed feed1.ffm>
File /tmp/feed1.ffm
FileMaxSize 10M
</Feed>

<Stream test.mjpg>
Feed feed1.ffm
Format mpjpeg
VideoFrameRate 4
VideoSize 600x480
VideoBitRate 80
# VideoQMin 1
# VideoQMax 100
VideoIntraOnly
NoAudio
Strict -1
</Stream>

Envío del streaming de video

Se empieza habilitando la cámara de video, que por defecto viene desactivada. Para ello, primero se conectará la cámara en el puerto respectivo del Raspberry Pi.

Una vez conectada la cámara, se abrirá la herramienta para la configuración de Raspbian:

raspi-config

En el menú se escogerá la opción 5, «Interfacing Options», se escogerá la opción «Camera» y se la habilitará.

Para que la cámara de video sea identificable por ffmpeg, se debe primero cargar el respectivo driver:

modprobe bcm2835-v4l2

Con este comando aparecerá la carpeta /dev/video0

NOTA: En caso de aparecer algún error en el paso anterior, se puede reiniciar la máquina con init 6 ya que puede deberse a cambios del sistema esperando por un reinicio luego de una actualización.

Para iniciar el streaming de video, se debe primero iniciar el servidor de streaming como se explica en el anterior artículo, y luego ejecutar el siguiente comando:

ffmpeg -f /etc/ffserver.conf & ffmpeg -v verbose -s 320x240 -f video4linux2 -i /dev/video0 -f mpeg1video -b 400k -r 24 http://107.170.105.36:8082/mivideo/320/240

Medición de la latencia

La latencia encontrada es alrededor de medio segundo. Fue medida con 26 muestras, dando como resultado una latencia promedio de 535 ms con una desviación estándar de 83 ms. El procedimiento fue:

  1. Desplegar en pantalla un cronómetro
  2. Filmar este cronómetro con la cámara del Raspberry Pi y desplegar el video en pantalla al mismo tiempo junto al cronómetro
  3. Tomar fotos a la pantalla, mostrando tanto el cronómetro como su streaming de video.
Ejemplo de foto utilizada en el muestreo para el cálculo de la latencia en el video.

Este medio segundo de latencia se lo considera bastante aceptable, tomando en cuenta que es el Raspberry Pi quien procesa las imágenes y las envía al servidor en EEUU, para luego regresar a Ecuador en la página Web. Esta baja latencia nos permitirá hacer cosas muy interesantes en el tercer artículo de esta saga, relacionado un poco a la robótica.

Aplicabilidad y siguientes pasos

Gracias a esta fusión entre Raspberry Pi y Arduino, el proyecto ya tendría varias aplicaciones prácticas en el mundo real, como por ejemplo:

  • Sistema de seguridad para casas, negocios, cajas fuertes, ataúdes (¿por qué no?) y en general cualquier espacio que no deba ser abierto sin autorización.
  • Ayuda para parqueo de autos en retro, en donde el sistema se lo instalaría en la parte posterior del vehículo.
  • Sistema de aviso de parqueaderos libres, con registro automático de placa.
  • Registro automático de ingreso a un evento, con conteo de asistentes.
  • Asistente para personas con discapacidad visual
  • Y muchas otras posibilidades.

Al igual que en el artículo anterior, en esta nueva iteración del proyecto de alarma aún nos falta el audio en tiempo real. La placa Raspberry Pi no cuenta con alguna entrada de audio, solamente de salida, por lo que el agregar señal de audio al streaming de video solo es posible agregando algún tipo de hardware que permita esta funcionalidad, de lo cual la solución más sencilla y económica es enchufar un micrófono USB, o una tarjeta de sonido USB. Se realizarán experimentos en este sentido una vez consigamos el hardware apropiado.

¿Hacia dónde va este proyecto? Como se comentó, en próximas entregas se agregarán elementos de robótica y otras características interesantes que, junto con Raspberry Pi y Arduino, expandirán bastante las posibilidades de aplicación. Cualquier sugerencia será bien recibida en los comentarios abajo.

También te puede interesar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *