Partage
  • Partager sur Facebook
  • Partager sur Twitter

Branchement nunchuck wii sur une arduino uno

Sujet résolu
    28 août 2012 à 14:34:05

    Bonjour à tous,
    je souhaiterais brancher un nunchuk wii sur mon arduino uno, j'ai utiliser se tuto (à la partie "Roby avec un Nunchuk, facile !") mais sa ne marche pas (j'ai pas l'adaptateur j'ai fait sa maison ;) ).
    Mais c'est la que je me dit :
    Mais comment est allimenter se bon vieu nunchuk?

    Mais nul par voyon.


    Et donc j'ai regarder cette viedo, et le nunchuk et brancher sur le + et le - et sur deux broche analogique (moi je le brancher sur quatre broche analogique), mais dans la video la personne ne dit pas quelle sortie du nunchuk doit etre brancher à quelle broche de l'arduino et c'est pour sa que je fais appelle à vous.

    Infos complémentaires : le nunchuk est un bus I2C (perso je ne sais pas ce que c'est :p ).
    Code :
    #include <Wire.h>
    #include "WiiChuck.h"
    
    WiiChuck chuck = WiiChuck();
    
    void setup()
    {
      Serial.begin(9600);
      pinMode(13, OUTPUT);
      digitalWrite(13, HIGH);
      Serial.print("1");
      chuck.begin();
      Serial.print("2");
    }
    
    void loop()
    {
      chuck.update(); // on actualise les données du nunchuk
      
      if(chuck.readJoyX() < -50) // gauche
        Serial.print("gauche");
      else if(chuck.readJoyX() > 50) //droite
        Serial.print("droite");
      else if(chuck.readJoyY() > 50) //haut
        Serial.print("haut");
      else if(chuck.readJoyY() < 50) //bas
        Serial.print("bas");
      
      if(chuck.zPressed())
      {
        Serial.print("z");
        digitalWrite(13, LOW);
      }
      if(chuck.cPressed())
      {
        Serial.print("c");
        digitalWrite(13, HIGH);
      }
    }
    


    WiiChuck :
    #ifndef WiiChuck_h
    #define WiiChuck_h
    
    
    #include "Arduino.h"
    #include <Wire.h>
    #include <math.h>
    
    
    // these may need to be adjusted for each nunchuck for calibration
    #define ZEROX 510  
    #define ZEROY 490
    #define ZEROZ 460
    #define RADIUS 210  // probably pretty universal
    
    #define DEFAULT_ZERO_JOY_X 124
    #define DEFAULT_ZERO_JOY_Y 132
    
    
    
    class WiiChuck {
        private:
            uint8_t cnt;
            uint8_t status[6];		// array to store wiichuck output
            uint8_t averageCounter;
            //int accelArray[3][AVERAGE_N];  // X,Y,Z
            int i;
            int total;
            uint8_t zeroJoyX;   // these are about where mine are
            uint8_t zeroJoyY; // use calibrateJoy when the stick is at zero to correct
            int lastJoyX;
            int lastJoyY;
            int angles[3];
    
            bool lastZ, lastC;
    
    
        public:
    
            uint8_t joyX;
            uint8_t joyY;
            bool buttonZ;
            bool buttonC;
            void begin() 
            {
                Wire.begin();
                cnt = 0;
                averageCounter = 0;
                // instead of the common 0x40 -> 0x00 initialization, we
                // use 0xF0 -> 0x55 followed by 0xFB -> 0x00.
                // this lets us use 3rd party nunchucks (like cheap $4 ebay ones)
                // while still letting us use official oness.
                // only side effect is that we no longer need to decode bytes in _nunchuk_decode_byte
                // see http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1264805255
                //  
                Wire.beginTransmission(0x52);	// device address
                Wire.write(0xF0);
                Wire.write(0x55);
                Wire.endTransmission();
                delay(1);
                Wire.beginTransmission(0x52);
                Wire.write(0xFB);
    
                Wire.write(0x01);
                Wire.write((uint8_t)0x00);
    
                Wire.endTransmission();
                update();            
                for (i = 0; i<3;i++) {
                    angles[i] = 0;
                }
                zeroJoyX = DEFAULT_ZERO_JOY_X;
                zeroJoyY = DEFAULT_ZERO_JOY_Y;
            }
    
    
            void calibrateJoy() {
                zeroJoyX = joyX;
                zeroJoyY = joyY;
            }
    
            void update() {
    
                Wire.requestFrom (0x52, 6);	// request data from nunchuck
                while (Wire.available ()) {
                    // receive byte as an integer
                    status[cnt] = _nunchuk_decode_byte (Wire.read()); //
                    cnt++;
                }
                if (cnt > 5) {
                    lastZ = buttonZ;
                    lastC = buttonC;
                    lastJoyX = readJoyX();
                    lastJoyY = readJoyY();
                    //averageCounter ++;
                    //if (averageCounter >= AVERAGE_N)
                    //    averageCounter = 0;
    
                    cnt = 0;
                    joyX = (status[0]);
                    joyY = (status[1]);
                    for (i = 0; i < 3; i++) 
                        //accelArray[i][averageCounter] = ((int)status[i+2] << 2) + ((status[5] & (B00000011 << ((i+1)*2) ) >> ((i+1)*2))); 
                        angles[i] = (status[i+2] << 2) + ((status[5] & (B00000011 << ((i+1)*2) ) >> ((i+1)*2))); 
    
                    //accelYArray[averageCounter] = ((int)status[3] << 2) + ((status[5] & B00110000) >> 4); 
                    //accelZArray[averageCounter] = ((int)status[4] << 2) + ((status[5] & B11000000) >> 6); 
    
                    buttonZ = !( status[5] & B00000001);
                    buttonC = !((status[5] & B00000010) >> 1);
                    _send_zero(); // send the request for next bytes
    
                }
            }
    
    
        // UNCOMMENT FOR DEBUGGING
        //byte * getStatus() {
        //    return status;
        //}
    
        float readAccelX() {
           // total = 0; // accelArray[xyz][averageCounter] * FAST_WEIGHT;
            return (float)angles[0] - ZEROX;
        }
        float readAccelY() {
            // total = 0; // accelArray[xyz][averageCounter] * FAST_WEIGHT;
            return (float)angles[1] - ZEROY;
        }
        float readAccelZ() {
            // total = 0; // accelArray[xyz][averageCounter] * FAST_WEIGHT;
            return (float)angles[2] - ZEROZ;
        }
    
        bool zPressed() {
            return (buttonZ && ! lastZ);
        }
        bool cPressed() {
            return (buttonC && ! lastC);
        }
    
        // for using the joystick like a directional button
        bool rightJoy(int thresh=60) {
            return (readJoyX() > thresh and lastJoyX <= thresh);
        }
    
        // for using the joystick like a directional button
        bool leftJoy(int thresh=60) {
            return (readJoyX() < -thresh and lastJoyX >= -thresh);
        }
    
    
        int readJoyX() {
            return (int) joyX - zeroJoyX;
        }
    
        int readJoyY() {
            return (int)joyY - zeroJoyY;
        }
    
    
        // R, the radius, generally hovers around 210 (at least it does with mine)
       // int R() {
       //     return sqrt(readAccelX() * readAccelX() +readAccelY() * readAccelY() + readAccelZ() * readAccelZ());  
       // }
    
    
        // returns roll degrees
        int readRoll() {
            return (int)(atan2(readAccelX(),readAccelZ())/ M_PI * 180.0);
        }
    
        // returns pitch in degrees
        int readPitch() {        
            return (int) (acos(readAccelY()/RADIUS)/ M_PI * 180.0);  // optionally swap 'RADIUS' for 'R()'
        }
    
        private:
            uint8_t _nunchuk_decode_byte (uint8_t x)
            {
                //decode is only necessary with certain initializations 
                //x = (x ^ 0x17) + 0x17;
                return x;
            }
    
            void _send_zero()
            {
                Wire.beginTransmission (0x52);	// transmit to device 0x52
                Wire.write ((uint8_t)0x00);		// sends one byte
                Wire.endTransmission ();	// stop transmitting
            }
    
    };
    
    
    #endif
    

    Dans le serial moniteur sa affiche que 1 donc la fonction chuck.begin() bloque (et c'est peu etre juste ma bibliothèque qui est bugger.

    Merci pour vos futures réponse et désoler pour les fautes d'orthographes.
    • Partager sur Facebook
    • Partager sur Twitter

    AtomicServer, un moyen rapide pour crée une application Client-Serveur (Topic OpenClassrooms).

      28 août 2012 à 14:46:13

      Salut !
      Tu peux commencer par lire ce sujet, il y a aura peut-être des choses qui t'intéresse.

      Ensuite, ce serait bien une petite photo ou un schéma correcte des branchements que tu as fait (ou alors une explication plus précise de "quoi est branché où" :) )

      Sinon oui le nunchuk est en I2C, si tu as une Arduino UNO ca veut dire qu'il faut utiliser les broches A4 et A5 pour utiliser l'I2C, et l'alimentation se fera part les broches +5V et GND
      • Partager sur Facebook
      • Partager sur Twitter

      Retrouvez moi sur mon blog et ma chaine Youtube !

        28 août 2012 à 14:52:31

        Merci mais cette page ne dit pas sur quelle broche de l'arduino brancher les pin du nunchuk SCL / GND / VCC / SDA.

        Dans la video cité dans le 1er post il dit : SDA : analog 4, SDL : analog 5, donc logiquement GND : le GND (le -) sur l'arduino et le VCC le 5V merci de confirmer parceque je ne voudrai pas niker mon nunchuk.
        • Partager sur Facebook
        • Partager sur Twitter

        AtomicServer, un moyen rapide pour crée une application Client-Serveur (Topic OpenClassrooms).

          28 août 2012 à 14:56:20

          Je trouve ça bizarre que, dans ton tuto, il branche toutes ces broches sur... des entrées analogiques de l'Arduino ?
          Bref, je vais essayer de t'aider, même si je n'ai jamais touché à une Arduino, et encore moins un Nunchunk (à part pour jouer).

          Tout d'abord, le plus important : le bus I2C.

          "Infos complémentaires : le nunchuk est un bus I2C"
          Faux, le nunchunk utilise le bus I2C.
          Je te conseille d'aller jeter un oeuil chez Mr Wikipedia parlant de l'I2C.
          A mon avis, tu devrais alimenter le Nunchuk avec le + et le - disponible.

          Ensuite, je pense qu'il doit y avoir au moins un bus I2C sur ton Arduino. Donc tu devrais avoir 2 pins appelées SDA et SCL.
          SDA (data sur la photo) est la ligne où transitera les informations.
          SCL (clk sur la photo) est la ligne où la clock sera générée (par l'Arduino).

          Il doit y avoir des capteurs à l'intérieur du Nunchuk qui récupèrent l'état des boutons, les valeurs analogiques du joystick en X et Y, et également les valeurs analogiques du gyroscope, qui renvoie des valeurs en X, Y et Z.
          Le tout est de savoir ce qu'il faut envoyer sur SDA pour récupérer ces valeurs.

          Mais je te conseillerais d'abord de te documenter sur le bus I2C, qui est assez simple à la compréhension.

          Petite info:
          Serial.begin(9600);
          

          Signifie que la clock générée sur SCL enverra des informations à 9600 bps (bauds par secondes).</span>
          Ramassis de bêtises :euh:


          En espérant t'avoir un peu aidé.
          Cordialement.
          • Partager sur Facebook
          • Partager sur Twitter
            28 août 2012 à 15:02:59

            Merci de ta réponse mais il n'y à pas de de pins appelées SDA et SCL.
            Mais le Serial.begin(9600) sa discute sur le port série en l’occurrence un port USB.

            EDIT :
            Broche nunchuk Broche arduino
            SDA analog4
            SCL analog 5
            GND GND
            VCC 3.3 V

            Pourquoi 3.3 V car c'est la tension la plus proche de la manette de wii (3 V) car le nunchuk est alimenter par cette mannette et celle-ci alimenter par 2 pile 1.5 V (soit 3 V).
            • Partager sur Facebook
            • Partager sur Twitter

            AtomicServer, un moyen rapide pour crée une application Client-Serveur (Topic OpenClassrooms).

              28 août 2012 à 15:38:30

              Comme j'ai dit dans mon premier message, chez Arduino Uno les pins de l'I2C sont sur A4 et A5. Ensuite avec ton schéma que tu fournis depuis l'autre site web il suffit de relier correctement les bonnes broches de l'un vers l'autre.

              @Zbeb : Le serial c'est pour afficher en debug les données sur la voie série, rien à voir avec l'I2C qui génère sa propre horloge pour envoyer les données...
              • Partager sur Facebook
              • Partager sur Twitter

              Retrouvez moi sur mon blog et ma chaine Youtube !

                28 août 2012 à 15:43:01

                ça m'apprendra à raconter des bêtises...
                J'ai tout mélangé :euh:
                Veuillez m'excuser.
                • Partager sur Facebook
                • Partager sur Twitter

                Branchement nunchuck wii sur une arduino uno

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown