Hoy hemos tenido algunos avances interesantes. He sido capaz de controlar desde la Raspberry Pi un relé conectado al Arduino Nano:
Para ello, he hecho uso unos módulos RF que trabajan a 433 MHz, controlados mediante la librería RCswitch, además de hacer uso de algunas instrucciones obtenidas de NinjaBlocks: Adding 433 to your Raspberry Pi
Siguientes pasos: integrar el uso de la librería en el sistema de control de la Raspberry con WhatsApp, y transferir la operativa desde el Arduino Nano a un chip Attiny85.
Etiquetas: arduino nano, attiny85, domótica, raspberry pi, relé
Hoy he recibido un Arduino Nano que he comprado en DX.com. Llevaba tiempo con ganas de complementar los proyectos que tengo en marcha con la Raspberry con un Arduino. Y ya he hecho un pequeño programa, bastante sencillote:
¿Por qué complementar la Raspberry con Arduino? La razón es la siguiente: tengo varios proyectos para controlar diversos sistemas distribuidos a lo largo de la casa. Como su ubicación es distante, no es viable controlar estos sistemas simultáneamente. Sin embargo, con un sistema de emisor-receptor por radiofrecuencia (como este), conectado a la Raspberry y a diversos sensores y relés, puedo operar estos elementos a distancia. ¿Dónde entra el Arduino? En dos aspectos: en primer lugar, permite programar los sistemas de control en primera instancia y, en segunda, transferirlos a un pequeño chip, el Attiny85, que realiza funciones similares.
Espero poder avanzar en esta línea.
Etiquetas: arduino, attiny85, raspberry pi
Seguimos trasteando con la Raspberry. Aunque originariamente mi intención era controlar el sistema de riego a través de la Raspeberry y WhatsApp, el disponer de cuatro relés me ha dado libertad para poder controlar más elementos.
La siguiente idea, cómo no, era poder controlar la luz de la entrada incorporando un sistema de control de movimiento que se pudiera activar y desactivar de manera remota. Y aprovechando que ya tenía implementando el sistema de comunicación por WhatsApp, se me ocurrió que lo podría modificar para que también pudiera controlar el sensor. Pero lo primero era hacerse con un sensor.
En DealExtreme encontré un sensor de movimiento piroeléctrico basado en infrarrojos (PIR) por algo menos de 4€, y que además trabaja a 3’3V, por lo que es perfecto para la Raspberry, y no necesita ningún adaptador de voltaje.
Una vez recibido, he modificado un poco el programa que controla las comunicaciones de WhatsApp para realizar lo siguiente:
…todo ello para poder activar las luces de la entrada por movimiento, y a distancia.
Esta es una captura del intercambio de mensajes a través de WhatsApp:
Por otro lado, el sistema ahora mismo es un tanto rudimentario, y todo funciona mediante cableado:
Estoy trabajando en una mejora: comunicación con el sensor PIR mediante radiofrecuencia con un microcontrolador ATTiny85. Pero eso ya quedará para otro día.
Etiquetas: attiny85, pir, raspberry pi, whatsapp
Desde luego, parece que no tengo suerte con las tarjetas WiFi que he comprado para la Raspberry Pi. Tanto la mía (una Leguang LG-N18 que compré en DealExtreme) como una TP-Link TL-WN725N v2 comprada en PcBox para mi padre no funcionaron de manera nativa en raspbian, por lo que tuve que andar compilando módulos para el kernel. Ya relaté el proceso en el caso de la TP-Link, pero no lo había hecho en el caso de la Leguang.
En este caso, me dio algo más de guerra hacer funcionar la dichosa tarjeta en raspbian, pero lo conseguí. En este caso consistió en compilar el módulo del kernel para un dispositivo rt5370sta, que es lo que en realidad es la Leguang. Ahí van los pasos:
1.- Instalación módulos kernel: En primer lugar, fue necesario prepara el kernel para poder realizar la compilación del módulo rt5370sta.
cd /usr/src
wget https://github.com/raspberrypi/linux/archive/rpi-3.6.y.tar.gz
tar xvfz rpi-3.6.y.tar.gz
mv linux-rpi-3.6.y linux
ln -s /usr/src/linux /lib/modules/3.6.11+/build
cd /lib/modules/3.6.11+/build
make mrproper
gzip -dc /proc/config.gz > .config
make modules_prepare
wget https://github.com/raspberrypi/firmware/raw/master/extra/Module.symvers
2.- Descarga y compilado de librería rt5370sta: En segundo lugar, fue necesario descargar y compilar la librería correspondiente al módulo rt5370sta. Me dio bastante guerra encontrar una solución funcional, y lo mejor fue compilar directamente el módulo.
cd ~
git clone https://github.com/alangomes/rt5370sta
cd rt5370sta
sudo make clean
sudo make
sudo make install
modprobe -r rt2800usb
modprobe rt5370sta
Con ello, la tarjeta quedó correctamente instalada y completamente funcional en el sistema.
http://www.raspberrypi.org/phpBB3/viewtopic.php?t=34821&p=328114
http://forum.xbian.org/showthread.php?tid=89&page=2&highlight=rt2870
Etiquetas: leguang lg-n18, raspberry pi, raspbian, tarjeta wifi
Seguimos con los trasteos. Como complemento al sistema de control de los relés, pensé que sería interesante poder controlar los mismos de múltiples maneras. Hasta el momento, tenía implementados los siguientes:
Además, me encontraba con otro problema: los dos sistemas anteriores permiten controlar -cada uno con sus ventajas e inconvenientes- los relés, pero dan poca información sobre el estado de la Raspberry y los puertos de E/S. Así que pensé que sería divertido poder comunicarse con la RPi mediante un sistema de mensajería. Y dentro de la diversión, la opción más divertida era el hacerlo por WhatsApp.
Para ello, tenía que acometer dos fases principales. Primera: montar un sistema de envío de mensajes a través de WhatsApp. Segunda: modificar el sistema de recepción de mensajes para que fuera capaz de interpretar un mensaje como un comando, y procesarlo en consecuencia.
En lo referente a la primera fase, encontré un artículo que trataba sobre cómo enviar mensajes de estado de la Raspberry mediante WhatsApp: Notificación de la temperatura de la CPU por WhatsApp. El proceso, en líneas generales, es el siguiente:
Dicho y hecho. Lo más importante de todo esto es yowsup. Es una librería escrita en Python que permite utilizar WhatsApp como interfaz de mensajería para aplicaciones. En el artículo anterior se utilizaba para enviar mensajes, pero también tiene la capacidad de recibirlos. Y por tanto, abre la posibilidad de tratar dichos mensajes para procesar instrucciones. La segunda fase podía ser acometida.
La idea general era modificar la función de recepción de mensajes para que no sólo los mostrara por pantalla, sino que también se pudieran procesar. Tras trastear un poco, encontré que el fichero yowsup/src/Examples/ListenerClient.py contiene dicha función, en concreto, la función onMessageReceived. Por defecto, procesa el mensaje recibido y lo muestra por pantalla.
La idea más básica para ejecutar comandos era aprovechar mi script bash, que tendría que ser llamado por la librería python. Por suerte, Python puede llamar a comandos del sistema operativo, y pasarles comandos. Así que con una sencilla línea, se pueden tratar los mensajes recibidos como comandos del sistema operativo:
subprocess.check_call(shlex.split(messageContent))
Esta instrucción parte el mensaje recibido de una sola cadena a una lista de instrucciones, y las procesa como una llamada al sistema. Con esta simple instrucción, se puede ejecutar cualquier comando de éste, junto con sus variables asociadas.
Y lo mejor es que funciona.
…o al menos, casi del todo. De esta manera, sólo funciona en la primera ejecución. El problema viene por lo siguiente: para poder recibir mensajes, es necesario tener el yowsup funcionando de manera continua en segundo plano. Esto se puede hacer combinando screen con el comando necesario para lanzar yowsup:
screen -dmS whatsapp python /home/pi/yowsup/src/yowsup-cli -c /home/pi/yowsup/src/config.example -l -a -k
Una vez que yowsup se ejecuta constantemente en segundo plano, podemos recibir los mensajes que enviamos. Pero cuando ejecutamos dichos comandos con el script bash, lanzamos un nuevo proceso yowsup para enviar el mensaje de estado. Y esto no le sienta especialmente bien al sistema. Cierra el proceso en segundo plano que actúa de receptor de mensajes, y ya no es posible seguir controlando la Raspberry por WhatsApp.
La solución es simple: convertir el script de bash a una función python para yowsup que cumpla la misma función, y que use las funciones del mismo para realizar el envío. Pero esto ya quedará para otro día.
Etiquetas: bash, python, raspberry pi, relés, whatsapp, yowsup