i2c Arduino

Sono riuscito nel mio intento vi posto il codice magari puo tornare utile a qualcuno :wink:

/*
  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.