Club robotique de Sophia-Antipolis

Accueil > POBOTpedia > Capteurs > Capteurs Wii > Gyroscope Wii Motion Plus

Gyroscope Wii Motion Plus

une centrale inertielle à moins de 50 euros

samedi 1er août 2009, par Julien H.

On va essayer d’utiliser un gyroscope. Pour se simplifier la vie, on va prendre le gyroscope contenu dans le Wii Motion Plus, un plug-in pour la manette Wiimote de la console de jeux Wii de Nintendo.

JPEG - 1.2 Mo
Wii Motion Plus

Il s’agit en fait de deux circuits : un gyroscope à 2 axes, IDG-600 de InvenSense pour les angles de tangage et de roulis (pitch and roll), et un gyroscope à 1 axe de X3500W de Epson Toyocom pour l’angle de lacet (yaw).

Voici déjà un aperçu de quoi on va parler ici : des chiffres, des équations et des courbes :)

PNG - 10.5 ko
Donnes brutes et calculées

Notre objectif est de déterminer les angles du capteur en intégrant la valeur retournée par le gyroscope.
On en saura alors un peu plus sur ces fameuses centrales inertielles et on pourra chercher notre objectif : mesurer le déplacement d’un robot mobile et non plus calculer des angles.

La formule d’intégration est la suivante :


A(n) = A(n-1) + Gyro * Temps(n,n-1)

Où A est la valeur de l’angle, Gyro la valeur du capteur et Temps le delta entre deux mesures. En effet, on réalise une intégration discrète entre deux valeurs lues successivement, en incrémentant la valeur précédente de l’angle A de la valeur courante fois le temps écoulé.

On réalise la capture sur une carte Arduino car elle est capable de communiquer sur un bus I2C avec le Wii Motion+ et on réalise les calculs et l’affichage sur une petite application graphique avec le logiciel Processing.

La communication avec le Wii Motion Plus vient d’un article (en anglais) d’un fan de la communauté Arduino.

Et pour en savoir plus sur ce capteur, une interview de l’équipe Nintendo.

La variation de temps entre deux mesures est très importante, car le capteur n’est pas parfait, il est très bruité et il varie dans le temps. Donc le premier travail est de mesurer le temps entre deux captures de valeur. Il est préférable de le mesurer plutôt que de l’estimer.

Voici ce qui est envoyé sur la liaison série :


19 245 1425 366

19 256 1427 361

19 255 1426 347

19 239 1432 345

19 274 1436 364

La première valeur est le temps, puis viennent les angles "yaw", "pitch" et "roll", soit "lacet", "tangage" et "roulis" en bon français.

Comme on le voit, ces valeurs qui correspondent à l’immobilité du capteur ne sont pas normalisées. On va donc faire un premier traitement pour visualiser correctement les valeurs en enlevant une valeur moyenne.


ValeurFiltrée = (ValeurBrute - MoyenneImmobile) ;

Où la MoyenneImmobile est donnée pour chaque axe et doit être calculée très précisément pour avoir un 0 au repos !

if (accu_mean < 50) {      
     accu_mean++;
     accuX +=  valuesX[width-1];
     accuY +=  valuesY[width-1];
     accuZ +=  valuesZ[width-1];
     return ;
}
if (accu_mean == 50) {
     accu_mean++;
     averageX = (int) accuX / 50;
     averageY = (int) accuY / 50;
     averageZ = (int) accuZ / 50;    
     println("Moyennes calculées : "+averageX+","+averageY+","+averageZ);
}

Ceci permet d’avoir 3 valeurs centrées autour de 0 quand le capteur est immobile.

Mais on voit dans la capture de la liaison série en début d’article que ces valeurs sont à revoir : les gyroscopes sont sensibles aux conditions (j’ai lu température, humidité mais je n’ai pas creusé). Bien entendu un étalonnage automatique serait préférable, par exemple sur les 100 premières valeurs reçues.

Voici ce qu’on obtient :

JPEG - 99.2 ko
Avant filtrage
JPEG - 71.7 ko
Après filtrage

Là encore j’ai adapté la valeur filtrée pour qu’elle soit plus facile à voir.


ValeurAffichée = (ValeurFiltrée / Ratio) + n*1024/4

