Hablando con el Arduino desde el PC

Hace unos días por fin abrí el Arduino Starter Kit que tenía desde Noviembre guardado en un cajón. Impulsado por los avances de @crazystress vi claro que era el momento de volver a la acción y a disfrutar del mundo de los chips y de los controladores.

El Arduino es un pack formado por un microcontrolador (un ATMEGA) optimizado para hablar con el “mundo exterior” mediante un conjunto de puertos de entrada y salida ya configurados. Además, a nivel de programación, cuenta con un entorno de desarrollo que permite programas en un pseudo-lenguaje muy cercano a los lenguajes de programación tradicionales, huyendo de la programación a bajo nivel (registros, pilas y demás…) haciendo que con pocos conocimientos de electrónica y de programación puedas empezar a disfrutar como un hobby más.

Arduino - ejemplo 1

El primer reto no parecía muy complicado, y @crazystress ya lo tenía más que superado: conseguir que el PC y el Arduino hablaran entre ellos a través de una aplicación web. Parecía sencillo, pero con un Windows de por medio lo sencillo se convierte en una aventura y al final he necesitado un par de noches para conseguir que funcione…

Vamos con el ejemplo: una página en PHP corriendo en el PC de casa pregunta al usuario que introduzca un dígito y se lo envía al Arduino. Si es par, un led situado en la patilla 13 parpadeará una vez, y si es impar parpadeará dos veces.
El archivo index.php corre en Localhost, sobre un IIS montado en un Windows XP con la extensión para soportar PHP.
El Arduino, aunque se conecta por USB, simula un puerto serie y Windows le asigna el COM correspondiente. En este caso concreto utilizo el COM2.

Sobre los códigos: el del Arduino es bastante sencillo. A nivel de Hardware, el único elemento existente es un Led situado en el Pin 13, único pin que permite conectar directamente un Led sin necesidad de añadirle una resistencia. A nivel de software, lo único que hace es escuchar por el puerto serie. Cuando le llega un dígito, calcula el resto de dividirlo por 2, y bien parpadea una vez cuando es par, bien parpadea dos veces cuando es impar.

El código de la página PHP posiblemente sea mejorable, pero para el ejemplo funciona de sobra (por ejemplo, el puerto vale con abrirlo una vez, no es necesario estar abriéndolo y cerrándolo cada vez que se usa, pero bueno). Además, he dejado unas cuantas líneas comentadas que me han sido muy útiles para encontrar una solución al error que me impedía abrir el puerto COM12. De todas formas, cualquier ayuda para mejorar el código, bienvenida será.

Dejo los archivos en un .zip para descargarlos directamente.

Y lo más importante: la lista de pequeñas cosas que he aprendido por el camino:

  • Descomprimí el .zip con el software del Arduino en el Escritorio, corté la carpeta y la pegué en C:/Archivos de Programa. A partir de ahí dejó de compilar por un tema de permisos de directorios, así que la tengo de vuelta en el Escritorio.
  • Montar el IIS en Windows XP es bastante trivial: Inicio -> Configuración -> Panel de Control -> Agregar o quitar programas -> Agregar o quitar componentes de Windows -> Internet Information Services (IIS). Eso sí, el CD de Windows XP hay que tenerlo a mano.
  • La extensión para soportar PHP la descargué de la web oficial, seleccionando el paquete “VC9 x86 Thread Safe” para PHP 5.3 (desde el completo desconocimiento entre la versión 5.2 y 5.3. Es necesario instalar las librerías Microsoft 2008 C++ Runtime x86 (x86 en mi caso).
  • En el PHP.ini sólo activé la depuración de errores “display_errors = On”, y añadí una línea para configurar el timezone y evitar el infierno de los warnings de los timezones: date.timezone = (‘Europe/Madrid’);
  • Una de las cosas que más tiempo me llevó fue entender que Windows no permite abrir el puerto serie del Arduino si está por encima del COM9, y por defecto lo tuve en COM12. Siempre obtenía un Permission Denied hasta que lo cambié al COM2 (botón derecho en Mi PC -> propiedades -> hardware -> administrador de dispositivos -> Ports (COM y LPT) -> seleccionar Arduino UNO -> botón derecho en propiedades -> configuración del puerto -> opciones avanzadas. Una vez cambiado, reiniciar el equipo. Gracias Windows.
  • Una vez abierto el puerto, lo normal es utilizar la clase php_serial.class.php para realizar las comunicaciones. Pero de nuevo Windows lo de leer y escribir en los puertos serie no lo lleva muy bien y esta clase me ha dado muchos quebraderos de cabeza, así que he terminado haciendo las comunicaciones “a mano” mediante fopens.
  • Lo he comentado antes, pero es importante: el Pin 13 es el único que permite conectar directamente un led sin necesidad de resistencia. De ahí que muchos de los ejemplos que existen por Internet utilicen este pin para pruebas con leds.

En resumen, que gracias a Windows he tenido más quebraderos de cabeza de los esperados, pero no he sido el único en tener que superarlos, y ya son parte del pasado. Y ahora a por los siguientes pasos: mientras me llegan las matrices de Leds, voy a trastear un poco con el 74HC595 y con las conversiones int -> char y viceversa porque hay algunos detalles por aclarar para poder trabajar con las matrices de leds.