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:

11 comentarios:

Anónimo dijo...

Buenas tardes Edu,
la idea de la webcam controlada por el linksys me parece interesante pero no termino de ver cómo conectarla al conjunto. Intuyo que la cámara la conectas directamente al PC, por lo que éste deberá estar siempre encendido. Igual estoy diciendo una burrada, pero ¿ Tienes idea de cómo se podría hacer para conectar la Webcam al router sin encender el pc ? Vamos, lo que sería transformar una webcam normal en IP. No se si se podría usar un arduino para de algún modo pasar el vídeo por el puerto serie o eso ya sería pedir demasiado. En cualquier caso gracias de antemano por tu ayuda.

kayak dijo...

Muy buenas,

la verdad que lo que dices no es ninguna burrada, es decir, ójala pudiéramos conectar directamente la webcam al router. De hecho busqué bastante para a ver si había algún soporte para este router, pero no hubo suerte. Algo hay escrito para los modelos que llevan incorporado un puerto usb, pero para la entrada serie sería complejo realizar la lectura de la webcam. No obstante, si hubiera suerte, tranquilo que ya subiría la solución.

Un saludo.

Anónimo dijo...

Hola. ¿Quieres vender tu "kayak" cuenta de Twitter? Me gustaría que el comercio un billete de avión para él. Mi correo electrónico es lbaldwinh@yahoo.com. Gracias

Anónimo dijo...

Hola, que tal!!
Bueno me parece muy interesante lo que pones, y sobre todo que esta en español.
La verdad es que estoy un poco confundido, mira yo quiero realizar un proyeto como el que explicas, entonces lo que deseo hacer es que mediante una camara web (/IP) este conectada a una plataforma arduino y que esta se pueda ver, pues via remota (internet), en otro lado del mundo se puede decir, esto puede ser en conjunto con un Lantronix.
y pues en realidad como no se mucho y apenas estoy empezando, quisiera ver si tu me puedes orientar sobre esto, ya que veo que conoces el tema, y en realidad no se si se pueda o es demasiado laborioso..

Mi correo es aravii@live.com.mx

Agradecería una respuesta.

Juan Antonio Breña Moral dijo...

Buen proyecto!

puedes explicar con mas detalle, los comandos que ejecutas:

echo Xi0002 > /dev/cua/1

Gracias

faio dijo...

ojala les sea esto util http://www.jbprojects.net/projects/wifirobot/
El robot no va para nada conectado al ordenador

Edu dijo...

Muchas gracias faio por tu aporte. Alguna vez vi el vídeo, pero no había visto la página. Está muy detallado todo el montaje, espectacular.
Siempre he tenido en mente ponerme a hacer uno de estos, incluso me puse manos a la obra, pero por falta de tiempo no pude seguir con ello, como tantas otras cosas que tengo en mente.

Espero poder pegarlo por aquí algún día.

En cualquier caso, de nuevo, gracias.

Feliz año a todos, sea dicho de paso.

Serch dijo...

Muy bueno todo esto, sobretodo para los que estamos empezando...

Gracias por compartir

Jordi Gauchía dijo...

Hola Edu!

Fantástico trabajo!

Yo también ando liado con Arduino y esas cosas.... mi idea (partiendo de mi hobby) es un control de carrera para SCALEXTRIC (de momento todo está operativo) con una interfaz WEB y demás.....
Veo que dominas bastante el WRT45GL... mi idea es conseguir uno para trastear un poco la comunicación Arduino - WRT45GL....
Me gustaría, cuando consiga uno, que me orientaras un poco....

Muchas Gracias

Manuel Antonio dijo...

Hola! alguien me puede ayudar?
lo que pasa es que ya instalé el mod SD, pero ahora kiero Montar la particion en SD

supongo que los comandos qu aki aparecen se ejecutan en Administracion>>Diagnostico>>Command Shell

Ahi he puesto linea por linea hasta llegar a esta linea

./optware-install-ddwrt.sh

aquí me lanza el error sh: eval: line 1: ./optware-install-ddwrt.sh: not found


Alguna idea?

evil dijo...

HOla que tal! en mi ultimomensaje exponia que no podia instalar, pero este problema fue por que el enlace de la descarga del instalador estaba algo muerto jeje, en fin El motivo de este nuevo post es saber si alguien sabe como instalar Mysql, lo que pasa es que deseo guardar los datos de algun sensor en bases de datos.

Por su atencion y ayuda, Gracias!