Ajouter un gyroscope à mon robot arduino

Ajouter un gyroscope à mon robot arduino

Cet article est le quatrième de la série . Le NoRobo fonctionne sur 3 roues mais mon objectif reste de le transformer en robot à balancier. Il va donc falloir qu’il utilise un autre capteur, un gyroscope, pour mesurer l’accélération et l’angle en x,y et z.

Je vais procéder en plusieurs étapes :

  1. comprendre comment fonctionne un gyroscope (un gy-521, équipé d’un mpu6050) seul avec un arduino ;
  2. comprendre le code lié au gyroscope dans le programme du balancing robot qui me sert d’inspiration ;
  3. intégrer le gyroscope à mon NoRobo à 3 roues.

Comment fonctionne un gyroscope

Présentation du gyro MPU-6050

Ma source principale d’information est le site arduino, ici, en anglais.

Le gyroscope que j’utilise est un « gy-521 », équipé d’un MPU-6050 (ici pour 2.29 € sur amazon.fr). Le MPU6050 est un circuit contenant deux « MEMS » (microsystème électromécanique – cf wikipedia). Ces deux MEMS ont deux fonctions distinctes :

  • un accéléromètre
  • un gyro

Les données sont calculées simultanément en x, y et z grâce à des convertisseurs 16-bits analogue à digital pour chaque canal.

Le capteur mesure également la température.

Le capteur communique avec l’arduino avec le protocole I2C.

Il existe aussi un autre circuit, le MPU-9150 qui combine le MPU-6050 avec un compas (un magnétomètre).

Premiers essais

Cablage Arduino uno et gyroscope gy-521

J’ai simplement connecté le gyro à un arduino uno pour voir les valeurs lues.

Le cablage est très simple : VCC — 5V Arduino, GND — GND Arduino, SCI — A5 Arduino et SDA — A4 Arduino.

Le schéma est également ici sur Fritzing.

Le code arduino vient d’ici, je l’ai pris tel quel et il fonctionne correctement puisqu’il affiche des valeurs différentes lorsque je bouge le gyro. Voici un exemple de ce qui s’affiche (j’ai changé la vitesse de la liaison série dans le code pour qu’elle soit 57600 bauds, comme la console série.

Les données du gyroscope sur la console

Donc le gyro fonctionne. Reste maintenant à comprendre…

comprendre le protocole I2C

Pour une fois, je trouve une source d’information en français ! Il s’agit d’un excellent article expliquant le fonctionnement d’un capteur de température sur arduino et le protocole I2C. On peut le lire et comprendre comment fonctionne le code de lecture de notre prototype gyro-arduino.

Pour l’instant je n’ai qu’un capteur connecté en I2C à l’arduino. Je n’ai donc pas besoin d’ajouter des résistances. Je connecte donc directement A4 de l’arduino à SDA (les données) et A5 à SCL (l’horloge).

Par ailleurs l’adresse par défaut d’un gyro MPU-6050 est 0x68. On peut donc dire à l’arduino où il est puis, dans setup(), lancer la communication sachant qu’on a défini l’adresse du gyro par  const int MPU_addr=0x68;

Ici notre Arduino Uno est le « maître » et le gyro est « esclave ». L’Arduino écrira (write) pour envoyer des données au gyro, ou lira (read) pour en recevoir des données. Par exemple :

Wire.write(0);     // set to zero (wakes up the MPU-6050)

AcX=Wire.read()<<8|Wire.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)

Pour communiquer en suivant le protocole I2C, on a inclus la  bibliothèque Arduino Wire, avec #include<Wire.h> .

comprendre la lecture du gyro

C’est assez compliqué car il faut lire dans des registres de 16 bits les valeurs mesurées.

int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;  définit que les variables mesurées sont des codés sur 16 bits et sont signées (peuvent être négatives). Elles peuvent donc prendre une valeur allant de -32 768 à 32 767, soit de -(2^{15}) à 2^{15}-1 (source wikipedia).

Que signifient les lignes de code suivantes , dans la boucle ?

Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr,14,true); // request a total of 14 registers
AcX=Wire.read()<<8|Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L) 
AcY=Wire.read()<<8|Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)

Schématiquement (je ne suis pas sûre de tout comprendre), on doit lire dans un registre les valeurs stockées par le gyro.

