Bonjour,
J'essaye de commander à distance un bras robotisé grâce à un nunchuk de wii. J'ai choisi d'utiliser pour cela deux cartes arduino, une relier au nunchuk qui doit lire les valeurs de l'accéléromètre du nunchuk et les envoyer à l'autre par l'intermédiaire d'un module xbee sur chaque carte, la seconde carte doit lire les valeurs envoyées par la première pour contrôler 3 servomoteur. Chaque servomoteur lisant les valeurs d'un seul axe de l'accéléromètre.
Pour l'instant je suis parvenu à contrôler un seul servo car j'arrive à envoyer les valeurs d'un seul axe. Ca se complique quand je veux envoyer les 3 valeurs différentes car il faut les séparer à l'arrivée.

Voici mon code :

Carte n°1 avec le nunchuck et le module xbee:
Code:
#include <Wire.h>

// Doit être ajusté en fonction de chaque nunchuck
#define ZEROX 512  
#define ZEROY 512
#define ZEROZ 512

// adresse I2C du nunchuck
#define WII_NUNCHUK_I2C_ADDRESS 0x52

int lastValue = 0;

// définition d'une variable counter
int counter;
int value1;

// définition d'un tableau de données
uint8_t data[6];

void setup() 
{ 
  Serial.begin(9600);
  // initialisation du nunchuck
  Wire.begin();

  Wire.beginTransmission(WII_NUNCHUK_I2C_ADDRESS);
  Wire.write(0xF0);
  Wire.write(0x55);
  Wire.endTransmission();

  Wire.beginTransmission(WII_NUNCHUK_I2C_ADDRESS);
  Wire.write(0xFB);
  Wire.write(0x00);
  Wire.endTransmission();
} 

void loop() 
{ 
    // on demande 6 octets au nunchuck
    Wire.requestFrom(WII_NUNCHUK_I2C_ADDRESS, 6);

    counter = 0;
    // tant qu'il y a des données
    while(Wire.available())
    {
      // on récupère les données
      data[counter++] = Wire.read();
    }

    // on réinitialise le nunchuck pour la prochaine demande
    Wire.beginTransmission(WII_NUNCHUK_I2C_ADDRESS);
    Wire.write(0x00);
    Wire.endTransmission();

      // on extrait les données
      // j'utilise uniquement les données d'accélération sur l'axe  Y 
      double accelX = ((data[2] << 2) + ((data[5] >> 2) & 0x03) - ZEROX);
      double accelY = ((data[3] << 2) + ((data[5] >> 4) & 0x03) - ZEROY);
      double accelZ = ((data[4] << 2) + ((data[5] >> 6) & 0x03) - ZEROZ);

      //On limite la valeur entre -180 et 180   
      int value1 = constrain(accelY, -180, 180);
      
      //Ensuite on la map entre 0 et 180 pour éliminer le signe - et pour être lu par le servo
      value1 = map(value1, -180, 180, 0, 180);

     //On envoie la valeur à l'autre carte seulement si elle est suffisamment différente de la précédente       
     if( abs(value1 - lastValue) > 5){
     Serial.println(value1);
     lastValue = value1;
     
    }
}
Carte n°2 avec le servo et le module xbee:
Code:
#include <Servo.h>
Servo myservo;

int inByte = -1;
char inString[6];
int stringPos = 0;

void setup()
{
  myservo.attach(11);
  Serial.begin(9600);
}

void loop()
{
  inByte = Serial.read();
   
 //Si une donnée numérique est dispoible, la mémoriser
  
  if((inByte >= '0') && (inByte <= '9')){
    inString[stringPos] = inByte;
    stringPos ++;
  }

  //Si un caractère de fin de ligne est détecté, traiter la chaîne et écrire la valeur sur la sortie qui commande le servo puis remettre la chaîne à zero
  
     if(inByte == '\r'){
     int value = atoi(inString); //Convertit la chaîne en entier   

      myservo.write(value);
   
      //Remise à zéro de la chaîne de caractères 
      for (int c = 0; c < stringPos; c++){
      inString[c] = 0;
      }
    stringPos = 0;
  }

}
Merci d'avance pour votre aide !!