24 sept 2013

Abre tu garaje desde Android o iPhone con Raspberry Pi (Parte I)

Tras ver algunos artículos en el blog relacionados con la Raspberry Pi, por fin me he animado a mostraros un proyecto con el que estuve entreteniéndome este verano.Casi todo el mundo, utiliza la Rasberry Pi como servidor de pruebas y como mucho para desarrollo de software que no necesite demasiados recursos. Pero si pensamos más detenidamente, lo que tenemos entre manos es muchísimo más que eso. En este caso, voy a mostraros como utilizar la interfaz GPIO (General Purpose In Out) para controlar unos relés que activan, en mi caso, la centralita de la puerta del garaje, y una luz temporizada. Y diréis, WOW! Pero claro... y si, ya que aquí se han publicado diversos tutoriales sobre Android... ¿utilizamos la Raspberry como un servidor, y nos diseñamos una aplicación para activar los relés desde nuestro Smartphone? Eso suena mejor aún. Pues sin más dilación, vamos a ponernos manos al teclado, usuario y pass al ssh, y veamos el potencial de este minipc a nivel de desarrollo electrónico. Arduino? Bah! Para que quiero un Arduino si puedo programar en Python!
Vamos a dividir el desarrollo del proyecto en 3 partes. Primero, la implementación de software en la Raspberry. Segundo, el desarrollo electrónico en una protoboard, y por último, el desarrollo de las aplicaciones para Android e iOS.
Lo primero que necesitamos es Raspbian instalado en nuestra Rpi, si no sabéis cómo, podéis mirar un tuto en la web oficial o directamente aquí en español.
En el primer inicio, el sistema arrancará un asistente raspi-config para configuración rápida. Recomiendo seleccionar el layout del teclado, cambiar el pass, poner el mínimo de memoria gráfica y desactivar el arranque de X server, pues no vamos a utilizar la interfaz gráfica en ningún momento (señores, somos hackers, we love shell). Además acordaos de activar el ssh por comodidad para la gestión remota, ya que una vez esté ubicado, es un tostón desconectar todo para tocar cualquier cosa. Dicho esto, y sabiendo que raspbian ya tiene python instalado. Es hora de instalar la librería que vamos a utilizar para controlar los GPIO. Por defecto, viene instalada RPi.GPIO pero en este caso, vamos a utilizar otra librería, RPIO, que tiene principalmente dos funciones añadidas interesantes. Una que espera interrupciones TCP, y otra que ejecuta una función cuando se producen. Procedemos a la instalación:
sudo apt-get install python-setuptoolssudo easy_install -U RPIO
Una vez instalado, estáis listos para ejecutar y jugar con el código del server. Lo dejo íntegro aquí:
#importo la libreria de RPIO con interruciones TCP y evidentemente la socket
import RPIO
import socket
#importo time para poner un delay
import time
print("Arrancando servidor de puerta de garaje")
#reseteando puertos y configurando pin 07 como output
print("Configurando GPIO07 como pin de salida a bajo nivel 0V")
print("Configurando GPIO08 como pin de salida a bajo nivel 0V")
RPIO.setwarnings(False)
RPIO.setup(7, RPIO.OUT, initial=RPIO.LOW)
RPIO.setup(8, RPIO.OUT, initial=RPIO.LOW)

def socket_callback(socket, val):
    clientip=socket.getpeername()
    print("Orden recibida: '%s' desde IP: %s" %(val,clientip))
    socket.send("Abriendo puerta del garaje...\n")
    RPIO.output(7, True)
    print("Pin 7 a nivel alto 3.3V")
    time.sleep(0.5)
    RPIO.output(7, False)
    print("Pin 7 reestablecido 0V")
    RPIO.output(8, True)
    print("Pin 8 a nivel alto 3.3V")
    time.sleep(0.5)
    RPIO.output(8, False)
    print("Pin 8 reestablecido 0V")

# Llamada de la interrupcion THREADED
RPIO.add_tcp_callback(1993, socket_callback, threaded_callback=True)

#Bucle sin fin esperando interrupciones
RPIO.wait_for_interrupts()
Toda la documentación relativa a las funciones utilizadas de la librería RPIO están en su web oficial, donde lo explican con ejemplos y demás. Os lo dejo aquí, pero de todas formas, está comentado, así que supongo que no deberíais tener problema para entender el código, que es bastante simple.
Como supongo que estaréis deseando ver todo esto funcionando, que la curiosidad os estará matando por dentro como a mi cada vez que veo algún tutorial DIY (Do it yourself), que os pasaréis las noches sin dormir, he preparado un pequeño cliente en python para que podáis probar que el servidor funciona, y para que podáis toquetear y mejorar el servidor a vuestro antojo, que es lo que realmente importa al final. El cliente se conecta a localhost, así que tenéis que ejecutarlo en la misma Raspberry, simplemente abriendo otra sesión por ssh, o ejecutando el servidor en segundo plano.
from socket import *
HOST='localhost'
PORT=1993
ADDR=(HOST,PORT)
BUFSIZE=4096
cli=socket(AF_INET,SOCK_STREAM)
cli.connect((ADDR))

def receive_data():
    data=cli.recv(BUFSIZE)
    print ("%s" % (data))

while 1:
    incode=raw_input("Mensaje a enviar (Abrir) o (Salir): ")
    if incode == "Abrir":
        print ("Enviado: %s"%(incode))
        cli.send(incode)
        receive_data()
    elif incode == "Salir":
        cli.close()
        break    
    else:
        print "Elija una opcion correcta"
Nos vemos en el siguiente post, donde veremos el montaje electrónico, bastante sencillo. Mientras tanto, en el código del server, podéis ver los pines de GPIO utilizados, así que si tenéis una protoboard y un par de leds a mano, podéis conectarlos sin problema para probar.

7 comentarios:

  1. Gracias por enlazar a mi blog OpenWebCMS, te lo agradezco. Buen articulo.

    ResponderEliminar
  2. [...] Tras ver algunos artículos en el blog relacionados con la Raspberry Pi, por fin me he animado a mostraros un proyecto con el que estuve entreteniéndome este verano. Casi todo el mundo, utiliza la Rasberry Pi como servidor de pruebas y como mucho para desarrollo de software que no necesite demasiados recursos. Pero si pensamos más detenidamente, lo que tenemos entre manos es muchísimo más que eso.  [...]

    ResponderEliminar
  3. disculpa cuando subiras el resto me interesa mucho el proyecto gracias

    ResponderEliminar
  4. [...] El martes arrancamos la cadena sobre Raspberry de la mano de Nicomda: Abre tu garaje desde Android o iPhone con Raspberry Pi (Parte I) [...]

    ResponderEliminar
  5. Hola estoy interesadisimo en tu proyecto. Cuando vas a poner el resto? Me interesa la parte hardware. Por cierto para subir la cochera q te has hecho una aplicación android o desde una pagina web?. Yo envío comandos desde mensajes de hangout. Puedes avisarme o decirme algo a plcabgut arroba gmail punto com. Un saludo.

    ResponderEliminar
  6. Me da la impresión que no es mas que un fake. Por la información que he encontrado por internet mediante siri emplean una seguridad mediante licencia, cosa que en android no está, por lo que han puesto algo de python para que nos quedemos contentos por el momento y dejarnos con las ganas. Espero equivocarme porque me ha hecho ilusión y me gustaría poder hacerlo, pero es la impresión que me ha dado. :(

    ResponderEliminar