On dit au gyro de commencer à fournir les données à partir du registre 0c3B qui contient une partie de l’accélération en x et on lui indique qu’on aura besoin de lire 14 registres en tout avec les lignes Wire.write(0x3B);   et  Wire.requestFrom(MPU_addr,14,true); .

Ensuite on lit les registres deux par deux car chaque valeur que l’on recherche est codée sur deux registres différents. Par exemple l’accélération en x est codée dans 0x3B (ACCEL_XOUT_H) et 0x3C (ACCEL_XOUT_L).

Pour les lire et les transformer en une seule valeur, on utilise, des « bit-shift », ou déplacements de bits comme expliqué  par Edgar Bonet dans arduino.stackexchange ici, en anglais.

Le premier Wire.read() lit le premier registre : 0x3B puisqu’on a dit que c’est là qu’il faut commencer avec la commande Wire.write(0x3B);  . Le deuxième lit le suivant (0x3C). L’accélération en x est calculée par la ligne AcX=Wire.read()<<8|Wire.read();  .

Chaque Wire.read() renvoie un entier de 16 bits et le suivant se décale d’un registre. La ligne  AcX=Wire.read()<<8|Wire.read();  place aaaaaaaabbbbbbbb dans l’entier de 16 bits AcX par le mécanisme illustré dans cette image :

Opérations de bits sur les registres du MPU-6050

Le lien avec le programme du balancing robot

Il s’agit maintenant de comprendre le code lié au gyroscope dans le programme du balancing robot qui me sert d’inspiration ;

Dans ce programme, le setup() renvoit à une fonction, angle_setup(), qui réveille le gyro et lui donne quelques instructions.

On ne s’intéresse qu’à l’accélération en x et y et l’angle en z. On ne va donc lire que AcX, AcY et GyZ du programme précédent.

Pour celà, on se positionne d’abord sur le registre 0x3B, on déclare qu’on ne veut lire que 4 registres avec les lignes suivantes :

Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU6050, 4, true);

On lit AcX et AcY puis on passe à la lecture de GyZ, dont le premier registre est en 0x47, et on ne lit que les deux registres correspondants :

Wire.write(0x47);
Wire.endTransmission(false);
Wire.requestFrom(MPU6050, 2, true); // request a total of 2 registers

Le code correspondant est visible ici : gyro-gyrobo.ino et sur GitHub ici.

Il fonctionne :

La console arduino avec le code gyro du balancing robot

C’est un peu bizarre car je ne touchais pas au gyro, ni au bureau sur lequel il est posé. Je m’attendais donc à lire des valeurs stables…

Positionnement du gyro

Je vais profiter de ce prototype pour comprendre comment positionner le gyro sur le robot lorsque je l’intégrerai.

D’après les changements de valeur observés, voici les axes :

3 axes pour positionner le gyro

le gyro sera donc placé à l’horizontale, led vers le dessous, avec la flèche X pointant vers l’avant du robot et la flèche Y dans le même axe que les roues.

Et maintenant ?

La troisième étape de ces recherches sur le gyroscope va consister à l’intégrer à mon NoRobo à 3 roues. Ce sera l’objet de l’article suivant de cette série « « .

Commander un arduino avec une application android

Commander un arduino avec une application android

Commander un arduino avec l’application Blueterm

J’ai fait mes premiers essais avec cette application car j’avais déjà eu l’occasion de la tester sur un arduino et j’étais certaine qu’elle fonctionnerait ici.

L’application Blueterm (disponible ici pour android) permet d’envoyer des caractères un à un en connexion série bluetooth.

Le sketch complet est disponible ici, sur GitHub. Voici quelques explications sur son fonctionnement.

Utiliser la librairie SoftwareSerial.h

#include <SoftwareSerial.h>  demande à l’arduino d’utiliser la librairie SoftwareSerial.h. Cette librairie est très utile car elle permet d’avoir plusieurs liaisons série entre l’arduino et divers appareils.

Ensuite, nous déclarons deux connexions séries distinctes :

Entre le module bluetooth et l’arduino :

SoftwareSerial AlSerial(2, 3); déclare une liaison série qui se fait via les ports 2 (correspondant à un « TX » de l’arduino) et 3 (RX de l’arduino).

AlSerial.begin(57600);  déclare que cette liaison se fera à 57 600 bauds. Evidemment, cette vitesse doit être celle à laquelle on a réglé le module bluetooth précédemment.

