[Tuto] Nunchuck et servo moteur
Posté sur: août 22, 2013
Catégories: Arduino
Nunchuck et Servo moteur
Le but de ce montage est commander un servo moteur à l'aide d'un Nunchuck (Manette de Nintendo Wii). Cet exemple vous montrera comment intégrer d'autres objets à votre montage. Ceci est une adaptation du montage http://tutoarduino.com/comment-controler-un-servomoteur-avec-un-nunchuck-de-wii
Le programme du Arduino va lire la valeur de l'accélération sur l'axe Y du Nunchuck grâce à la liaison I2C et faire tourner le servo moteur en lui envoyant une commande angulaire grace à la librairie « Servo ».
La valeur des accélérations est codée sur 10 bits et coupée en 2 parties : les bits de 9 à 2 dans un octet et les bits 1 et 0 dans un autre octet.
#include
#include
// 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 ServonServo servomoteur;
// définition d'une variable counternint counter;
// définition d'un tableau de données
uint8_t data[6];
void setup()
{
// on attache le servomoteur à la pin 11 (PWM)
servomoteur.attach(11);
// 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);
double accelZ = ((data[4] << 2) + ((data[5] >>; 6) & 0x03) - ZEROZ);
// 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 écrit sur le servomoteur la valeur
servomoteur.write(value);
// un petit delai pour pas saturer le servomoteur
delay(100);
}
}
Il reste à brancher le Arduino pour compiler le programme et le téléverser.
Pour aller plus loin :
Il est possible de rendre autonome le montage en lui ajoutant un coupleur de pile. Il est aussi possible d'ajouter un second mouvement ou action (Allumer une LED par exemple) sur un autre axe. On peut modifier le programme pour utiliser les informations des joysticks.
Il reste à brancher le Arduino pour compiler le programme et le téléverser.
Pour aller plus loin :
Il est possible de rendre autonome le montage en lui ajoutant un coupleur de pile. Il est aussi possible d'ajouter un second mouvement ou action (Allumer une LED par exemple) sur un autre axe. On peut modifier le programme pour utiliser les informations des joysticks.
Commentaires
mai 21, 2014
mai 21, 2014
mai 21, 2014
mai 21, 2014
mai 21, 2014
mai 21, 2014
mai 20, 2014
mai 20, 2014
mai 20, 2014
mai 20, 2014
mai 20, 2014
mai 20, 2014
mai 20, 2014
mai 20, 2014
mai 20, 2014
mai 20, 2014
mai 20, 2014
mai 20, 2014
mai 19, 2014
mai 19, 2014
mai 18, 2014
mai 18, 2014
sept. 29, 2013
sept. 29, 2013
sept. 29, 2013
sept. 29, 2013
sept. 29, 2013
sept. 29, 2013
Connectez-vous pour commenter
Se connecter