Búsqueda personalizada

02 noviembre 2008

Control Webcam 2.0

Documentación vigente en: http://eduardomarin.es/blog/entry/control-webcam-2-0

Hace algo más de un año que escribí este post donde explicaba cómo realizar el control de una cámara web instalada sobre dos servomotores.

Aquella implementación la realicé haciendo uso del router Linksys wrt54g, pero a través del sistema operativo que nos ofrecía openwrt.

Ahora, y tras algunas cuestiones que se le planteaban a Fernando, volví a retomar aquél proyecto y le apliqué las técnicas que nos ofrece AJAX, para mejorar el interfaz gráfico, además de cambiar el sistema embebido a dd-wrt.

De hecho, dd-wrt vino mucho antes, justo cuando quise usar el router como repetidor.

Entonces..., ¿qué ha cambiado. Qué ha mejorado?

Primeros pasos:

El primer paso, siempre que tengamos instalado dd-wrt (en mi caso v24-RC7), será instalar un servidor con soporte para PHP.

Nuestro router viene con un servicio servidor httpd que es el que nos muestra el contenido de las páginas de administración del mismo. No obstante, la configuración para soportar PHP puede ser algo compleja si lo comparamos con "thttpd".

Pero antes que todo esto, debemos pensar que nuestro router viene limitado en cuanto a memoria física. Si sóis de los que ya realizásteis el mod para añadir una tarjeta SD/mmc, o no tenéis miedo en realizarlo, entonces no habrá ningún problema.

Una vez instalada nuestra tarjeta SD, bajo la ventana de administración dd-wrt del router nos mostrará el espacio de tarjeta total y disponible:

Esto nos permitirá montar una partición dentro de la tarjeta que apunte a /jffs. Gracias a este nuevo directorio (y que en nuestro router es sólo de acceso a lectura), podremos instalar nuevos paquetes sin problemas. Y, hablando de instalar paquetes sin problemas, otro de los módulos que debemos instalar es optwrt, al estilo "ipkg", "ipkg-opt" nos permite buscar e instalar paquetes desde los repositorios de optwrt.

Manos a la obra (paso por paso):

1. Montamos nuestra nueva partición en la tarjeta SD:


mkdir /mmc/jffs
mount --bind /mmc/jffs /jffs


2. Instalamos optwrt:

mkdir /jffs/opt
mount -o bind /jffs/opt /opt
mkdir /jffs/tmp
cd /jffs/tmp
wget http://www.wlan-sat.com/boleo/optware/optware-install-ddwrt.sh
./optware-install-ddwrt.sh

Una vez tenemos instalado optware, bajo /opt/bin podremos encontrar "ipkg-opt", el instalador de paquetes de optware.

Así pues, como nuestro objetivo era montar el servidor http + php, instalaremos, por un lado php5 y por otro thttpd, que soporta php5.

Para ello:

cd /opt/bin
./ipkg-opt install php
./ipkg-opt install php-thttpd

Tendremos instalado nuestro servidor con soporte a php, pero debemos configurar el servidor indicando dónde queremos alojar nuestros archivos web.

En mi caso, los alojaré en /mmc/cgi-bin. Para ello, creamos la carpeta y configuramos el servidor:

mkdir /mmc/cgi-bin
vi /opt/etc/init.d/thttpd.conf

Este archivo de configuración del servidor contiene las siguientes líneas (en mi caso, donde el servidor escucha por el puerto 8080, manteniendo el puerto 80 para la ventana de administración del router)

dir=/mmc/cgi-bin
port=8080
user=root
nochroot
nosymlink
novhost
logfile=/opt/var/log/thttpd.log
# Please do not edit pidfile path at it is use to kill thttpd process during ini
pidfile=/opt/var/run/thttpd.pid

Finalmente, tan sólo queda poner en marcha el servidor. Pero debemos recordar una cosa, antes que el servidor "thttpd" estaba trabajando el servidor "httpd", y este entrará en conflicto si deseamos poner a escuchar el nuevo en el puerto 80. Este es un caso similar al mío. Yo tengo tres servidores. El primero (externo al router, y principal), escucha por el puerto 80. El servidor interno del router httpd (y que ofrece el servicio para la administración del router), quiero que escuche por el puerto 81 y, finalmente, el nuevo, "thttpd" con soporte a PHP, escuchará por el 8080. Así pues, debo matar al viejo, asignarle un nuevo puerto de escucha y arrancar, finalmente al nuevo:

killall httpd
cd /www
httpd -p 81 -h /www

cd /opt/etc/init.d/
./S80thttpd start

Cuando todo esto os funcione, algo muy importante, y que hará que no tengáis que iniciar manualmente los servicios ni la asignación de particiones a jffs y a opt, es añadir las siguientes líneas (a través de la ventana de administración del router (Administración -> Diagnóstico)), y grabar el arranque:

killall httpd
cd /www
httpd -p 81 -h /www

mount --bind /mmc/jffs /jffs
mount -o bind /jffs/opt /opt

cd /opt/etc/init.d/
./S80thttpd restart

Quedando esta ventana de la siguiente forma:


Probaremos entonces que nuestro servidor funciona correctamente, accediendo a través de la dirección del router IPdelrouter:8080. Debería salir una ventana como la siguiente:



Si ahora creamos un archivo (recordemos que nuestro directorio del servidor lo habíamos indicado en el archivo de configuración /opt/etc/thttpd.conf) para probar el funcionamiento PHP, por ejemplo, test.php, con el siguiente contenido:


<?php

$instr = "date";

$salida = exec($instr);

echo "Hoy es $salida";

?>



No debemos olvidar cambiar los permisos al archivo

chmod 744 test.php


Y ahora, con la webcam:

La idea del manejo de la webcam es exáctamente el mismo que en la versión anterior. Se hace uso del puerto serie que instalamos al router, se utiliza la misma codificación en arduino, pero lo único que estamos cambiando es la llamada a las funciones que envían el mensaje por el puerto serie. En la otra versión utilizábamos shell script. Ahora hacemos uso de PHP. La ventaja es que podemos utilizar las funciones de scriptaculous o prototype para añadir un toque AJAX, y así evitar los feos cortes que se veían en la página anterior.

Adjunto aquí el código de la página web (html, php, js) y aquí el código en arduino.

Cómo ha cambiado la versión (vídeos):

Versión 1.0:



Versión 2.0: