lunes, 21 de febrero de 2011

Vehículos dirigidos (III): Resultados

Una vez que tenemos los valores de los sensores del mando en matlab lo único que queda es programación.

Aquí mi mayor problema ha sido que no he sido capaz de encontrar una explicación lógica a los valores que leía del mando, por lo que mi calibrado y mi código es un tanto artesanal.

Yo esperaba que dejando el mando en reposo, y moviendo sólo un eje, sólo obtendría valores distintos para ese valor. Nada más lejos de la realidad. Los valores que recibía del mando variaban todos.



Así que como ya he comentado el convertir los valores que leía en movimientos se ha hecho de manera artesanal.

Aquí os dejo dos vídeos, en el primero se maneja el vehículo con el joystick y en el segundo con el acelerómetro.




martes, 1 de febrero de 2011

Vehículos dirigidos (II): Conectando nunchuck + wiichuck + arduino + matlab

El objetivo es enviar los valores de los sensores del mando nunchuck al arduino.


Lo que aparentemente parecía muy fácil ya que hay cienes y cienes de tutoriales y librerías, no resultó tan fácil. Aquí os resumiré los pasos que he ido siguiendo y como conseguí que todo funcionara.

En primer lugar nos descargamos de aquí la librería nunchuck_funcs.h. Esta librería nos ofrece una interfaz muy sencilla para obtener los valores del mando.

// returns zbutton state: 1=pressed, 0=notpressed
static int nunchuck_zbutton()

// returns zbutton state: 1=pressed, 0=notpressed
static int nunchuck_cbutton()

// returns value of x-axis joystick
static int nunchuck_joyx()

// returns value of y-axis joystick
static int nunchuck_joyy()

// returns value of x-axis accelerometer
static int nunchuck_accelx()

// returns value of y-axis accelerometer
static int nunchuck_accely()

// returns value of z-axis accelerometer
static int nunchuck_accelz()


Quizás otro día explique como está construida esta librería por dentro e incluso que haga yo una, pero de momento me supera por todos lados.

Con esta interfaz tan sencilla, sólo nos queda escribir un pequeño código para arduino que recupere los valores.

#include
#include "nunchuck_funcs.h"

int loop_cnt=0;

int accx,accy,accz,zbut,cbut,jx,jy;

void setup(){
pinMode(10, OUTPUT); // LEYENDO INFORMACIÓN DEL MANDO
pinMode(11, OUTPUT); // ENVIANDO AL PUERTO SERIE
pinMode(12, OUTPUT); // ESPERANDO

digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,LOW);

Serial.begin(9600);
nunchuck_setpowerpins();
nunchuck_init();
}

/*
se queda iluminado durante x tiempo y sólo está a bajo nivel
cuando está recibiendo información
*/

void loop(){
digitalWrite(10,HIGH);

nunchuck_get_data();

accx = nunchuck_accelx();
accy = nunchuck_accely();
accz = nunchuck_accelz();

zbut = nunchuck_zbutton();
cbut = nunchuck_cbutton();

jx = nunchuck_joyx();
jy = nunchuck_joyy();

digitalWrite(10,LOW);

digitalWrite(11,HIGH);
Serial.print( accx );
Serial.print(" ");
Serial.print( accy );
Serial.print(" ");
Serial.print( accz );
Serial.print(" ");
Serial.print( zbut );
Serial.print(" ");
Serial.print( cbut );
Serial.print(" ");
Serial.print( jx );
Serial.print(" ");
Serial.println( jy );
Serial.flush();
digitalWrite(11,LOW);

digitalWrite(12,HIGH);
delay(250);
digitalWrite(12,LOW);

}//loop


El utilizar los pines con los leds, sólo tiene la función de depurar la aplicación. Como se puede ver lo único que se hace es leer los valores y escribirles separados al puerto serie. Para probarlo, podemos arrancar el monitor serie del entorno Arduino.


Se ve como si movemos el mando, pues los valores se van cambiando y así se recogen, separados por espacios.

Si queremos leer con matlab el valor de un puerto serie, hay que utilizar el siguiente código. Que nos deja los valores en un array llamado loQueRecibo. Habrá mejores y peores maneras, pero mis conocimientos de matlab, no dan para más

Cosas importantes, el nombre del puerto USB al que está conectado el arduino y la velocidad de conexión.

placa = serial( 'COM16' , 'BaudRate', 9600 );
fopen( placa );
loQueRecibo = fscanf( placa );
loQueRecibo = sscanf(loQueRecibo,'%d');


De este modo tenemos en el array loQueRecibo, los valores que se recogen del nunchuck y que se pueden ver en el pantallazo del monitor serie.

Vehículos dirigidos (I): Introducción

Hace mucho, mucho tiempo en una galaxia muy, muy ... ¡no!, espera, no era así. Pues eso, que hace mucho tiempo que no escribo nada en mi blog. Esto no quiere decir que haya estado sin hacer nada. He trasteado y mucho, pero no he obtenido los resultados que yo esperaba.

Para empezar jugué mucho con mi off-roader, le monté y desmonté e hice cajas y cajas de cambios, pero eso es otra historia. Y luego también hice muchas cosas con el arduino, y me compré un montón e componentes, pero eso es otra historia. La historia que os contaré hoy, trata sobre un nunchuck, un wiichuck, un arduino y un lego. Que si bien eran cada uno hijos de su padre y de su madre, hablaban usando un usb, bluetooth y un matlab.

Hay infinidad de videos en youtube que muestran coches manejados con mandos de la wii, o aparatos más extraños. En esta serie de entradas os voy a contar mis experiencias construyendo alguno de estos vehículos.

Espero que a alguien le sirva de ayuda. Empecemos.