Où Ratio est arbitraire (en fonction de la taille que je veux que ça prenne à l’écran), mais le même pour les 3 (dans les chronogrammes, Ratio = 30) et où n correspond à la ligne où je veux afficher chacun des angles (n=1, 2 ou 3).

 Traitement des valeurs

Au final, la valeur envoyée par le gyroscope est très grande. On applique la première formule mais en divisant l’incrément :


Angle = Angle + Gyro / 100 ; // à chaque réception

Ce qui nous donne 5000 points pour 360 degrés en angle de lacet !
On affiche tout ça dans une petite applet Processing afin de visualiser les angles en 3D, et voilà une vidéo de démonstration :

Le code :

Zip - 68.1 ko
Programme Arduino de test
Zip - 13.3 ko
Visualisation Processing

 Passage à la vitesse supérieure

Pour continuer nos tests, il est plus rapide de passer sous un outil de calcul comme un tableur Excel. On réalise donc avec notre outil de communication série (ici, Processing) une acquisition de valeurs successives provenant du gyroscope, et on va traiter les valeurs reçues.

Voici le sketch d’enregistrement dans un fichier CSV (comma separated values, valeurs séparées par des virgules) et le résultat.

Zip - 403.8 ko
Accelero Dump
sketch P5 pour stocker un fichier CSV (Excel) de valeurs reçues de l’Arduino.
Excel - 1.6 Mo
Valeurs et traitement numérique

Pour l’utiliser, il faut que votre Arduino (ou toute autre carte) envoie des valeurs sur la liaison série et qui se termine par un retour à la ligne (LF, \n, ASCII 10). Modifiez le numéro de votre port série dans le code Processing avant de lancer le programme. Lorsque vous avez suffisament de valeurs (variable "count" affichée dans la console), vous appuyez sur une touche du clavier et vous aurez alors un fichier "accelero.csv" dans le répertoire du sketch Arduino Dump.

Voici un premier résultat : l’algorithme décrit ci-dessus sous Excel

PNG - 4.4 ko

Nouvel algorithme : avec l’accéléromètre

