Dans l’article précédent de cette série Un robot arduino, j’ai enfin réussi à calculer l’angle définissant la verticalité du NoRobo. Cet angle est stable et paraît juste. Mais le code est monstrueusement long (plus de 1500 lignes) et il est très difficile de s’y retrouver. En cherchant à comprendre la régulation PID – qui sera indispensable pour le NoRobo balance enfin – je suis tombée sur du code beaucoup plus simple. J’ai donc décidé de travailler tout de suite à la simplification du code.
Où est-ce que j’en suis ?
Depuis le dernier article, j’ai découpé au FabLab de Quimper des pièces pour maintenir correctement le gyroscope (essentiel), le module bluetooth et les piles. J’ai également décidé de ne mettre que 6 piles AA puisque j’en ai 12 et que je préfères avoir un jeu de rechange. J’ai également fait une petite cale pour que le robot soit bien vertical au moment du calibrage.
Avec 6 piles AA, le voltage fourni aux moteurs est plus faible (de l’ordre de 9V au lieu de 12). Les moteurs tournent plus lentement. Mais l’intervalle de temps entre deux mesures d’angle n’est pas affecté : mon angle est stable (je regarde le deuxième angle après #FIL, l’angle en Y filtré, de l’ordre de -0.43°) :
Pour que le NoRobo aille un peu plus vite lorsqu’il n’a que 6 piles au lieu de 9, il me suffit de modifier la ligne 804 de NoRobo-Gyro-2016-04-15B.ino et passer MAX_POWER à 255 au lieu de 150.
Simplification du code
En partant du code de la Maman Geek (ici) et du code MPU6050.ino (ici) qui sert d’exemple pour la librairie KalmanFilter (que je n’utilise pas), j’ai créé un sketch propre, qui n’utilise que 234 lignes pour lire et convertir correctement les données issues du gyroscope MPU-6050.
Le sketch Gyro-2016-04-24A.ino n’utilise que la librairie wire.h, indispensable pour lire les données du gyroscope en I2C.
Mais attention, le sketch I2C.ino créé comme exemple pour la librairie KalmanFilter doit impérativement être présente dans le répertoire du sketch Gyro…ino. On trouvera les deux sketch dans ce répertoire sur GitHub.
Introduire ce code dans le code du gyrobo
Je modifie le code (NoRobo-Gyro-2016-04-15B.ino, qui devient NoRobo-Gyro-2016-04-24A.ino ) :
- introduction du code de Gyro-2016-04-24A.ino
- ajout de I2C.ino dans le répertoire
- MAX_POWER passé à 255 (à cause des piles qui fournissent moins de tension)
Et tout va bien, le délai entre deux mesures n’a pas changé (toujours autour de 0.015 seconde) et l’angle du robot, qui n’a pas bougé est resté stable vers 5.6°.
Vérifications
Il faut vérifier que le NoRobo fonctionne correctement comme une voiture télécommandée à trois roues. Je le déconnecte du port USB de mon ordinateur et je reconnecte les broches RX et TX au module bluetooth.
Ca fonctionne, mais il est clair qu’il va falloir que je mettes plus de piles, ou une batterie de 12 V pour que ce robot fonctionne avec un peu de vivacité…
Le code à ce stade est NoRobo-Gyro-2016-04-24A.ino. Attention de ne pas oublier de placer I2C.ino dans le même répertoire. On les trouve ici sur GitHub.
Et maintenant ?
Mon code est infiniment plus simple, mais le robot ne se balance toujours pas…. A suivre dans cette série Un robot arduino !
Bonsoir, Merci beaucoup pour toutes vos explications détaillées, et qui de plus est sont en français. Avec un Arduino, je voudrais utiliser ce module GY-521 MPU6050 pour faire un niveau Av/Ar – Ga/Dr (Roll – Pitch) pour un camping car. Pour l’affichage, c’est OK. De ce que j’ai cru comprendre, il y a une phase d’auto étalonnage à faire à chaque mise en route pour obtenir des valeurs stables à l’immobilité. Il n’y aurait donc pas moyen de définir une fois pour toute quelles sont les valeurs de référence pour être à l’horizontal ? Je n’ai pas bien compris cette… Lire la suite »