sábado, 6 de febrero de 2016

Controlar remotamente Raspberry Pi vía web

En ésta nueva entrada voy a exponer mi manera de para poder controlar los puertos GPIO de la Raspberry Pi de manera remota, utilizando Lighttpd y php como servidor web, navegadores web y smartphone android como clientes.
Actualmente cuento con 1 placa Raspberry Pi rev2.0 y 1 placa Raspberry Pi 2 con la que realizo mis pruebas caseras, lo he realizado en ambos hardwares sin problemas ni cambios relevantes.
El presente repaso lo realizaré en la raspberry Pi 1 rev2.0

Vamos a instalar el servidor lighttpd por ser muy ligero en comparación con apache2. Usaremos php para programar la página web a la que se tendrá acceso vía web y vía aplicativo android. Usaremos scripts en python y bash muy básicos para poder controlar los puertos GPIO de la raspberry.
Desde php llamaremos a los scripts para que interactúe con el usuario.
La práctica consiste en prender, apagar y parpadear un led desde python y/o bash conectado al pin 11 del conector P1. El ánodo será conectado a una resistencia de 4.7k a voltaje para limitar la corriente y el cátodo al pin 11.

Empecemos:

pi@raspberry~$ sudo aptitude install lighttpd php-config php-pear php-xml-parser php5-cgi php5-cli php5-common
No voy a explicar la configuración de php con lighttpd ya que hay abundante información de ello en la web.
Recomiendo la lectura del siguiente blog propiedad de que a mi parecer está muy bien explicados los pasos básicos para poner en marcha lighttpd y php:
http://blog.desdelinux.net/lighttpd-un-servidor-web-muy-agil-y-liviano/

Ahora vamos a /var/www y dentro crearé la carpeta led. Dentro de la carpeta led crearemos el index.php que contendrá el código en php.
pi@raspberry /var/www/led~$ sudo vim index.php


<html>
<head>
<!--index.php-->
</head>
<body>
<!--GPIO17-->
<form action="" method="post">
Control de Led en el puerto 17

&nbsp;<input type="submit" name="prenderLED" value="Prender">
<input type="submit" name="apagarLED" value="Apagar">
<input type="submit" name="parpadearLED" value="Parpadear">
</body>
</html>
<?php
// Funciones PHP del pin GPIO 17
if ($_POST[prenderLED]) {
exec("sudo python /var/www/led/gpio/prenderLED.py");
}
if ($_POST[apagarLED]) {
exec("sudo python /var/www/led/gpio/apagarLED.py");
}
if ($_POST[parpadearLED]) {
exec("sudo python /var/www/led/gpio/parpadearLED.py");
}
// Fin Funciones PHP del pin GPIO 17
?>

Debería quedar así:

Control de Led en el puerto 17
Raspberry Pi rev2.0
 

Luego dentro de la carpeta led, crearé la carpeta gpio; aquí alojaré los scripts en python y bash que serán llamados por el index.php.
Usaremos el pin gpio 17, ya que es el número 0 en la tabla de comparación con WiringPi.

pi@raspberry /var/www/led/~$ mkdir gpio
pi@raspberry /var/www/led/gpio~$ nano prendeLED.py
#!/usr/bin/env/ python
## enciende.py
#Importamos la libreria y le cambiamos el nombre a GPIO
import RPi.GPIO as GPIO
#Establecemos el sistema de numeracion que queramos, 
#en este caso el sistema BCM
GPIO.setmode(GPIO.BCM)
#Configuramos el pin GPIO 17 como una salida
GPIO.setup(17, GPIO.OUT)
#Encendemos el led
GPIO.output(17, GPIO.HIGH)
GPIO.cleanup(); Liberamos el GPIO 17

pi@raspberry /var/www/led/gpio~$ nano apagaLED.py
#!/usr/bin/env/ python
## apaga.py
#Importamos la libreria y le cambiamos el nombre a GPIO
import RPi.GPIO as GPIO
#Establecemos el sistema de numeracion que queramos, 
#en este caso el sistema BCM
GPIO.setmode(GPIO.BCM)
#Configuramos el pin GPIO 17 como una salida
GPIO.setwarnings(False)
GPIO.setup(17, GPIO.OUT)
#Apagamos el led
GPIO.output(17, GPIO.LOW)
#Y liberamos el GPIO 17
GPIO.cleanup()

pi@raspberry /var/www/led/gpio~$ nano parpadearLED.py
#!/usr/bin/env/ python
import RPi.GPIO as GPIO
import time
#Establecemos el sistema de numeracion que queramos, 
#en este caso el sistema BCM
GPIO.setmode(GPIO.BCM)
#Configuramos el pin GPIO 17 como una salida
GPIO.setup(17, GPIO.OUT)
#Encendemos y apagamos el led 5 veces
for i in range(0,5):
 GPIO.output(17, GPIO.HIGH)
 time.sleep(1)
 GPIO.output(17, GPIO.LOW)
 time.sleep(1)
#Y liberamos el GPIO 17
GPIO.cleanup()

Ahora creamos los scripts en bash si es que no queremos hacerlo en python.

pi@raspberry /var/www/led/gpio~$ nano prenderLED.sh
#!/bin/bash
echo 17 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio17/direction
echo 0 > /sys/class/gpio/gpio17/value
#Liberamos el PIN asociado
echo 17 > /sys/class/gpio/unexport

pi@raspberry /var/www/led/gpio~$ nano apagarLED.sh
#!/bin/bash
echo 17 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio17/direction
echo 1 > /sys/class/gpio/gpio17/value
echo 17 > /sys/class/gpio/unexport

pi@raspberry /var/www/led/gpio~$ nano parpadearLED.sh
#!/bin/bash
echo 17 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio17/direction
for i in $(seq 1 5)
 do
   echo 1 > /sys/class/gpio/gpio17/value
   sleep 1
   echo 0 > /sys/class/gpio/gpio17/value
   sleep 1
 done
echo 17 > /sys/class/gpio/unexport

Ahora estoy trabajando en crear un apk que pueda controlarlo vía android. Existe una página llamada AppInventor para poder crear nuestro código online y así no tener que instalar el pesado Android Studio.
Cuando culmine, incluiré el código.
Por lo pronto hasta aquí.
Saludos;
JPC