Arduino e Nunchuck – seconda parte

Collega il tuo nunchuck ad arduino attraverso l’adattatore della dfrobot e una breadboard, e proviamo uno sketch semplice per verificare di aver collegato tutto in modo corretto.

Wii nunchuck radiografia

Prima di tutto collega l’adattatore alla porta del nunchuck, per farlo osserva la posizione dei pin sul connettore del nunchuck, come illustrato nel precedente articolo:

connettore nunchuck

poi osserva l’adattatore della dfrobot:

nunchuck adapter dfrobot

ti sarai già reso conto che l’unico modo di connetterlo è quello che vedi in figura, in quanto il connettore del nunchuck ha il pin di massa (GND) e il pin di Clock (C) posizionati dal lato della scanalatura del connettore stesso:

connection nunchuck to arduino

Quindi per aiutarti con la connessione ad Arduino utilizza una breadboard in modo che tu possa connettere il pin di clock al pin A5 di arduino, il pin di data al pin A4 di arduino e l’alimentazione al +3.3v e Gnd di arduino, ho realizzato un semplice schema per guidarti:

nunchuck connect to breadboard

Passa ora a copiare e incollare lo sketch seguente nell’IDE arduino:

#include <Wire.h>
#include <string.h>
#include <stdio.h>

uint8_t outbuf[6];

int cnt = 0;

int pulseWidth = 0;
int pulseWidth2 = 0;

long lastPulse = 0;
long lastPulse2 = 0;

int z_button = 0;
int c_button = 0;

int refreshTime = 20;

int minPulse = 1000;
int minPulse2 = 500;

int dtime=1000;

#define pwbuffsize 10
long pwbuff[pwbuffsize];
long pwbuffpos = 0;
long pwbuff2[pwbuffsize];
long pwbuffpos2 = 0;

void setup()
{
    Serial.begin (9600);
    Wire.begin ();
    nunchuck_init ();

    Serial.print ("Finished setup\n");
}

void nunchuck_init()
{
    Wire.beginTransmission (0x52);
    Wire.send (0x40);
    Wire.send (0x00);  
    Wire.endTransmission ();
}

void send_zero()
{
    Wire.beginTransmission (0x52);
    Wire.send (0x00);
    Wire.endTransmission ();
}

int t = 0;

void loop()
{
    t++;
    long last = millis();

    if( t == 1) {

        t = 0;

        Wire.requestFrom (0x52, 6);

        while (Wire.available ()) {
            outbuf[cnt] = nunchuk_decode_byte (Wire.receive ());
            cnt++;
        }

        if (cnt >= 5) {

            int z_button = 0;
            int c_button = 0;

            if ((outbuf[5] >> 0) & 1) 
                z_button = 1;
            if ((outbuf[5] >> 1) & 1)
                c_button = 1;
        }

        cnt = 0;
        send_zero();

    } // if(t==)

    printNunchuckData();
    delay(dtime);
}

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

    int z_button = 0;
    int c_button = 0;

    if ((outbuf[5] >> 0) & 1) 
        z_button = 1;
    if ((outbuf[5] >> 1) & 1)
        c_button = 1;
    if ((outbuf[5] >> 2) & 1) 
        accel_x_axis += 2;
    if ((outbuf[5] >> 3) & 1)
        accel_x_axis += 1;

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

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

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

    Serial.print ("X: ");
    Serial.print (joy_x_axis, DEC);
    Serial.print ("\t");

    Serial.print ("Y: ");
    Serial.print (joy_y_axis, DEC);
    Serial.print ("\t");

    Serial.print ("AccX: ");
    Serial.print (accel_x_axis, DEC);
    Serial.print ("\t");

    Serial.print ("AccY: ");
    Serial.print (accel_y_axis, DEC);
    Serial.print ("\t");

    Serial.print ("AccZ: ");
    Serial.print (accel_z_axis, DEC);
    Serial.print ("\t");

    Serial.print (z_button, DEC);
    Serial.print (" ");
    Serial.print (c_button, DEC);
    Serial.print ("\r\n");
    i++;
}

char nunchuk_decode_byte (char x)
{
    x = (x ^ 0x17) + 0x17;
    return x;
}

Per funzionare fai uso della libreria Wire.h fornita nell’IDE arduino, che consente di inviare e ricevere i segnali inviati dal nunchuk.

La funzione di questo sketch è inizializzare la comunicazione verso il nunchuck a cui provvede la funzione nunchuck_init() alle linee 40-46; e decodificare i degnali inviati dal nunchuck mediante la funzione nunchuck_decode_byte( char x ) alle linee 154-158;

Se dopo aver trasferito lo sketch su arduino apri il monitor seriali vedrai comparire delle righe con un intervallo di un secondo tra una riga e l’altra, l’aspetto è simile al seguente:

nunchuck serial monitor

in cui ogni per ogni linea è riportato:

  1. n° di linea
  2. X: valore letto sull’asse X del joystick
  3. Y: valore letto sull’asse Y del joystick
  4. AccX: valore letto sull’asse X dell’accelerometro
  5. AccY: valore letto sull’asse Y dell’accellerometro
  6. valore del pulsante Z (non premuto = 1; premuto = 0)
  7. valore del pulsante C (non premuto = 1; premuto = 0)

Nella mia immagine avrai notato che ho evidenziato alcuni valori, nell’eseguire i miei test ho rilevato che ruotando il nunchuck a destra e sinistra varia l’asse denominato AccX, ruotandolo in avanti e indietro ( movimento di beccheggio ) varia il valore AccY, per entarmbi gli assi i valori oscillano tra circa 89 e circa 177 da cui ho dedotto che il valore medio è (89 + (177-89)/2) = 133, ossia (valmin + (valmax-valmin)/2).

Ho eseguito dei test muovendo il joystick e rilevando i valori letti da arduino: min 27/28 e max 255; mentre la posizione centrale del joystick mostra un valore rilevato di 122 per l’asse X e 129 per l’asse Y.

Infine i valori rilevati alla pressione dei pulsanti posti davanti al nunchuck, il pulsante Z e C, la pressione di uno dei pulsanti produce il valore 0, mentre a pulsanti non premuti essi restituiscono il valore 1.

Ora hai tutti gli elementi per iniziare a provare il tuo nunchuck e iniziare a rilevare i valori minimi e massimi per ciscun sensore in modo da poterli settare nei tuoi progetti con arduino.

Buon divertimento.

Prima di inserire un commento, per favore, leggi il regolamento

Permanent link to this article: https://www.mauroalfieri.it/elettronica/arduino-e-nunchuck-seconda-parte.html

73 pings

Skip to comment form

  1. […] Prima di passare allo sketch vorrei sottolineare che provando 2 nunchuck i valori di base rilevati da arduino non coincidono perfetamente, per vedere i valori che rilevi sul tuo arduino ti consiglio di leggere il precedente articolo Arduino e Nunchuck – seconda parte. […]

  2. […] acquistare prodotti non originali come ha fatto Angelo che ha commentato uno dei miei articoli sul nunchuck chiedendomi come risolvere il problema da lui riscontrato di malfunzionamento dell’arduino […]

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.