Comunicación con Arduino a través de un servidor PHP
Vamos a explicar un apartado que por lo que se ve da muchos problemas de cabeza, como es la solución que hemos adoptado en el sistema functiodomo para comunicarnos con las placas Arduino a mediante órdenes escritas en PHP.
Antes de nada hay que explicar que como ya hemos indicado en algún artículo anterior, la transmisión de los datos en nuestro sistema la realizamos sobre una red Zigbee. Es muy importante saber que esta red es de tipo mallado, estos es, todos los datos que se transmiten por esa red pasan por TODOS los nodos de la misma. La comunicación entre cualquier nodo y el router se hace enviando el paquete de datos desde el router al nodo más cercano, transmitiéndolo éste a todos los nodos de su alrededor, y volviendo a repetir cada uno de estos nuevos nodos la misma operación, así hasta llegar al nodo destino.
Otros tipos de redes con topología infraestructura, como pueden ser las redes WIFI necesitan que cada uno de los nodos tenga "línea directa" con el router principal.
Para una mejor explicación de estos tipos de red recomiendo la lectura del siguiente enlace:
http://es.wikipedia.org/wiki/Red_inalámbrica_mallada
Ésta diferencia en el método de realizar la comunicación conlleva las siguiente consecuencias:
En las redes con topología infraestructura necesitamos en el paquete de datos a transmitir 2 elementos: los datos a transmitir propiamente (la instrucción) y los datos del nodo al que se lo vamos a transmitir (la dirección de red).
En las redes malladas (además de la metodología anterior) como todos los paquetes llegan a todos los nodos, podemos transmitir paquetes SÓLO con los datos (la instrucción), pues dentro de la red seguro que van a llegar al nodo que nos interese.
La selección del nodo que recibe los datos la podemos programar en nuestra placa Arduino, siendo la placa Arduino la que determine si la orden enviada le afecta a ella como nodo o corresponde a otra.
Este comportamiento es equivalente a tener una comunicación a través serie con el ordenador, pero teniendo todas las placas Arduino (nodos) conectadas en "paralelo".
Lamento haber sido tan extenso en esta introducción, pero son importantes entender los conceptos anteriores para poder explicar cómo realizamos la comunicación mediante ordenes escritas en PHP.
Ahora viene el código que utilizamos en el lado del servidor (recuerdo servidor LAMP, ésto Linux; en teoría debe funcionar igual sobre Windows, pero sinceramente no lo hemos probado):
Detalles importantes:
El puerto serie tiene que tener los permisos de usuario habilitados para que el servidor Apache pueda utilizarlo. Yo utilizo en la instrucción en la línea de comandos: $ chmod 666 /dev/ttyUSB0
Simplemente, conectando la placa Arduino en el puerto USB del ordenador, con el programa anterior ya recibe a través del puerto serie la instrucción "aM".
Si desconectamos el cable USB y lo volvemos a conectar, puede ser que nos cambie el puerto USB a través del que se comunica Arduino (que pase del USB0 al USB1). Esto se puede comprobar en el entorno de programación de Arduino.
Para la comunicación inalámbrica, en el puerto serie conectamos el router Zigbee que es tan sencillo como una placa Arduino sin el chip ATMEGA328 con el Xbee shield y su correspondiente chip Zigbee programado como router.
En el caso de las órdenes anteriores, el código necesario en Arduino para leer la orden y realizar una acción es tan sencillo como sigue:
Con esta metodología hay que hacer notar que las placas Arduino deben estar siempre activas, pues son ellas las que hacen las selección del nodo a ejecutar las ordenes, pero en el caso de la domótica, aunque energéticamente sea menos eficiente, no es un problema mayor pues las placas no están alimentadas por batería.
El código escrito en Aduino es transparente al medio a través del cual se transmite la señal (aire, cable), siempre y cuando esta pueda llegar a través del puerto serie.
Por último comentar que como supongo que algunas cosas no estarán suficientemente bien explicadas, añado las páginas web de donde obtuvimos toda la información para comunicar las placas:
Control de Arduino utilizando PHP:
http://www.arduinoprojects.com/?q=node/10
http://www.mydarkmaterials.co.uk/2008/11/30/interfacing-php-with-the-arduino/
Configuración de Zigbee:
http://ladyada.net/make/xbee/arduino.html
Software de configuración de los chips Xbee:
http://www.digi.com/support/productdetail?pid=3352&osvid=0&type=utilities
Algunos ejemplos más que he encontrado sobre conexión de PHP y Arduino:
http://mcielectronics.com/blog/?p=495
http://blog.bsoares.com.br/php/controlling-arduino-with-php
Autor:
Cesar Martin