En la última entrada comenté como llevar a cabo la conexión entre el Raspberry Pi y Arduino. Una vez completada la conexión entre ambos dispositivos a través de USB, en esta entrada vamos a ver como podemos acceder a nuestro Arduino a través de una página web alojada en nuestro Raspberry Pi.

Para comenzar lo primero que tenemos que hacer es instalar un servidor web en nuestro Raspberry Pi. En mi caso he instalado lightttpd, para ellos simplemente ejecutamos el siguiente comando:

sudo apt-get -y install lighttpd

Una vez instalado el servidor web, este se iniciará y accediendo a la ip de nuestro Raspberry, obtendremos una web como la siguiente:

lightttpd

Ahora vamos a ver como podemos hacer que nuestro servidor web pueda ejecutar archivos python. Para ello tenemos que habilitar el soporte Cgi-bin en nuestro servidor web. Para ello, tenemos que editar el siguiente archivo: /etc/lighttpd/lighttpd.conf. Dentro del mismo añadimos las líneas resaltadas (El resto del archivo en tu caso puede ser diferente):

server.modules = (
        "mod_access",
        "mod_alias",
        "mod_compress",
        "mod_cgi",
        "mod_redirect",
#       "mod_rewrite",
)

server.document-root        = "/var/www"
server.upload-dirs          = ( "/var/cache/lighttpd/uploads" )
server.errorlog             = "/var/log/lighttpd/error.log"
server.pid-file             = "/var/run/lighttpd.pid"
server.username             = "www-data"
server.groupname            = "www-data"
server.port                 = 8080

$HTTP["url"] =~ "/cgi-bin/" {
      cgi.assign = ( ".py" = "/usr/bin/python" )
}

index-file.names            = ( "index.php", "index.html", "index.lighttpd.html" )
url.access-deny             = ( "~", ".inc" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )

compress.cache-dir          = "/var/cache/lighttpd/compress/"
compress.filetype           = ( "application/javascript", "text/css", "text/html", "text/plain" )

# default listening port for IPv6 falls back to the IPv4 port
include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port
include_shell "/usr/share/lighttpd/create-mime.assign.pl"
include_shell "/usr/share/lighttpd/include-conf-enabled.pl"

Básicamente lo que hacemos es añadir el modulo de cgi (línea 5) y luego indicamos en que carpeta están disponibles los scripts del sistema que se pueden ejecutar desde la red. En mi caso es una carpeta que se llama cgi-bin dentro de la carpeta donde van alojados los archivos html (por defecto /var/www/).

Llegados a este punto ya tienes todo configurado para empezar a controlar tu Arduino a través de internet. Solo tenemos que crearnos una página web y los correspondientes scripts en python.

En el Arduino he cargado un programa muy similar al que usé en el ejemplo anterior, con la diferencia que de cada vez que se escribe en un puerto, se devuelve una cadena codificada de unos y ceros con el estado resultante de los puertos después de haber cambiado el estado. Este es el enlace al archivo.

El script en python que controla todo el sistema es el siguiente:

import cgi
import serial
import time

arguments = cgi.FieldStorage()
ser=serial.Serial('/dev/ttyACM0',9600)
if 'status' in arguments:
	ser.write('sts')
	print(ser.readline())
else:

	ser.write(arguments['port'].value)
	ser.write(arguments['value'].value)
	ser.write('sts')
	print(ser.readline())

El script es bastante sencillo, simplemente con la librería CGI leemos los diferentes parámetros de la URL y los enviamos vía USB (puerto serie) al arduino. Si el comando es status, simplemente pedimos al arduino que nos informe sobre el estado actual de los puertos sin llevar a cabo ningún cambio.

Finalmente solo tenemos que crearnos una web donde mostrar toda la información y poder actuar sobre los puertos. En mi caso me he creado la siguiente web:

ArduinoWeb

El fuente de esta página se muestra a continuación:





	
	

Port Control

Port Status

Port 13 Port 12 Port 11 Port 10 Port 09

El código de la página es bastante simple, simplemente por medio de jQuery, hacemos una llamada AJAX al script python alojado dentro de la carpeta cgi-bin indicándole los parámetros que queremos cambiar. Una vez obtenemos la respuesta simplemente actualizamos los colores de los diferentes divs gracias a jQuery utilizando la información proporcionada en la respuesta del script python. De esta forma tenemos una realimentación real del estado del puerto de nuestro Arduino una vez hemos cambiado los valores.

Antes de terminar la entrada simplemente comentar algunos problemas con los que me he encontrado:

1) Cuando ya tenía el script python hecho, al ejecutar el script desde la consola del raspberry funcionaba todo correctamente pero al intentar ejecutarlo desde la web, se ejecutaba pero no cambiaba el estado del puerto. Esto se debe porque el script ejecutado desde cgi-bin no tiene permiso de escritura sobre el dispositivo serie del arduino. La solución más rápida y chapucera fue simplemente darle permisos de escritura/lectura y ejecución a todo el mundo sobre el dispositivo serie por medio del siguiente comando:

sudo chmod 777 /dev/ttyACM0

2) Cuando ya podía escribir sobre el puerto serie desde la web, el otro problema que me apareció fue que cada vez que escribía en el puerto serie, se reiniciaba el arduino. Para solucionar esto siguiendo este hilo. Simplemente tuve que añadir un condensador (en mi caso lo que tenía a mano 47uF) entre el pin reset del arduino y GND. De esta forma se evita que se reinicie el arduino cada vez que se ejecuta el script CGI-BIN.

con esto ya tenemos a nuestro Arduino accesible desde internet por medio de una web de control alojada en nuestro Raspberry PI abriendo una nueva puerta al control de nuestros dispositivos domóticos o aplicaciones de control a través de internet.