domingo, 18 de octubre de 2009

Control inalámbrico con Arduino y un mando de la Play.

En esta entrada voy a comentar uno de las adquisiciones más interesantes que he hecho últimamente. Se trata de un sistema de desarrollo de microcontroladores denominado Arduino, junto con una aplicación muy curiosa que permite controlarlo con un joystick sin cables. Esto no lo estaría contando aquí, si no fuera porque se trata de una aplicación muy económica y fácil de programar.

Ya sé que este blog que se actualiza muy frecuentemente, pero preferimos ser fieles al estilo original de mostrar contenidos propios con pruebas realizadas por nosotros mismos, en lugar de limitarnos a comentar trabajos ajenos.

Quiero aprovechar para agradecer su dedicatoria a Juan Antonio a través de su estupendo a la vez que inclasificable blog (Lithographica), que recomiendo a todos aquellos que tengan algo más que tornillos y cables en la cabeza.

¿Qué es un Arduino?

Se trata de un sistema de desarrollo para microcontroladores muy fácil de programar, y de bajo coste, con un  compilador de C con un IDE (de código abierto) en java que permite su programación desde Windows, Linux ó MacOSX (¿!¿). Existen varios tipos de Arduino basados en diferentes modelos de microcontroladores de la familia AVR de Atmel (que a mí ya me gustaban mucho), por lo que podemos elegir  el que mejor se ajuste a nuestra aplicación.


Sistema de desarrollo Arduino Duemilianove

Un modelo medio (duemilianove) cuesta unos 24 € + iva (en BricoGeek.com) y el microcontrolador suelto lo podemos comprar por poco más de 5 € (con un cuarzo y dos condensadores va que arde). Llevan programado un bootloader que permite programarlos desde su puerto serie sin necesidad de adquirir un programador ICSP aparte. Si compráis una versión con USB, tenéis resuelta la alimentación para las pruebas durante el desarrollo.

El software es gratuito y lo podemos descargar desde la web oficial de Arduino. No requiere de instalación y viene con las librerías más comunes. Para cosas más raras podéis descargar librerías adicionales. !Gracias!

La verdad es que no se trata de nada nuevo y ya existen miles de sitios con recursos y vídeos de proyectos realizados con estos microcontroladores, por lo que seguro que encontramos alguien que ha resuelto antes, al menos en parte lo que nos planteamos realizar. Lo mejor es hacer una búsqueda en el google, de "Arduino+lo-que-queramos-construir" para ahorrarnos esfuerzos.

El control inalámbrico

La aplicación elegida para demostrar el funcionamiento de este sistema ha sido la de controlar (o al menos enviarle consignas) un Arduino mediante un Joystick joypad inalámbrico. En este caso se ha usado uno fácil de encontrar (y barato) como el de la Playstation (PSX).


Arduino Duemilianove conectado a un receptor de un controlador PSX inalámbrico

La demostración no tiene ningún mérito porque ya hay muchas cosas parecidas en la red, pero me pareció mas digno que la típica de hacer parpadear el led. La lectura de un joystick de psx no es inmediata y hace falta algo de información obtenida mediante ingeniería inversa, que podéis encontrar en muchas páginas. De hecho ya hay disponible una librería oficial Psx para para su lectura mediante cuatro lineas digitales. El cableado no tiene mucho misterio, ya que en la llamada a la función de inicialización se indican los pines a los que se han conectado las señales:
Psx.setupPins(dataPin, cmndPin, attPin, clockPin, 10);
La programación

Una vez descargada la última versión del software de desarrollo (la 0017 en mi caso), descargáis la librería PSX y la copiáis en la carpeta arduino0017\hardware\libraries. A partir de ahora al ejecutar el IDE, la librería se encuentra perfectamente integrada, inluyendo los ejemplos de uso.
Cargamos el ejemplo de PSX, comprobamos que las lineas digitales usadas son las mismas que hemos usado nosotros y le damos a compilar. Lo que pasa con las versiones alfa es que suelen fallar cosas, pero nada que no tenga solución con una buena chapuza. Insertamos dos lineas antes de incluir la librería PSX y solucionado:
#include (stdio.h)
#include (math.h) // Cambiad los paréntesis por los símbolos correspondientes.
Después le damos a "Upload" para cargar el ejecutable en el microcontrolador pero no funciona. Ésto ya no es culpa de la versión, sino del tipo de mando. Al tratarse de un mando inalámbrico de origen desconocido (china) no se comporta exactamente como el de Sony (que también vendrá de China). Se me ocurrió que podría ser un problema de temporicación y se resolvió insertando lo siguiente dentro del bucle principal del programa de ejemplo:
delay(50);
Se ve que el controlador clónico no tiene capacidad para responder tan rápido como el original. Puede que funcione con retardos algo menores, pero para mí es suficiente.

... ¿Y?

El resultado del funcionamiento lo podéis apreciar en el vídeo siguiente. La señal de radio, de 2.4GHz, tiene un rango de hasta unos 10 metros, dependiendo del entorno. Lo que se muestra es nada espectacular, pero abre la puerta a una gran cantidad de aplicaciones y de horas perdidas en cacharreo.



Un saludo a todos y espero que la poca especial periodicidad de este blog no os haga olvidaros de El Hombre Mecatrónico.

3 comentarios:

  1. Hola,
    Me parece muy interesante lo que estás haciendo, de hecho estoy intentando hacerlo.
    El problema es que haciendo lo que indicas me da error (c:/documents and settings/administrador/escritorio/arduino/ide/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr5/crtm328p.o:(.init9+0x0): undefined reference to `main')

    Si has tenido este error o sabes qué puede ser lo que falla te lo agradecería mucho

    ResponderEliminar
  2. Resuelto, tan sólo hay que poner
    "const int ledPin = 13;" antes del include"psx_analog.h"

    ResponderEliminar
  3. Hola, Manuel. Me alegro de que hayas podido resolver tu problema. La verdad es que el sistema de desarrollo en determinadas situaciones da unos errores muy extraños que se solucionan cambiando el orden de los "include". Yo no obstante he usado sólo la librería psx.h (digital) que es un más sencilla.
    Aprovecho para recordarte que tenemos nueva casa en http://www.hombremecatronico.es.
    Esperamos verte por allí pronto.

    ResponderEliminar