Edoardo Vignali
Come interfacciare il Wii Nunchuck e Arduino
Tutorials -
Martedì 04 Maggio 2010 19:52
Scritto da Edoardo Vignali

Interfacciare Arduino e il Wii Nunchuck

wii nunchuck

Introduzione

Il Wii Nunchuck è uno dei controller per consolle più interessanti dal punto di vista sensoristico, infatti contiene un accelerometro. Dal punto di vista di interfacciamento con arduino è molto semplice riuscire a comunicare con il Nunchuck perchè comunica tramite protocollo I2C.

Un accelerometro è un disposito elettronico che è capace di tradurre un'accelerazione in un impulso elettronico, questo impulso poi viene digitalizzato e quindi viene reso interpretabile da dispositivi come microcontrollori e altri dispositivi elettronici.

Codice Arduino

Questo codice scriverà sulla seriale 7 dati:

accelerazione x, accelerazione y, accelerazione z, joystick asse x, joystick asse y, bottone C, bottone Z.

Includete per prima cosa Wire.h, la libreria dell I2C


void setup()
{
Serial.begin(115000);
nunchuck_init(); // inizializza il nunchuck
}

void loop()
{
nunchuck_get_data();
nunchuck_print_data();
delay(100);
}


//
// Nunchuck functions
//

static uint8_t nunchuck_buf[6];   //array utilizzato per immagazzinare i dati in arrivo dal nunchuck,


void nunchuck_init()
{
Wire.begin();                   
Wire.beginTransmission(0x52);    // trasmettiamo l'indirizzo della periferica 0x52
Wire.send(0x40);        // trasmettiamo l'indirizzo della memoria
Wire.send(0x00);        // trasmettiamo uno 0 perchè vogliamo leggere dati
Wire.endTransmission();    // smettiamo di trasmettere
}

void nunchuck_send_request()
{
Wire.beginTransmission(0x52);    //trasmettiamo l'indirizzo del nunchuck
Wire.send(0x00);        // trasmettiamo un byte
Wire.endTransmission();    // smettiamo di trasmettere
}

// Ricevere dati e immagazzinarli in un buffer
int nunchuck_get_data()
{
int cnt=0;
Wire.requestFrom (0x52, 6);  
while (Wire.available ()) {
// decodifichiamo i byte che ci arrivano e li traformiamo in un intero
nunchuck_buf[cnt] = nunchuk_decode_byte(Wire.receive());
cnt++;
}
nunchuck_send_request(); 

if (cnt >= 5) {
return 1;  //restituisce 1 se fallisce
}
return 0; //restituisce 0 se i dati sono stati ricevuti in maniera corretta
}

// Stampare i dati arrivati
// i dati di accelerazione sono lunghi 10 bit
// quindi ne leggiamo 8 poi aggiungiamo
// gli ultimi 2 bit.

void nunchuck_print_data()
{
static int i=0;
int joy_x_axis = nunchuck_buf[0];
int joy_y_axis = nunchuck_buf[1];
int accel_x_axis = nunchuck_buf[2]; // * 2 * 2;
int accel_y_axis = nunchuck_buf[3]; // * 2 * 2;
int accel_z_axis = nunchuck_buf[4]; // * 2 * 2;

int z_button = 0;
int c_button = 0;

// byte nunchuck_buf[5] contains bits for z and c buttons
// it also contains the least significant bits for the accelerometer data
// so we have to check each bit of byte outbuf[5]
if ((nunchuck_buf[5] >> 0) & 1)
z_button = 1;
if ((nunchuck_buf[5] >> 1) & 1)
c_button = 1;

if ((nunchuck_buf[5] >> 2) & 1)
accel_x_axis += 2;
if ((nunchuck_buf[5] >> 3) & 1)
accel_x_axis += 1;

if ((nunchuck_buf[5] >> 4) & 1)
accel_y_axis += 2;
if ((nunchuck_buf[5] >> 5) & 1)
accel_y_axis += 1;

if ((nunchuck_buf[5] >> 6) & 1)
accel_z_axis += 2;
if ((nunchuck_buf[5] >> 7) & 1)
accel_z_axis += 1;

Serial.print(i,DEC);
Serial.print(",");

Serial.print(accel_x_axis, DEC);
Serial.print(",");
Serial.print(accel_y_axis, DEC);
Serial.print(",");
Serial.print(accel_z_axis, DEC);
Serial.print(",");
Serial.print(joy_x_axis,DEC);
Serial.print(",");
Serial.print(joy_y_axis, DEC);
Serial.print(",");
Serial.print(z_button, DEC);
Serial.print(",");
Serial.print(c_button, DEC);

Serial.print("\r\n");  // newline
i++;
}

// metodi di codifica dei nunchuck originali
char nunchuk_decode_byte (char x)
{
x = (x ^ 0x17) + 0x17;
return x;
}

Con questo codice potrete utilizzare al 100% le funzionalità del nunchuck, potrete anche decidere di non stampare sulla seriale i codici risultati della lettura dal nunchuck. Per accedere a questi dati basterà utilizzare le variabili accel_[x,y,z]_axis, joy_[x,y]_axis [c,z]_button, dove al posto delle quadre basterà inserire l'asse che si vuol leggere.

Trovo molto più comodo questo codice rispetto ad usare la libreria, perchè in questo modo avrete molta più libertà, inoltre la libreria è in fase di sviluppo quindi potrete trovarvi a dover risolvere problematiche di compatibilità con la versione dell'IDE ecc ecc.

CC

 

Gioblu Robotics © 2010 - 2012 · Sitemap · privacy

gioscarab@gmail.com

Gioblu BOTServer è online dal 10 Aprile 2010 - 319.232 Visite - 1.027.175 Pagine visualizzate - 182.309 Visitatori unici - 536 utenti attivi