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:
Carte n°2 avec le servo 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; } }
Merci d'avance pour votre aide !!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; } }
-----