Mostrando entradas con la etiqueta programación. Mostrar todas las entradas
Mostrando entradas con la etiqueta programación. Mostrar todas las entradas

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.

miércoles, 7 de octubre de 2009

Uso de dispositivos I2C desde un PC con LabVIEW

Introducción
El I2C se ha convertido en un bus muy popular para la conexión de periféricos a microcontroladores, sobre todo en robótica doméstica por la aparición de numerosos sensores y actuadores que usan este tipo de comunicación.
Se trata de un bus donde un maestro (un PC ó microcontrolador principal) controla los accesos a los diferentes dispositivos esclavos que se pueden conectar al mismo bus. El maestro selecciona el dispositivo, la dirección del registro base dentro del dispositivo y el número de bytes que se desean escribir o leer. Los dispositivos esclavos deben poseer diferentes direcciones y se pueden conectar hasta 128 por bus.
El bus normalmente funciona con señales de 0 y 5V y la velocidad de trasferencia la marca el maestro, que puede tener una frecuencia entre 100 y 400 KHz.


Montaje chapucero del adaptador i2C y un SFR02

Para utilizar dispositivos I2C desde un PC necesitamos un adaptador de USB a I2C maestro. El que usa todo el mundo es el "Devantech USB I2C module". Es bastante económico ( veintitantos €) y fácil de usar, ya que implementa un puerto serie sobre USB (con drivers de FTDI) con un protocolo sencillo y además proporciona una salida de 5V que puede usarse para alimental ciertos dispositivos.
La conexión maestro-esclavos es muy fácil:

  • GND con GND
  • SCL con SCL
  • SDA con SDA
  • +5V ... depende
La entrada adicional que tiene el módulo adaptador sirve para otras cosas. Yo no la uso.
La salida de 5V se puede enviar por el bus, quedando entonces una conexión de cuatro líneas.
En la figura siguiente se muestra un ejemplo de conexionado, en la que el último dispositivo posee su propia alimentación y le basta con 3 hilos del bus (SCL-SDA-GND).


Ejemplo de uso:
Medida de distancias con un sensor sónar Devantech SFR02. La conexión es totalmente directa y no se ve el bus como tal.


Panel del programa de lectura

El programa de toma de medidas por sónar requiere de las inicialización del puerto serie con los parámetros adecuados para el adaptador concreto. En el bucle principal se realiza la lectura del registro lsb de distancia y se inicia una nueva medida mediante la escritura en el registro de comandos del SFR02.

Programa principal de lectura de sonar.


Librería de funciones I2C creada por El Hombre Mecatrónico para LabVIEW:
El programa anterior está basado en la siguiente librería de funciones para uso del bus I2C en labVIEW y que está incluida para descarga en el ejemplo anterior.




Función de Inicialización: I2CInit.vi



Función de Escritura: I2CWrite.vi



Función de Lectura: I2CRead.vi

Espero que este ejemplo le sirva a alguien.
Un saludo a todos los mecatrónicos.

martes, 8 de septiembre de 2009

Control de Servos con PC y LabVIEW

Para todos aquellos que queréis controlar vuestros servos de radiocontrol desde un PC, aquí cuento una de las maneras de hacerlo, aprovechando que el pisuerga pasa por Valladolid.



Existen servos de muchos tipos y tamaños.



Siempre se pueden reutilizar en plan cutre y hay multitud de elementos de montaje y acoplamiento para construir cosas interesantes.

Para montar un sistema de control de servos con PC necesitamos:
  • Un PC.
  • Una tarjeta de generación de señales PWM de servos.
  • Un adaptador para comunicar la tarjeta con el PC si es que ésta no viene ya con USB.
  • Servos.
  • Runtime de LabVIEW (o éntorno de desarrollo para modificar los ejemplo o crear vuestros propios programas).
  • Programas de control.




En nuestro caso estoy utilizando un netbook con Windows XP. Vale cualquiera con capacidad para ejecutar el sistema de desarrollo elegido.



La tarjeta de generación de PWM para servos que uso es una SSC32 de lynxmotion. La podéis encontrar en los brazos manipuladores de aficionados. Yo se la he quitado al mío y no sé si se la devolveré. Está muy bien para controlarla desde un PC porque tiene entrada RS232 y generación de trayectorias muy rudimentaria (límites de velocidad) que evita que los movimientos resultantes sean bruscos ( a la máxima velocidad de los servos) como pasa con otras tarjetas. También permite la obtención de las posiciones actuales de los servos, útil para establecer correspondencias en las lecturas de los sensores y las posiciones actuales si los movimientos son lentos. He necesitado un adaptador de rs232 a usb y la comunicación es a 19200 baudios.

Software:

Por claridad lo he hecho en dos partes: el programa principal (control.vi) y una función auxiliar que genera la cadena con la posición y la velocidad de un eje según el protocolo de la SSC32 (eje2ssc32.vi). Descargar aquí.




Panel de control de la aplicación básica. Es umy fácil reconfigurar y ampliar la interfaz de usuario según el número y tipo de servos.



El programa está bastante comentado.



Esta es una función auxiliar para simplificar el código del programa principal.

En el siguiente video se pueden ver la aplicación y algunos tipos de servos en funcionamiento.



Suerte y comentarios.