Vos commentaires

  • Le 22 janvier 2015 à 09:24, par Remfink7 En réponse à : Gyroscope Wii Motion Plus

    Pourrai tu meut passer le programme du gyroscope pour un interface IHM pour mon projet de drone parrot, pour mon projet de Terminal !!
    merci d avance

    Répondre à ce message

  • Le 15 février 2010 à 13:16, par amenothep En réponse à : Gyroscope Wii Motion Plus

    Bonjour,

    je réfléchis à la faisabilité d’exploiter la wiimote avec ou sans motion + pour calculer la vitesse verticale d’un parapente.
    Ceci afin faire/compléter une appli pour iphone, android, windowsmobile... servant de variomètre.
    voir ce forum

    pense tu que c’est théoriquement faisable ?

    sinon que penses-tu de la solution avec un capteur de pression ? à ce sujet je n’arrive pas a trouver la tension que peut fournir une prise jack.

    merci

    • Le 15 février 2010 à 15:07, par Julien H. En réponse à : Gyroscope Wii Motion Plus

      Oui c’est faisable, c’est comme ça que certains font des centrales inertielles pour du modélisme.

    • Le 16 février 2010 à 15:13, par ArnaudCo En réponse à : Gyroscope Wii Motion Plus

      Parapentiste que je suis, je me suis déjà penché sur le probleme.

      Difficile avec un gyroscope de déterminer une vitesse, puisqu’il ne donne que des infos d’orientation.

      Imaginons un parachutiste, en chute libre à vitesse constante et sans aucune rotation de son corps. Là, le gyro t’indiqueras "rien ne bouge"... et pourtant !!!

      Avec un accelerometre, on aurait pu mesurer la norme de l’acceleration tout au long du saut, et déterminer la variation de la vitesse.

      De manière indirecte, l’accéléromètre mesurerait 10m/s² ( 1G de la gravité) avant le saut, 0G lors de l’impulsion, puis 1G a vitesse stabilisée. Évidement, il faudra soustraire 1G à chaque valeur. Ce qui donne une accélération de 0m/s² avant le sauf et a vitesse stabilisé, et -1G lors de l’impulsion. Ceci ne sera qu’une approximation car il faudrait que l’accéléromètre nous donne une vitesse moyenne entre deux mesures, et non pas une valeur instantanée... bref

      Pour estimer directement une vitesse verticale, il vaut mieux, comme tu le proposes, un capteur de pression. A l’ancienne !

      J’espere ne pas avoir été trop compliqué.

      a+

    • Le 3 mai 2012 à 14:25, par bencathy En réponse à : arduino uno gryro IDG500

      salut je suis novice dans la robotique je galere pas mal j’ai realiser quelque montage tres simple avec des servo moteur piloter par l’arduino !
      mais je suis stopper sur mon prochain projet
      en faite je veux brancher mon gyro IDG500 pour contreler un servo moteur qui me sevira a faire un plateforme de stabilisation !!
      bien comme je l’ai dit precedament je suis novice et le c et c++ je ne maitrise pas .
      voila donc sur mon gyro j’ai les borne XOUT/X4.5OUT/YOUT/Y4.5OUT/VREF/PTATS/AZ
      ET BIENSUR GDN
      pour gdn et vin ca coule de source
      pour ce qui du reste j’avou que ca me depasse :(
      c’est un 2axe mai je veu me servir d’un seul axe dans un premier temps donc comment brancher les borne sur mon arduino ??
      et le fil jaune du moteur ?
      et de plus comment faire le programme qui gere tout cela ?
      voila merci d’avance
      ne rigloler pas trop en me lisant faut bien debuter !!lool !!

    • Le 3 mai 2012 à 14:55, par Julien H. En réponse à : arduino uno gryro IDG500

      Bonjour.

      Votre gyroscope est analogique. Il se branche très simplement, par exemple en suivant l’article du site en lien ci-dessous qui montre que VCC (et pas VREF) se branche sur le 5 volts, le GND sur la masse, et XOUT ou YOUT sur une entrée analogique.

      Il y a même un code source pour Arduino. Pour la connexion du "fil jaune", lisez nos articles sur les servomoteurs et l’Arduino (débuter avec une carte Arduino).

      Bonne continuation et donnez-nous des nouvelles (même si votre projet a peu de rapport avec le Wii Motion Plus).

    • Le 4 mai 2012 à 02:21, par bencathy En réponse à : arduino uno gryro IDG500

      franchement waaouh merci vous ete vraiment cool de m’aider !!
      le lien est tres bien fait donc j’ai fait les branchement comme explique j’ai entre la base du programme qu’il donne !(cool ca avance)
      pour le servo j’ai brancher le + la masse puis le fil de commande sur le Y4.5out bonne chose deja le servo a une reation mais que des petite secouceset non le ratrapage de l’angle ??
      j’avou que pour ce soir je vai arreter je mis remetrai demain !
      petite question je doit utiliser un servo analogique ??
      voila merci encors

    • Le 4 mai 2012 à 13:51, par Julien H. En réponse à : arduino uno gryro IDG500

      Bonjour,

      Le servomoteur ne peut pas se connecter directement à l’accéléromètre : il faut le connecter à une carte programmable (tu as cité l’Arduino) et écrire un programme qui lira l’information (analogRead(0) par exemple) et qui fera bouger le servomoteur (servo.write(analogRead(0)) par exemple).

    • Le 4 mai 2012 à 17:52, par bencathy En réponse à : arduino uno gryro IDG500

      totu d’abort merci !!
      j’ai effectuer les branchement comme explique sur le lien pour ce qui ai du servo j’ai brancher la masse et le + normal et le fils de commande "jaune"
      sur le gyro sur Y out 4.5 ?
      j’ai entre le programme tel quel comme sur le lien !
      je voi bien une reaction sur le serial monito quand je bouge le gyro et cela une reaction sur le moteur mais juste des petit sur saut du servo et non la correction de l’assiette ?
      une petite question vue que le gyro est analogique mon servo doit aussi etre analogique ?
      car la pour le prototipage jutilise une servo d’une de mes voiture RC et vue qui est basique je ne pense pas qu’il soit analogique ?!
      le probleme du seul sur saut et non de la corection de l’inclinaison vien peut etre de la ou doit je iffiltrer un programme sulplementaire ?
      voila merci encor pour tout les renseignement je pense deja avoir fait un grand pas et ceci grace avous !!!!

    • Le 6 mai 2012 à 00:56, par bencathy En réponse à : arduino uno gryro IDG500

      int x, y ;

      void setup()


      Serial.begin(9600) ;

      void loop()


      x = analogRead(0) ;

      y = analogRead(1) ;

      Serial.print

      Serial.print(x, DEC) ;

      Serial.print(" ") ;

      Serial.println(y, DEC) ;

      delay(100) ;

      #include

      <Servo.h>

      Servo myservo ;

      myservo.write analogRead(0) ;

      voila ce que rentre comme programme et il ne passe pas :( la derniere ligne !
      encore une fois je me sens NUL
      HELP
      merci

    • Le 6 mai 2012 à 08:46, par Julien H. En réponse à : arduino uno gryro IDG500

      Comme dit plus haut, le servomoteur se branche sur l’Arduino et pas sur le gyro.

      Les servos de base en modélisme sont des servos analogiques. Ce sont les numériques qui sont plus rares. Mais de toute façon pas de différence pour ton programme.

    • Le 6 mai 2012 à 08:54, par Julien H. En réponse à : arduino uno gryro IDG500

      Ce programme est incomplet, il manque les accolades. De plus on n’écrit pas #include en milieu de la boucle... Il faut reprendre les bases de la programmation (il y a plein d’exemples pour celà) ou bien faire un projet plus simple.

      Procède par étape : fais bouger ton moteur sans le capteur avant d’essayer de faire fonctionner les deux ensembles. Reprends les exemples fournis avec le logiciel Arduino. Voici par exemple le code "Knob", considérant que la sortie du gyroscope est connecté sur ANALOG 0 et que le signal du servo est connecté sur DIGITAL 9 et que le capteur comme le servomoteur sont bien alimentés...


      // Controlling a servo position using a potentiometer (variable resistor)
      // by Michal Rinott

      <http://people.interaction-ivrea.it/...>

      #include <Servo.h>

      Servo myservo ; // create servo object to control a servo

      int potpin = 0 ; // analog pin used to connect the potentiometer
      int val ; // variable to read the value from the analog pin

      void setup()

      myservo.attach(9) ; // attaches the servo on pin 9 to the servo object

      void loop()

      val = analogRead(potpin) ; // reads the value of the potentiometer (value between 0 and 1023)
      val = map(val, 0, 1023, 0, 179) ; // scale it to use it with the servo (value between 0 and 180)
      myservo.write(val) ; // sets the servo position according to the scaled value
      delay(15) ; // waits for the servo to get there

      Fais le fonctionner (avec ou sans capteur, en utilisant un fil dans ANALOG 0 et en touchant alternativement la masse et la tension 5V et la tension 3.3 des connecteurs femelles de la carte (attention de ne pas mettre en contact la masse et le 5V).

    • Le 6 mai 2012 à 17:36, par bencathy En réponse à : arduino uno gryro IDG500

      bonjour,
      dsl pour le double message mais mon dernier post ne c’ete pas afficher !
      donc j’ai bien suiver vos conseil j’avais commencer par ca le programme Knob et sweep j’ai jouer un peut avec le delay puis les pin les angles ect..
      la je vien de faire comme vous n’avais dit et donc jouant avec la mass et le + en sortan de l’analog 0 puis les autre en le changant dans le programme.
      donc en faite j’arrive a obtenir le movement que je recherche manuellement...
      j’arrige a obtenir la reaction numerique du gyroscope...
      mais je n’arrive pas a joindre les 2.
      l’analogwrite...
      ce projet me tien a coeur et je c plus quoi faire.
      dsl pour tout les message en esperant pas vous embeter.
      merci encore

    • Le 7 mai 2012 à 09:00, par Julien H. En réponse à : arduino uno gryro IDG500

      En connectant le gyro dans ANALOG 0, vous devez obtenir une réaction du servomoteur proportionnelle.

      Nous continuons cette discussion dans un article dédié.

    Répondre à ce message

  • Le 15 juillet 2010 à 14:33, par Keuronde En réponse à : Gyroscope Wii Motion Plus

    Bonjour,

    J’envisage de me servir d’un gyroscope Wii motion plus pour connaitre le cap d’un robot (pour la coupe de France de robotique). A priori, je ne me servirais que d’un axe. Avec vos essais, pensez-vous qu’après 90 secondes d’intégration on peut encore avoir une précision de + ou - 8° ?

    • Le 15 juillet 2010 à 19:16, par Julien H. En réponse à : Gyroscope Wii Motion Plus

      Bonjour Keuronde ! Oui, pour moi il tient largement cette précision.

      On va vérifier ça asap.

    • Le 31 août 2010 à 23:39, par Keuronde En réponse à : Gyroscope Wii Motion Plus

      Bonjour Julien, bonjour Pobot,

      Après de premiers essais (Wii Motion Plus immobile) sur 90 secondes, j’observe une dérive de 1 degré pour le lacet et de 5 degrés sur les autres axes.
      Un rapport de 1 à 5 me semble un peu énorme...
      Mais j’imagine que la manette de Nintendo peut se servir de ses accéléromètres pour se recaler par rapport à la gravité pour le tangage et le roulis mais pas pour le lacet.
      Avez-vous un avis la-dessus ?
      L’erreur absolue me semble faible, mais je suppose qu’elle augmentera en fonction des rotations effectuées.

    • Le 1er septembre 2010 à 00:35, par Julien H. En réponse à : Gyroscope Wii Motion Plus

      Oui, il y a sans aucun doute une correction avec les accéléromètres.

      C’est normal que les erreurs soient différentes, les capteurs ne sont pas les mêmes sur tous les axes.

      Je suis pas sûr que l’erreur augmente, je n’ai jamais compris pourquoi elle ne s’équilibrait pas.

      On cherche des volontaires pour refaire ces articles (accéléro et gyroscope) en montrant plus de courbes et en cherchant plus de protocoles de test permettant de savoir comment utiliser au mieux ces données.

    • Le 1er septembre 2010 à 10:50, par ? En réponse à : Gyroscope Wii Motion Plus

      Je n’y avait pas trop réfléchi jusque là, mais je pense qu’une partie de l’erreur en statique provient d’un écart entre le zéro obtenu par moyennage et le zéro réel. (Une fois l’acquisition lancée, mon erreur évolue toujours dans le même sens). Je fais pourtant une moyenne sur 500 valeurs...

      Je veux bien décrire mes méthodes, mais elle ne seront axées que sur l’exploitation d’un axe du gyroscope. Cela ne m’empêche pas de faire des acquisitions et des courbes sur 3 axes ou autre si tu as des demandes particulières.

    • Le 1er septembre 2010 à 14:20, par Julien H. En réponse à : Gyroscope Wii Motion Plus

      On est quand même preneur :)

    • Le 28 juillet 2011 à 15:40, par bencathy En réponse à : Gyroscope arduino et servo

      bonjours je suis un novice sur le forum ainsi que en elec(dsl pour les questions betes)
      voila je suis sur le projet d’une camera gyroscopique pour installer sur un moto de piste.
      j’ai je pense compris tout les composant qu’il me fallait (ca fait quelque mois que je suis decu)
      voila probleme n1:comment raccorder ma platine gyroscope,acce 2axe sur le micro controleur arduino ?
      probleme n2 : comment raccorder mes 2servo moteur au micro controleur
      merci d’avance
      mike
      crashstunt hotmail.fr

    • Le 28 juillet 2011 à 23:31, par Julien H. En réponse à : Gyroscope arduino et servo

      Bonjour,

      Le Wii Motion Plus se connecte via deux fils sur analog 4 et analog 5, en utilisant le protocole I2C (appelé Wire dans Arduino).

      Les servomoteurs se connectent sur des pattes "digital" (en haut de la carte).

    Répondre à ce message

  • Le 3 août 2010 à 11:17, par Kastor En réponse à : Gyroscope Wii Motion Plus

    Bonjour,
    Apres lecture de differents forums, il est evoque le cryptage des informations des extension de la WII. La connexion d’une motion + et d’un nunchuk q un arduino necessite t’il un decryptage ?
    Une liaison a 100kHz est elle envisageable ?
    Merci !

    • Le 3 août 2010 à 18:52, par Julien H. En réponse à : Gyroscope Wii Motion Plus

      Il n’y a pas de cryptage : il faut juste connaitre la signification des valeurs.

      Par contre il y a-vait un problème pour connecter ensemble le nunchuck et le wii motion plus puisqu’ils ont la même adresse. Mais ce problème a été résolu (voir d’autres forums).

      Ce n’est plus notre problème puisque nous utilisons notre propre accéléromètre.

    Répondre à ce message

Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici
  • Ce formulaire accepte les raccourcis SPIP [->url] {{gras}} {italique} <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document