PHP + Arduino en Windows

Contenidos

Arduino y el Internet de las Cosas

Cada vez esta siendo más fuerte la unión de dispositivos electrónicos especialmente Arduino con un control Web, existen diversas formas de trabajar desde el lado del servidor (PHP, Python, Node, ASP…) en este tutorial realizaremos una conexión con PHP.

El Ideal

Si disponemos de un dispositivo que accederan a él muchos clientes el ideal es trabajar con una base de datos, si alguien escribe un dato (por ejemplo la temperatura de una sala) posteriormente SOLO un PHP (o otro script de cualquier lenguaje) ataca a la base de datos y actúa a través del puerto serie con el Arduino. Pero en este caso como ejemplo lo haremos sin base de datos. De igual forma si deseamos leer una temperatura, el ideal sería que un script leyera el dato analógico y lo guardara en la base de datos incluso se hiciera un histórico por fecha y hora y los usuarios accedan a dicha base de datos y los lean. Quizás si no eres programador esto te resulte un tanto complicado pero me parecía obligado comentarlo.

Nuestro proyecto

Existen librerías de control del puerto serie para PHP, el problema es que en muchos ordenadores no funcionan correctamente lo mejor es crear nuestra propia librería, por otro existe mucha documentación para este tipo de control en Linux por lo que este ejemplo sera para servidores WAMP en Windows.

El Servidor WAMP

Un servidor WAMP consiste en una serie de programas preparados y listos para funcionar, por un lado contiene un server Apache que es un servidor para html, cuando te conectas a cualquier web pidiendo una página concreta un server como el Apache o el similar devuelve lo que estas solicitando, un interprete de PHP, que es la herramienta que interpreta el codigo PHP que vamos a generar y una base de datos MySQL que como su propio nombre indica sirve para almacenar datos de una forma ordenada.

Sobre PHP

PHP es un lenguaje orientado a programación web del lado del servidor, que quiere decir, el PHP genera un HTML, por ejemplo cuando en un blog buscamos una entrada o en una tienda on-line un producto PHP se encarga de leer esas peticiones y genera un HTML acorde a lo pedido, entre otras funciones accede a la base de datos, por ejemplo un registro PHP lee tu nombre y tu contraseña comprueba que son correctas y genera un HTML con la página a la que accedes (por ejemplo tu email) o otra en la cual detecta un error de logeo.

Puerto serie en PHP

Configuración del puerto serie.

El puerto serie o COM (en Windows) lo podemos vamos a tratar de dos formas, la primera es usando shell_exec() esta función de PHP ejecuta un comando, es creamos un programa como el siguiente:

1
2
3
<?php
shell_exec(dir)
?>;

Es como si entráramos en la linea de comandos de Windows «cmd» y tecleáramos dir, nos muestra los directorios y archivos del lugar donde se encuentra el PHP en cuestión. Aquí comienza nuestro programa configurando el puerto con el siguiente comando:

1
"mode com4: BAUD=9600 PARITY=n DATA=8 STOP=1 to=off dtr=off rts=off"

Podemos cambiar las configuraciones del propio puerto pero son las que vienen por defecto en Arduino así que serán funcionales.

Actuando sobre el propio puerto

Por otro lado el puerto serie para PHP puede ser considerado un archivo y podemos leerlo como se lee un txt. Antes de continuar comentar que vamos crear dos archivos PHP uno será de escritura y otro de lectura, imaginemos un sistema de control LEDs de iluminación regulables, un PHP le ordenará al Arduino a que intensidad funcionará cada LED, mientras que otro leerá los estados (por ejemplo para mostrarlos en una web) o los consumos.

PHP de escritura del puerto

Usando $fp =fopen(«comN», «w») abriremos el «archivo» como comentábamos se trata el puerto como un txt. siendo la N el número de puerto (a veces al conectar y desconectar el Arduino cambia) y la w que solo es de escritura (una w+ es lectura y escritura).

La siguiente función envía el stirng por el serial y es fwrite($fp, str), siendo srt el string a enviar y por último cerramos el puerto aunque PHP lo hace automaticamente, fclose($fp).

Comentar que si tenemos un error al abrir $fopen nos dará un error que aprovecharemos para avisar en la web, por lo que el programa final quedará:

1
2
3
4
5
6
7
8
9
10
11
shell_exec("mode com4: BAUD=9600 PARITY=n DATA=8 STOP=1 to=off dtr=off rts=off");
//echo $consola;
$fp =fopen("com4", "w");
if (!$fp) {
$status = "No conectado";
echo $status;
} else {
$status = "Conectado";
echo $status;
fwrite($fp, "Hola Arduino");
}
PHP de lectura del puerto

Igualmente debemos configurar y abrir el puerto, comprobar que hay acceso y en este caso usaremos fwrite($fp,int) que nos devolverá un string de la lectura del serial, con una distancia de int bytes, es decir, leerá hasta llegar a int y parará.

1
2
3
4
5
6
7
8
9
10
11
shell_exec("mode com4: BAUD=9600 PARITY=n DATA=8 STOP=1 to=off dtr=off rts=off");
//echo $consola;
$fp =fopen("com4", "w");
if (!$fp) {
$status = "No conectado";
echo $status;
} else {
$status = "Conectado";
echo $status;
fread($fp, int");
}

 

Si necesitas un desarrollador back-end o front-end y además te haga proyectos electrónicos, puedes contactar conmigo.

Aquirir Arduino

Si deseas adquirir un Arduino para este u otros proyectos click aquí o en la imagen.

Arduino Genuino UNO
Arduino Genuino

Summary
Arduino y PHP
Article Name
Arduino y PHP
Description
Comunicación entre PHP y Arduino usando un Puerto COM
Author
Publisher Name
Drouiz
Publisher Logo

4 thoughts on “PHP + Arduino en Windows”

  • félix fernando acosta says:

    Hola, Nuño Valencia me funciona bien el código de «PHP de escritura del puerto» pero lo que no me funciona es el de Lectura, en la parte de fread($fp, int»); mi pregunta es que es el int? pues me interesa enviar una señal al php desde arduino. saludos.!

    • Hace tiempo que hice esto y es más una curiosidad, el int es el número que va a leer máximo. Arduino esta mandando datos por el serial constantemente y tu le dices que lea 20 bytes o 100 o lo que sea, yo lo hice para encender y apagar unos LEDs. Entonces no recuerdo de memoria pero Arduino mandaba algo como INICIO, led1, led2, led3… FIN, yo le mandaba leer más de lo que recibía así aseguraba que tenia una cadena entera, luego le decía que desde INICIO, hasta FIN y leyera los datos de los LEDs y luego esos datos eran farolas que se mostraban en un Google maps, en Arduino se encendían sobre un plano con LEDs y las farolas se regulaban.

      Como te digo esta bien como curiosidad, porque cada vez que invocabas el PHP este ocupaba el puerto COM, si dos usuarios consultaban a la vez, el segundo daba erro el PHP y no se mostraba la página porque el puerto COM, estaba ocupado.

      Solución, o creas solo un PHP que se ejecuta todo el tiempo y hace la interacción con Arduino o no funciona, por ejemplo dejas los datos en un archivo o en un MySQL y luego solo un archivo accede al puerto COM.

      Espero haberte solucionado la duda.

  • Jose Aviles says:

    Estoy en windos y me aparece este error:
    Warning: fopen(com3): failed to open stream: Permission denied in C:\xampp\htdocs\serverweb\test2.php on line 4
    No conectado

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.