La variable Btate prend la valeur de ce qui est écrit dans l’application android : int Btate = AlSerial.read() ;

Si cette variable est égale à « a », la led est allumée par la commande digitalWrite(WhiteLed, HIGH);

Entre l’ordinateur et l’arduino, par USB : application android blueterm

Serial  n’est pas déclaré car c’est une liaison par défaut.

Serial.begin(57600);  déclare que cette liaison se fera à 57 600 bauds.

Serial.println(« Setup fait. »);  imprime sur la console de l’ordinateur le texte « Setup fait. »

Et ça fonctionne !

Sur mon téléphone, si je tape « a », la led s’allume et « r » l’éteint.

C’est pareil dans la console série de l’ordinateur.

Avec l’application JoyStick Bluetooth Commander

Cette application est beaucoup plus sophistiquée puisqu’elle permet d’utiliser jusqu’à 6 boutons et un joystick pour commander notre arduino.

L’application android JoystickBluetooth Commander est disponible ici, sur google Play.

Un sketch arduino d’exemple est récupérable ici. C’est ce sketch que j’ai utilisé comme base pour réaliser mon propre sketch.

Mon sketch est disponible sur GitHub ici. J’ai réglé le bouton 1 pour qu’il allume la led de l’arduino (#13) et le bouton 2 pour qu’il allume la led connectée au port 7 de l’arduino. Les données dans les champs data1 et data2 sont bidon, générées par deux fonctions intégrées au sketch. Data3 contient un message généré lorsqu’on actionne un bouton, par l’intermédiaire de la variable displayStatus .

Voici le résultat sur mon téléphone android. Je viens d’appuyer sur le bouton B2 et le champs « Data3 » indique « White LED <ON> pour m’en informer. Comme B1 et B2 sont appuyés, la led blanche branchée sur le port #7 et la led intégrée à l’arduino sont toutes deux allumées. Tout fonctionne donc parfaitement.

Ecran de l'application Bluetooth Android vers Arduino

Ca fonctionne aussi bien avec le module hc-05 qu’avec le module hc-06.

Et maintenant

Je vais pouvoir utiliser ce que j’ai appris ici pour commander un robot par mon téléphone android. Ce robot fait l’objet d’une série d’articles, dont le premier est Robot arduino – étape 0.

 

Robot arduino – étape 0

Robot arduino – étape 0

Au FabLab de Quimper, nous avons commencé un robot à balancier. Nous tenons un carnet de bord qui en raconte les péripéties (ici le premier article). Malheureusement le GyRobo ne tient pas encore debout, malgré plusieurs après-midi de travail collectif. Pourtant, tout semblait bien parti puisque nous disposions d’un tutoriel complet. Cette série d’articles () raconte mes expériences sur un autre robot, dans le but de mieux comprendre comment les concevoir.  (suite…)

Arduino et bluetooth (HC-06 ou HC-05)

Arduino et bluetooth (HC-06 ou HC-05)

Pour beaucoup d’applications, il est utile de déconnecter l’arduino de l’ordinateur pour lui donner de la mobilité. Je veux donc pouvoir utiliser des applications android permettant de commander un montage arduino. Dans cette première partie d’une série () sur le bluetooth et arduino, j’explique comment régler les modules HC-O6 ou HC-05 (commandes AT).  (suite…)

Ajout de nouveaux « mime types » à un site WordPress

Ajout de nouveaux « mime types » à un site WordPress

Les caractéristiques des fichiers qu’on peut charger dans un site WordPress sont définies par WordPress. On peut souhaiter autoriser le chargement d’autres types de fichier, par exemple des fichiers .dxf pour mettre des plans à disposition des internautes. J’explique ici comment créer une extension autorisant l’ajout de fichiers différents.  (suite…)

Extraits WordPress : modifier leur affichage (read more, …)

Dans WordPress, on peut afficher une liste d’article en utilisant soit l’extrait soit tout le contenu. Et l’extrait peut être généré automatiquement ou rempli manuellement. Des fonctions en PHP permettent de régler la longueur maximum de l’extrait automatique, d’ajouter un lien et […] ou « Lire la suite », d’accepter ou non les retours à la ligne et autres éléments de mise en page du résumé.  (suite…)