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.

No hay comentarios: