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.

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

Permalink link a questo articolo: https://www.mauroalfieri.it/elettronica/arduino-e-nunchuck-seconda-parte.html

71 commenti

2 ping

Vai al modulo dei commenti

    • Matteo il 31 Marzo 2012 alle 16:32
    • Rispondi

    Ciao!
    Prima di tutto grazie per la guida.
    Secondariamente volevo dire che il codice non è compatibile con l’IDE 1.0 di Arduino. Io non riesco a modificare opportunamente il codice in modo tale da renderlo compatibile..
    Sto cercando in ogni dove per trovarne uno adatto alla IDE 1.0 ma non c’è verso di trovarne; ora io non sono in grado di realizzare/modificare opportunamente il programma sia per problemi di tempo che di dimestichezza con il codice. Se qualcuno riuscisse gliene sarei grato!
    Grazie!

    1. Ciao Matteo,
      io ho provato qual codice con l’IDE 1 di Arduino, e con la scheda Arduino Duemilanove.
      Quale errore ti restituisce, magari posso correggerlo io per te e per tutti gli appassionati.

      Mauro

    • Matteo il 31 Marzo 2012 alle 18:58
    • Rispondi

    Dopo un po’ di paziente ricerca sono riuscito a trovare la libreria giusta con le funzioni che servivano a me.
    Ora riesco a muovere due servomotori (più avanti ne metterò un terzo) sia con l’analogico che con l’accelerometro del nunchuk!
    Sono molto felice!

    1. Bene, sono felice anche io, non solo perchè hai risolto il tuo problema ma perchè hai dimostrato a te stesso e a tutti i lettori del blog che con arduino ci vuole solo un po di pasenza.

      Ti va di pubblicare le tue modifiche per aiutare anche gli altri?

      Mauro

    • Michelangelo il 10 Giugno 2012 alle 23:34
    • Rispondi

    Ciao Mauro, complimenti davvero per il lavoro che stai facendo!
    Volevo chiederti una cosa, in che modo il pc riconosce il segnale del nunchuck?
    se voglio usarlo ad per un gioco, invia segnali tipo “w – avanti” “s – indietro” “a – sinistra” ecc ecc??

    Vorrei collegarlo per un applicazione 3d che sto creando (con Unity 3D) e mi servirebbe appunto potersi muovere con il movimento del nunchuck e guardarsi in torno con la manopola…non so se ho reso il concetto, spero di si e spero che mi illuminerai 😀

    1. Ciao Michelangelo,
      il tuo progetto è interessante e se quando lo avrai ultimato vorrai pubblicarlo e condividerlo sarò contento di offrirti questa opportunità.
      Per la domanda che mi poni, il nunchuk puoi collegarlo ad Arduino e mediante comunicazione seriale leggere i valori del joystick, pulsanti ed accellerometro.

      Su come questo si possa ottenere ti consiglio di leggere i tutorial sul nunchuk che trovi nel mio sito.
      Se avrai bisogno di altre info, scrivimi.

      Mauro

        • Michelangelo il 11 Giugno 2012 alle 17:03
        • Rispondi

        Grazie mauro, sarò felice di esporre il lavoro finito appena avrò completato tutto 🙂
        ho seguito la guida Arduino e Nunchuck ma al momento non ho un adattatore per nunchuck e collego il tutto direttamente con i cavetti come in questa foto : http://postimage.org/image/yyxukd4rl/

        Premetto che il mio nunchuck non è originale (infatti il connettore e uguale al disegno di destra), quindi ho collegato il voltaggio e GND , ma non so dove collegare
        Clock e DATA nei pin 4 e 5 analog in.

        infine ho soltanto un ultima questione da chiarire, appena inserisco lo sketch in arduino non passa la veriifica e trova 43 errori:

        sketch_jun11b.cpp: In function ‘void nunchuck_init()’:
        sketch_jun11b:42: error: ‘class TwoWire’ has no member named ‘send’

        As of Arduino 1.0, the Wire.send() function was renamed to Wire.write() for consistency with other libraries.

        sketch_jun11b:43: error: ‘class TwoWire’ has no member named ‘send’

        As of Arduino 1.0, the Wire.send() function was renamed to Wire.write() for consistency with other libraries.

        sketch_jun11b.cpp: In function ‘void send_zero()’:
        sketch_jun11b:50: error: ‘class TwoWire’ has no member named ‘send’

        As of Arduino 1.0, the Wire.send() function was renamed to Wire.write() for consistency with other libraries.

        sketch_jun11b.cpp: In function ‘void loop()’:
        sketch_jun11b:68: error: ‘class TwoWire’ has no member named ‘receive’

        As of Arduino 1.0, the Wire.receive() function was renamed to Wire.read() for consistency with other libraries.

        grazie per la disponibilità mauro

        1. per l’IDE 1.0 consulta un articolo più recente, quello che stai seguendo è per l’IDE 0022, alcuni metodi sono stati sostituiti nella nuova versione della classe e se non hai voglia di correggerteli ad uno ad uno devi per forza prendere un articolo recente.

          Mauro

    • Michelangelo il 11 Giugno 2012 alle 17:37
    • Rispondi

    Mi autocorreggo, ho aggiornato wire.send e wire.write e lo script funziona alla perfezione , ho collegato i cavetti e ho aperto il monitor seriale, il risultato è questo : http://postimage.org/image/bi303p9c5/

    GRAZIE MAURO 🙂

    Ora l’unico problema è che non so come leggere i valori del joystick tramite comunicazione seriale.
    Puoi darmi una dritta? qui con me ancora per poco c’è un programmatore portoghese, magari mi faccio aiutare da lui se bisogna scrivere qualche codice perchè io non ci capisco niente.

    1. Li hai già sono X e Y, AccX, AccY e AccZ sono i valori dell’accellerometro e le altre due colonne sono i tasti C e Z.
      Se leggi le mie istruzioni sullo sketch impari anche a gestire questi valori.

      Mauro

        • Michelangelo il 11 Giugno 2012 alle 18:14
        • Rispondi

        nel secondo sketch (parte 3 del tutorial) usi le librerie servo ma a me non servono dato che vorrei solo far corrispondere il movimento del nunchuck ai tasti W – avanti, S – indietro ,A – sinistra, D – destra, e il joypad al movimento della visuale (per guardarsi intorno).
        come posso fare?
        grazie

          • Michelangelo il 11 Giugno 2012 alle 18:18
          • Rispondi

          un altra cosa, se ruoto il joypad i valori X e Y non cambiano, il valore resta su 174
          http://postimage.org/image/bi303p9c5/

          1. Controlla i collegamenti, anche io con un nunchuk non originale avevo gli stessi problemi.

            Alla fine ho acquistato un originale xchè funziona meglio, inoltre di contraffatti ce ne sono di troppi tipi per farci dei tutorial.

            Mauro

        1. La libreria servo puoi escluderla e modificare lo sketch seguendo la mia spiegazione per individuare quali linee eliminare.

          Mauro

            • Michelangelo il 11 Giugno 2012 alle 20:35

            devo collegare qualcos’altro all’arduino??

          1. Ciao, non so cosa tu abbia già collegato 🙂

    • Michelangelo il 12 Giugno 2012 alle 01:41
    • Rispondi

    ciao Mauro, ho collegato solo il nuchuck all’arduino e l’arduino l’ho collegato mediante uscita usb al pc, devo collegare altro?

    1. No, se il tuo obiettivo è solo interfacciare il nunchuk al pc, non devi connettere altro.

      Mauro

    • Michelangelo il 12 Giugno 2012 alle 11:22
    • Rispondi

    Ciao Mauro, niente da fare , i dati del nunchuck appaiono nel monitor seriale ma non sono riuscito a convertirli in modo tale da assegnare specifiche informazioni , quali movimento e rotazione della visuale.
    Come sempre ti ringrazio per le risposte e vorrei chiederti se hai qualche consiglio da darmi.

    Michelangelo

    1. Ciao,
      non so se posso aiutarti, ci provo.
      Se i segnali li vedi nel monitor seriale vuol dire che arduino li legge e te li passa al pc.
      Dal tuo programma dovrai leggere tali dati dalla seriale e usarli come desideri.

      Mauro

        • Michelangelo il 12 Giugno 2012 alle 11:49
        • Rispondi

        Grazie mauro, purtroppo non ho le conoscenze necessarie per creare uno script che soddisfi la mie necessità, di conseguenza credo che mio malgrado lascierò perdere questo aspetto, che anche se molto interessante purtroppo si discosta dalle mie possibilità.
        Se hai qualche consiglio da darmi ovviamente pendo dalle tue labbra 🙂

    • Michelangelo il 12 Giugno 2012 alle 12:05
    • Rispondi

    Mauro, posso copiare lo script nel fourm di arduino per chiedere a qualche anima pia qualche consiglio?
    Grazie

    • Emiliano il 5 Luglio 2012 alle 20:44
    • Rispondi

    Ciao Mauro, io ho un arduino mega 2560 e ho comprato dalla dfrobot l’adattatore per il nunchuck, ho collegato tutto come hai spiegato nella guida ma nel serial monitor mi stampa tutti zero. Qualche idea?

    Emiliano.

    1. Ciao Emiliano,
      non ho un arduino mega, tra qualche settimana conto di comprarne uno.

      Prova a verificare che le uscite analogiche siano corrispondenti a quelle dell’arduino uno, la maggior parte delle classi è scritta per la uno o simili.

      Probabilmente i pin analogici differiscono per indirizzamento (A0,A1,ecc…) o per posizione.

      Mauro

    2. Ciao Emiliano,
      ho fatto una rapida ricerca sul sito arduino.cc, per cui prendi con le dovute precauzioni ciò che ti dico.

      Nella reference guide della libreria Wire.h che lo sketch usa c’è scritto:

      This library allows you to communicate with I2C / TWI devices. On most Arduino boards, SDA (data line) is on analog input pin 4, and SCL (clock line) is on analog input pin 5. On the Arduino Mega, SDA is digital pin 20 and SCL is 21.

      Per cui i collegamenti che hai seguito non sono adatti alla mega devi connettere il data line al pin 20 e il click al 21 sulla mega 🙂

      Spero di esserti stato di aiuto.

        • Emiliano il 6 Luglio 2012 alle 12:14
        • Rispondi

        Ho collegato come hai detto tu ma non andava ancora ho passato l’alimentazione da 3,3 a 5v e ha cominciato a comunicare! Grazie mille e complimenti per il sito!

        1. Ottimo Emiliano, ma nel mio schema l’alimentazione non è collegata ai 5v?

          Mauro

    • Simone il 11 Settembre 2012 alle 14:10
    • Rispondi

    ciao mauro, appare anche a me lo stesso problema che riscontrava Michelangelo, date che lui lo ha corretto, come posso fare a risolverlo anche io? Grazie mille in anticipo, ciao!!

    Simone

    1. Ciao Simone,
      quale dei problemi che ho affrontato con Michelangelo hai anche tu?
      Tra le mie risposte non c’è nessuna che ti aiuti?
      Mauro

        • Simone il 12 Settembre 2012 alle 15:55
        • Rispondi

        sketch_sep12b.cpp: In function ‘void nunchuck_init()’:
        sketch_sep12b:42: error: ‘class TwoWire’ has no member named ‘send’

        Da Arduino 1.0, la funzione Wire.send() è stata rinominata Wire.write() per
        uniformità con le altre librerie.

        sketch_sep12b:43: error: ‘class TwoWire’ has no member named ‘send’

        Da Arduino 1.0, la funzione Wire.send() è stata rinominata Wire.write() per
        uniformità con le altre librerie.

        sketch_sep12b.cpp: In function ‘void send_zero()’:
        sketch_sep12b:50: error: ‘class TwoWire’ has no member named ‘send’

        Da Arduino 1.0, la funzione Wire.send() è stata rinominata Wire.write() per
        uniformità con le altre librerie.

        sketch_sep12b.cpp: In function ‘void loop()’:
        sketch_sep12b:68: error: ‘class TwoWire’ has no member named ‘receive’

        Da Arduino 1.0, la funzione Wire.receive() è stata rinominata Wire.read()
        per uniformità con le altre librerie.

        ———————————-

        questi sono gli errori che l’editor di Arduino riscontra nel codice.
        Siccome sono alle prime armi con Arduino chiedo a te, Mauro; di aiutarmi, per favore.
        Ti ringrazio per l’interessamento, ciao!!

        1. Ciao Simone,
          l’errore che incontri è dovuto alla versione dell’IDE arduino (1.0 in poi).
          Se compili con la 0022 non avrai problemi.

          In alternativa nel blog trovi altri articoli dedicati al nunchuk in cui ho cambiato lo sketch per renderlo compatibile con l’IDE 1.0, come ti dice alla seconda linea dell’errore:
          Da Arduino 1.0, la funzione Wire.send() è stata rinominata Wire.write() per
          uniformità con le altre librerie.

          Se non sai fare da solo la modifica cerca nel blog l’articolo in cui indico tutti i cambiamenti da fare 🙂

          Mauro

            • Simone il 13 Settembre 2012 alle 12:37

            Ok, grazie mille Mauro, sei mitico!!

            • Valerio il 3 Novembre 2012 alle 00:24

            Non trovo il post relativo alle modifiche da apportare al codice…
            potreste gentilmente inserire un link qui! Grazie!

          1. Ciao Valerio, cerca nunchuck nel blog, usa il campo di ricerca.

    • Paolo il 11 Ottobre 2012 alle 17:26
    • Rispondi

    Avevo collegato un nunchuck non originale ed il tuo sketch non funzionava, anche se con lo stesso controller altri sketch andavano, utilizzando invece un controller originale funziona perfettamente.
    Sostituendo poi solo i ‘Wire.send’ con ‘Wire.write’ ed i ‘Wire.receive’ con i ‘Wire.read’ compila con la 1.0.1.

    1. Ottimo Paolo,
      quindi nel codice cambiando i metodi come scrivi tu si possono utilizzare anche nunchuk non originali?

      Mauro

    • Valerio il 2 Novembre 2012 alle 14:13
    • Rispondi

    Ciao! Utilizzo l’ide 1.0.1 e non riesco a modificare questo sketch a seguito degli errori che mi restituisce…
    Potete aiutarmi?

    Ecco gli errori:

    sketch_nov02a.cpp: In function ‘void nunchuck_init()’:
    sketch_nov02a:42: error: ‘class TwoWire’ has no member named ‘send’

    Da Arduino 1.0, la funzione Wire.send() è stata rinominata Wire.write() per
    uniformità con le altre librerie.

    sketch_nov02a:43: error: ‘class TwoWire’ has no member named ‘send’

    Da Arduino 1.0, la funzione Wire.send() è stata rinominata Wire.write() per
    uniformità con le altre librerie.

    sketch_nov02a.cpp: In function ‘void send_zero()’:
    sketch_nov02a:50: error: ‘class TwoWire’ has no member named ‘send’

    Da Arduino 1.0, la funzione Wire.send() è stata rinominata Wire.write() per
    uniformità con le altre librerie.

    sketch_nov02a.cpp: In function ‘void loop()’:
    sketch_nov02a:68: error: ‘class TwoWire’ has no member named ‘receive’

    Da Arduino 1.0, la funzione Wire.receive() è stata rinominata Wire.read()
    per uniformità con le altre librerie.

    Grazie per l’aiuto! 🙂

    1. Ciao Valerio,
      l’errore che ricevi é perché la libreria TwoWire con l’IDE 1.0 é cambiata.
      Puoi utilizzare la versione 0022 dell’IDE o modificare il codice sostituendo il metodo send con il metodo wire come indicato nell’errore.

      Nel blog puoi trovare qualche altro esempio in cui io ho già fatto quelle modifiche.

      Mauro

    • Francesco il 21 Novembre 2012 alle 20:06
    • Rispondi

    Ciao Mauro,
    innanzitutto complimenti per l’articolo e per il blog intero, che trovo molto interessante. Ho provato ad utilizzare questo tuo sketch per capire come utilizzare la comunicazione I2C, e mi è stato molto utile. Tuttavia non riesco a capire a che funzione hanno le righe di codice che vanno da 105 a 122…potresti aiutarmi?
    Grazie

    1. Ciao Francesco,
      mi fa piacere che tu voglia approfondire il funzionamento dello script.
      Inizia osservando le linee 068-071 il ciclo while legge i valori provenienti dalla classe nunchuk e li assegna alla variabile outbuf con indice da 0 a 5, le linee dalla analizzano quel buffer e in funzione dei valori letti imposta i valori che poi printerai dalla 124 in poi.

      Se vuoi approfondire cosa sia contenuto nella variabile outbuf puoi mettere delle linee print seriali con cui inviare al monitor seriale quei valori.

      Mauro

        • Francesco il 22 Novembre 2012 alle 17:37
        • Rispondi

        TI ringrazio per la risposta, purtroppo però credo di essermi spiegato male, quindi hai risposto solo in parte al mio dubbio. Provo a spiegare meglio quello che non ho capito, e ti chiedo di scusarmi se dirò delle castronerie, ma non sono molto preparato per quanto riguarda l’informatica e l’elettronica.
        Prendiamo come esempio le righe 109-110. Se non ho capito male, quell’istruzione prende il valore contenuto in outbuf corrispondente all’indice 5 e lo divide per 2^2, ossia 4. Se il risultato di questa operazione è dispari al valore accel_x_axis viene sommato un 2. Perché si esegue questa serie di operazioni? Inoltre, se non ci fossero queste righe, che valori restituirebbe l’accelerometro?
        Grazie ancora

    • Daniele il 7 Gennaio 2013 alle 00:27
    • Rispondi

    Ciao e complimenti, sto imparando tantissimo grazie al tuo sito.
    Ho un problema con lo schetch, non risco a leggere i valori dal nunchuck nel senso che mi dà solo zeri in risposta.
    Ho provato con due diversi nunchuck (non originali), sia con adattatore autocostruito che con i fili collegati direttamnte ai connettori ma il risultato non cambia…..
    la mia versione è arduino uno rev 3
    Per quato attiene al software ho sostituito a wire.send -> wire.write
    ed al posto di wire.receive –> wire.read
    devo fare altro???

    Grazie mille
    Daniele

    1. Ciao Daniele,
      anche io ho provato dei nunchuck non ufficiali senza riuscire a ottenere valori, tutti 0.
      Poi ho provato con l’originale et voilá tutto ok.
      Penso che i nunchuck non originali abbiano dei livelli di segnale diversi, non percepibili da arduino.

      Mauro

        • Daniele il 7 Gennaio 2013 alle 08:54
        • Rispondi

        Ok, grazie per la risposta.
        In ogni caso ho trovato, grazie anche alle indicazioni di cui sopra, ho trovato questo topic:

        http://arduino.cc/forum/index.php/topic,36533.0.html

        Posto il link perché potrebbe essere utile .
        Non appena posso lo proverò, per adesso ho un pò di impegni.

        Grazie e rinnovo i complimenti.
        Daniele

    • Pasquale_xyz il 6 Giugno 2013 alle 09:34
    • Rispondi

    Ciao Mauro,
    vorrei chiederti un consiglio.
    vorrei realizzare un progetto in cui mi servirebbe calcolare la posizione di un oggetto in movimento da un punto zero ad un punto x
    (simil cinematica) quindi dovrei interfacciare l’ arduino con dei sensori di posizione che mi diano la posizione in coordinate (xyz) ( ancora piu figo se mi da anche il “roll” e il “pitch”)
    sono indeciso tra un accelerometro o un nunchuck (ma questo ha un suo peso ed è abbastanza ingrombante).
    quello che vorrei fare io è mettere questi accelerometri su un polsino in modo da avere l’output della mano nello spazio…..mi spiego : quando una mano afferra un oggetto compie un movimento simil parabolico, dato un obbiettivo da “afferrare” e un punto di partenza prestabilito vorrei ottenere le informazioni nello spazio del movimento della mano.
    ho visto progetti con la wii nunchuck
    i problemi sono 2 :
    1 il nunchuck è un po ingombrante da mettere su un polsino( ed ha un suo peso)
    2 manca il movimento da vicino a lontano e viceversa…. cioè fa tutti i movimenti ma intorno ad un punto fermo …
    basta un solo accelerometro x quello che vorrei fare io? o devo vedere qualche altro sensore di posizione piu dettagliato….

    1. Ciao Pasquale,
      spero di aver interpretato in modo corretto quanto mi scrivi.
      L’idea del nunchuk è molto buona anche xchè ha al suo interno già un accellerometro a 3 assi e costa poco.
      Per l’ingombro puoi provare a smontare un nunchuk l’elettronica è molto più piccola dell’involucro, sul mio sito c’è anche una foto simil radiografia del nunchuck.

      Per gli altri movimenti non ho capito cosa vuoi rilevare.

      Mauro

    • Giacomo il 2 Marzo 2014 alle 10:58
    • Rispondi

    Ciao Mauro, complimenti per l’articolo mi è stato molto d’aiuto grazie. Avrei una domanda da farti: nel loop a cosa serve la funzione send_zero()? Inviando 0x00 al nunchuck lui capisce che i 6 bytes sono stati ricevuti correttamente? Ho visto che senza quella send_zero(), i valori che leggo sono “sballati”. Grazie in anticipo!

    1. Ciao Giacomo,
      inviare un segnale come quello generato dalla send_zero() ti permette di inizializzare la comunicazione con il nunchuck e rende stabili i valori letti.

        • Giacomo il 4 Marzo 2014 alle 21:34
        • Rispondi

        Perfetto, grazie mille per l’aiuto e soprattutto per tutto il lavoro che hai fatto e che stai facendo!

    • lorenzo il 16 Giugno 2014 alle 11:07
    • Rispondi

    chiedo scusa per la domanda un poco banale… ma quanti servo si possono comandare con un nunchuck?
    grazie

    1. Ciao Lorenzo,
      i servo li comanda arduino col le uscite PWM, quindi dipende dal tipo di scheda che hai.
      Il nunchuck è la parte sensori.

    • lorenzo il 17 Giugno 2014 alle 22:34
    • Rispondi

    ho una UNO….

    1. Ciao Lorenzo, sull’Arduino uno hai 6 PWM che puoi sfruttare per controllare altrettanti servo.

    • lorenzo il 18 Giugno 2014 alle 15:28
    • Rispondi

    ok grazie!

    • Angelo il 13 Luglio 2014 alle 23:23
    • Rispondi

    Ciao Mauro intanto complimenti per l’articolo.
    sto provando a replicare il tuo esempio sono finora riuscito a sistemare e caricare il codice in arduino ho collegato il nunchuck non originale tramite apposito adattatore seguendo lo schema da te disegnato, ho aperto il monitor seriale vedi i valori aggiornarsi di continuo ma sempre uguali, nel senso che pur muovendo il nunchuck non cambiano vorrei capire dove è l’errore.
    inoltre vorrei sapere poi come collegare i servo ad arduino in modo da poter applicare praticamente il tutto.

    1. Ciao Angelo, prima devi risolvere il problema dei valori identici, da come lo descrivi é un problema hardware: o i collegamenti errati o il nunchuck difettoso o non originale.

        • Angelo il 14 Luglio 2014 alle 17:34
        • Rispondi

        OK Mauro questa sera riprovo a fare i collegamenti potresti, per favore se non ti scoccia ovviamente, postare un immagine su come collegare arduino alla breadboard?

    • Angelo il 14 Luglio 2014 alle 21:48
    • Rispondi

    Ciao Mauro .
    intanto continuo con le prove ho ricontrollato il collegamento sembra che abbia fatto tutto come da immagine sopra.
    ho provato a scollegare l’adattatore nunchack e ho lanciato il monitor seriale.

    sui vari assi avevo tutti 0 poi ho collegato l’adattatore nunchack alla breadbord e gli assi hanno preso il valore x255 y255 accx 258 accy 258 ma se muovo nunchack non succede nulla sto impazzendo.
    ti linko alcune immagini sulla mia pagina fb.

    https://www.facebook.com/photo.php?fbid=10202620176920807&set=a.10202620175120762.1073741839.1088872279&type=3&theater

    Ps ti ho inviato richiesta d’amizia da fb Angelo Maisto sono io .

    • Angelo il 16 Luglio 2014 alle 09:51
    • Rispondi

    Caio Mauro.
    Volevo informati che finalmente, dopo un po di sbattimento, sono riuscito a risolvere il problema.
    L’inghippo era nel codice, che per il nunchuck cinese, farlocco o di altro brand che non sia originale Nintendo e diverso, mentre collegamenti hardwear erano corretti.
    pubblichero tra un po il video sulla mia pagina FB .

    1. Ottimo Angelo, se mi mandi il link e delle foto magari scrivo un articolo per tutti quelli che si ritrovano con il tuo stesso problema.

    • Salvo il 26 Ottobre 2015 alle 17:07
    • Rispondi

    Ciao Mauro,innanzitutto complimenti,sei chiarissimo nelle spiegazioni.
    Vorrei realizzare il codice che mi permetta di controllare il mouse con il nunchuc,usando: l’ analogico e i tasti Z e C ,rispettivamente per il movimento del mouse,per il tasto destro e per il tasto sinistro.Mi potresti aiutare?
    Ho già fatto il collegamento del nunchuck con Arduino e ho già inserito il codice per visualizzare i valori nel monitor seriale.Mi manca l’ultimo step,cioè associare ad ogni valore il movimento del mouse.
    Sto usando Arduino uno,ma a breve comprerò Arduino Leonardo che mi servirà anche per altre realizzazioni.
    Posso farlo con entrambi?
    GRAZIE IN ANTICIPO

    1. Ciao Salvo,
      con Arduino Uno non ho mai provato, tuttavia non essendo riconosciuto dal computer come una periferica devi individuare un software da caricare lato computer che interpreti i dati che gli passi dalla seriale e sposti il puntatore.
      Con la Leonardo ho già scritto del codice in cui usavo un semplice joystick per controllare il puntatore del mouse, ti consiglio di leggerlo ed il passo ad unire i due è semplice.

        • Salvo il 26 Ottobre 2015 alle 17:44
        • Rispondi

        In quale parte del tuo corso posso trovare il codice che mi hai appena descritto?

        1. Ciao Salvo, devi cercarlo tra gli articoli sul blog, non ricordo a memoria tra oltre 500 articoli dedicati ad arduino.

            • Salvo il 27 Ottobre 2015 alle 13:23

            Ti ringrazio,mi sei stato di grande aiuto.
            Buon lavoro.
            Salvo

    • Michele il 23 Dicembre 2015 alle 10:17
    • Rispondi

    Buongiorno,
    Complimentoni per la guida, molto bella, ben fatta – chiedo un aiutino nel reperire la libreria , ho cercato ma è un pochino ostico.

    Grazie 1000 – Buone Feste –

    1. Ciao Michele,
      innanzitutto ti sconsiglio di inserire la tua email nei commenti se non gradisci che lo spam la invada vista le oltre 1000 scansioni di bot malevoli che ogni giorno cercano nel blog indirizzi email da intasare di spam.
      In secondo luogo preferisco condividere con tutti gli utenti i consigli e le richieste di uno perché a tutti possono servire.

      Purtroppo la libreria non la possiedo, almeno non aggiornata, puoi cercarla con google sono sicuro che qualcuno l’ha rilasciata libera per il download.

        • Michele il 23 Dicembre 2015 alle 12:48
        • Rispondi

        Ok,
        grazie, però come ti dicevo ho già provato a cercare su google ma l’esito è stato negativo, pensavo dal momento in cui hai inserito la libreria in questione all’interno del’algoritmo, tu potessi “aiutarmi” indicandomi magari un link da dove poterla scaricare.

        Ti ringrazio.

        1. Ciao Michele,
          non comprendendo quale libreria ti occorre ho controllato nell’articolo cercando di comprendere meglio la tua richiesta ed in questo articolo uso librerie già presenti nell’IDE arduino al momento del download.

    • Matteo il 21 Aprile 2018 alle 10:30
    • Rispondi

    A me quando inclino il nunchuck a sinistra il servo gira a destra

    1. Ciao Matteo,
      puoi dirgli tu da codice come lavorare.

  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

Il tuo indirizzo email non sarà pubblicato.

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