Sono riuscito nel mio intento vi posto il codice magari puo tornare utile a qualcuno
/*
Programma che esegue la lettura dei dati dal controller nunchuck della wii e mostra i valori letti tramite monitor seriale
*/
// includo la libreria Wire.h
#include <Wire.h>
void setup()
{
// setto la seriale
Serial.begin(115200);
// inizio la comunicazione i2c
Wire.begin();
// inizializzo il nunchuck
nunchuckInizializzazazione();
}
void loop()
{
// chiamo la funzione per ottenere i dati dal nunchuck
nunchuckRichiestaDati();
// chiamo la funzione per inviare i dati dalla seriale e stamparli a video
nunchuckStampaDati();
// inserisco un ritardo per non sovraccaricare il processore
delay(200);
}
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Nunchuck funzioni
//array utilizzato per immagazzinare i dati in arrivo dal nunchuck,
static uint8_t nunchuck_buf[6];
// funzione di inizializzazione del nunchuck
void nunchuckInizializzazazione ()
{
// inizio la trasmissione con la periferica indicando l'indirizzo della stessa 0x52
Wire.beginTransmission(0x52);
// trasmetto l'indirizzo della memoria
Wire.write(0x40);
// trasmetto uno 0 perchè voglio leggere i dati dalla periferica
Wire.write(0x00);
// fermo la trasmissione
Wire.endTransmission();
}
// funzione che invia la richiesta alla periferica per ottenere dati
void nunchuckInviaRicezione ()
{
// inizio la trasmissione con la periferica indicando l'indirizzo della stessa 0x52
Wire.beginTransmission(0x52);
// trasmetto un byte con valore '0' in questo modo comunico che la periferica deve inviare i dati da leggere
Wire.write(0x00);
// fermo la trasmissione
Wire.endTransmission();
}
// funzione che riceve i dati e li immagazzina in un buffer
int nunchuckRichiestaDati()
{
// creo un contatore per scorrere il buffer contenente i dati ricevuti
int cnt = 0;
// invio la richiesta alla periferica di 6 byte
Wire.requestFrom (0x52, 6);
// mentre ci sono dati da leggere, leggo i dati e li memorizzo nel buffer
while (Wire.available () != 0 )
{
// leggo i byte che arrivano e li memorizzo nel buffer
nunchuck_buf[cnt] = Wire.read();
// mi sposto all'elemento successivo del buffer
cnt++;
}
// controllo che il quantitaivo di dati arrivati sia giusto e comunico il risultato
if(cnt = 6)
{
// confermo che i dati sono stati ricevuti correttamente sia all'utente che alla periferica
nunchuckInviaRicezione();
Serial.println("OK");
}
else
{
// comunico che i dati non sono giusti e che c'è stato un errore
Serial.println("ERRORE");
}
// restituisco 0
return 0;
}
// funzione che stampa i dati arrivati, i dati di accelerazione sono lunghi 10 bit, quindi ne leggiamo 8 poi aggiungiamo gli ultimi 2 bit
void nunchuckStampaDati ()
{
/*
DOCUMENTAZIONE SUL PACCHETTO DATI INVIATO DALLA PERIFERICA
Byte/Bit 7 6 5 4 3 2 1 0
1 Asse X del joystick analogico
2 Asse Y del joystick analogico
3 8 bit MSB del valore dell’accelerazione sull’asse X
4 8 bit MSB del valore dell’accelerazione sull’asse Y
5 8 bit MSB del valore dell’accelerazione sull’asse Z
6 Z Z Y Y X X C Z
*/
// memorizzo i dati del buffer relativi al joypad (x,y) in due variabili
byte joy_x_axis = nunchuck_buf[0];
byte joy_y_axis = nunchuck_buf[1];
// setto a '0' il buffer
for(int i=0; i <=6 ;i++)
{
nunchuck_buf[i] = 0;
}
// creo due variabili di appoggio
byte x=0;
byte y=0;
// taratura nunchuck
x = abs(joy_x_axis-23);
y = abs(joy_y_axis-28);
// stampo il risultato sul monitor
Serial.print("x = ");
Serial.print(x,DEC);
Serial.print(" y = ");
Serial.print(y, DEC);
Serial.print("\r\n"); // newline
}
Tuttavia ho notato una grande difficolta e innaffidabilita dei nunchuck, per esempio spingendo il joystick su i valori per qualche istante anziche aumentare diminuiscone e poi aumentano di colpo ad esempio se non spinto, il valore è 96, spingendolo passa da 70 e poi a 120,stessa cosa con l' asse x, ho provato a usare anche un' altro nunchuck sempre originale ma il risultato non cambia, è molto piu semplice e affidabile usare un mini joystick resistivo tipo quelli montati sul controller della ps3.