Sommaire |
Contrôle d'un bras robotisé par un nunchuk.
On contrôle deux servomoteurs avec un nunchuk, tout cela piloté par la carte arduino.
Principe de fonctionnement
Quand on bouge la nunchuk de haut en bas (avec le poignet), le servomoteur qui est collé à la paille se met en action. Quand on bouge la nunchuk sur le même axe (avec le poignet, comme si on vissait), le servomoteur à la base se met à pivoter.
La photo qui suit nous montre à quoi correspond chaque broche du câble Nunchuck Wii.
#include <Servo.h>; #include <Wire.h>; // Doit être ajusté en fonction de chaque nunchuck #define ZEROX 530 #define ZEROY 530 #define ZEROZ 530 // adresse I2C du nunchuck #define WII_NUNCHUK_I2C_ADDRESS 0x52 // définition d'une variable Servo Servo servomoteur1, servomoteur2; // définition d'une variable counter int counter; int pos = 0; // définition d'un tableau de données uint8_t data[6]; void setup() { // on attache le servomoteur à la pin 11 (PWM) servomoteur1.attach(9); servomoteur2.attach(8); // 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(); if(counter >= 5) { // on extrait les données // dans mon exemple 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); // on limite la valeur entre -180 et 180 int value = constrain(accelY, -180, 180); // on mappe cette valeur pour le servomoteur soit entre 0 et 180 value = map(value, -180, 180, 0, 180); // on limite la valeur entre -180 et 180 int value2 = constrain(accelX, -180, 180); // on mappe cette valeur pour le servomoteur soit entre 0 et 180 value2 = map(value2, -180, 180, 0, 180); // on écrit sur le servomoteur la valeur servomoteur1.write(value); // controle le servomoteur avec l'axe Y servomoteur2.write(value2); // controle le servomoteur avec l'axe X // un petit delai pour pas saturer le servomoteur delay(100); } }
chercher ici : http://wikidebrouillard.org/index.php/Catégorie:Arduino
quelles peuvent être les applications technologique de ce montage, ou est-ce qu'on retrouve des programme qui y ressemble ?
© Graphisme : Les Petits Débrouillards Grand Ouest (Patrice Guinche - Jessica Romero) | Développement web : Libre Informatique