Chiunque conosca Arduino prima o poi si sarà trovato di fronte a quest’accoppiata. Usare il nunchuck della console Wii oltre ad essere una cosa molto divertente ci permette anche di risparmiare qualche soldo: al suo interno troviamo un accelerometro a tre assi, due pulsanti e un joystick, già saldati contenuti in un box ergonomico e facilmente accessibili tramite protocollo seriale (I2C).

Cerchiamo di capire come funziona e come possiamo fruttarlo per un nostro progetto.

Il protocollo.

Il nunchuck utilizza una versione leggermente “personalizzata” del protocollo I2C.

Senza addentrarci troppo nei meandri dell’I2C il nunchuck per funzionare ha bisogno di una prima fase di inizializzazione in cui vengono inviati 3 byte:

0x52: indirizzo del nunchuck;
0x40:indirizzo di memoria;
0x00: inviamo uno zero, che rappresenta la richiesta di dati.

Successivamente alla richiesta di informazioni il nunchuck risponde con 6 byte il cui significato è riportato nella seguente tabella:

Byte Descrizione
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 0 Pulsante Z vale 0 quando pressato
1 Pulsante C vale 0 quando pressato
3:2 2 bit LSB accelerazione X
5:4 2 bit LSB accelerazione Y
7:6 2 bit LSB accelerazione Z

L’accelerometro ha un’uscita a 10 bit, ma il protocollo I2C permette l’invio di soli 8 bit per volta: per questo motivo il valore degli assi dell’accelerometro è diviso in questo modo (8 bit a se stanti e gli ultimi due nel 6° byte).

Nota: In base al nunchuk utilizzato può essere necessario una decodifica del valore: in pratica dobbiamo fare un’operazione di XOR tra il byte ricevuto e il valore 0x17 e successivamente sommarlo con lo stesso valore (0x17). Nella libreria wiichuck (che andremo ad utilizzare) per ovviare a questo problema viene utilizzata un’inizializzazione più complessa che vedremo quando analizzeremo il codice e non sarà necessaria alcuna decodifica.

La Connessione.

I colori dei fili posso cambiare  in base alla casa che ha prodotto il nunchuck (non credo che stiamo smontando un nunchuck originale) però basta guardare il connettore:

nunchuck_plug__10b2oq__

una volta individuati i segnali di SDA (data) e SCL (clock) basta collegarli rispettivamente a ai pin analogici 4 e 5 dell’arduino. Per l’alimentazione il nunchuck funziona a 3.3V (anche se molti lo alimentano a 5V senza riscontrare problemi) quindi basterà collegarlo ai 3.3V dell’arduino e la massa al GND.

Il codice.

All’inizio pensavamo di dover scrivere il codice per gestire il nunchuk, operazione che non risulta troppo complicata una volta conosciuto il protocollo. Ma poi abbiamo pensato che reinventare la ruota non aveva senso, che sarebbe stato più utile prendere la libreria già presente nei reference di Arduino e commentarla insieme.
Inoltre la libreria Wiichuck.h ci fornisce anche un output con il calcolo del rollio e del beccheggio del controller a partire dai valori dell’accelerazione sui 3 assi.

Potete scaricare da qui un file .zip contenente la libreria e il file di esempio presenti nel playground di Arduino. Analizziamo insieme la libreria.