Le module MPU6050 est une centrale inertielle qui permet de mesurer l’évolution d’un objet dans l’espace. Il permet de mesurer les accélérations linéaires et angulaires dans les trois axes de l’espace. Ce composant se retrouve dans plusieurs applications notamment les manettes de jeux vidéo ou les smartphones. Il peut être utilisé pour faire du contrôle d’assiette sur un drone ou pour équilibrer un robot sur deux roues.
Pour ce tutoriel, nous allons utiliser le module GY-521 sur lequel est embarqué le MPU6050.
Prérequis : la communication I2C
Matériel
- Ordinateur
- Arduino UNO
- Câble USB A Mâle/B Mâle
- MPU6050 (Module GY-521)
Principe de fonctionnement
Le module GY-521 est une carte de développement pour le système microélectromécanqiue MPU6050 (MEM- Microelectromechanical systems). Le module MPU6050 est constitué d’un capteur de température et de deux capteurs micromécaniques: un gyroscope qui permet de mesurer les rotations et un accéléromètre qui permet de mesurer les accélérations dans l’espace. Ces capteurs sont généralement constitués d’une partie mécanique et d’une partie piézoélectrique. Lorsque l’objet est en mouvement la pièce mécanique se déplace contre la partie piézoélectrique qui envoie un signal électrique.
Schéma
Le module peut être alimenté directement via la broche 5V de la carte Arduino. Le Module GY-521 utilise la communication I2C pour s’interfacer avec le microcontrôleur.
- SDA à la broche A4
- SCL à la broche A5
- VCC à la broche 5V
- GND à la broche GND
Code
Pour s’interfacer avec le module GY-521, et donc le MPU6050, nous allons utiliser la librairie du même nom Adafruit_MPU6050.h. Il est important de noté que, selon le module utilisé, il vous faudra peut être modifier l’adresse I2C pour pouvoir récupérer les mesures. Le code proposé, ici, est le programme de base permettant d’afficher et d’exploiter les mesures du capteur. La librairie propose bien plus de réglages et de paramètres. Pour plus de fonctionnalités, n’hésitez pas à vous reporter à la documentation et aux exemples de la librairie.
//Libraries #include <Wire.h>//https://www.arduino.cc/en/reference/wire #include <Adafruit_MPU6050.h>//https://github.com/adafruit/Adafruit_MPU6050 #include <Adafruit_Sensor.h>//https://github.com/adafruit/Adafruit_Sensor //Objects Adafruit_MPU6050 mpu; void setup() { //Init Serial USB Serial.begin(9600); Serial.println(F("Initialize System")); if (!mpu.begin(0x69)) { // Change address if needed Serial.println("Failed to find MPU6050 chip"); while (1) { delay(10); } } mpu.setAccelerometerRange(MPU6050_RANGE_16_G); mpu.setGyroRange(MPU6050_RANGE_250_DEG); mpu.setFilterBandwidth(MPU6050_BAND_21_HZ); } void loop() { readMPU(); delay(100); } void readMPU( ) { /* function readMPU */ ////Read acceleromter data sensors_event_t a, g, temp; mpu.getEvent(&a, &g, &temp); /* Print out the values */ Serial.print("Acceleration X: "); Serial.print(a.acceleration.x); Serial.print(", Y: "); Serial.print(a.acceleration.y); Serial.print(", Z: "); Serial.print(a.acceleration.z); Serial.println(" m/s^2"); Serial.print("Rotation X: "); Serial.print(g.gyro.x); Serial.print(", Y: "); Serial.print(g.gyro.y); Serial.print(", Z: "); Serial.print(g.gyro.z); Serial.println(" rad/s"); Serial.print("Temperature: "); Serial.print(temp.temperature); Serial.println("°C"); }
Résultat
Une fois le code téléversé dans l’Arduino, si vous faites bouger le capteur, vous pouvez voir évoluer les valeurs d’accélération dans les différentes directions de l’espace. Vous pouvez aussi vérifier le fonctionnement du capteur de température en collant votre doigt sur le module.
Applications
- Stabiliser un drone
- Contrôler un robot par les mouvements de la main
- Donner de l’équilibre à un robot à deux roues
Sources
- https://github.com/ElectronicCats/mpu6050/blob/master/src/MPU6050.h
- https://www.arduino.cc/en/reference/wire
- https://github.com/adafruit/Adafruit_MPU6050
- https://github.com/adafruit/Adafruit_Sensor
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie
Merci beaucoup pour ton aide.
J’ai modifié le code d’affichage pour le rendre compatible avec Serial Plotter :
Serial.print(« Acceleration_X: »);
Serial.print(a.acceleration.x);
Serial.print(« ,Acceleration_Y: »);
Serial.print(a.acceleration.y);
Serial.print(« ,Acceleration_Z: »);
Serial.print(a.acceleration.z);
Serial.print(« , »);
Serial.print(« Rotation_X: »);
Serial.print(g.gyro.x);
Serial.print(« ,Rotation_Y: »);
Serial.print(g.gyro.y);
Serial.print(« ,Rotation_Z: »);
Serial.print(g.gyro.z);
Serial.print(« , »);
Serial.print(« Temperature: »);
Serial.print(temp.temperature);
Serial.println();
Bonjour !
Je viens de tester le programme, et malheureusement le moniteur série affiche « Failed to find MPU6050 chip ». Je crois comprendre qu’il faut changer l’adresse i2c du capteur, ce qui m’amène à deux questions :
• C’est quoi l’adresse i2c ?
• Comment je sais quelle est celle de mon capteur ?
Merci pour votre aide !
Bonjour,
sur un bus I2C, il peut y avoir plusieurs appareils branchés. Pour se reconnaitre entre eux, ils utilisent une adresse (un peu comme l’adresse IP d’un ordinateur sur le réseau internet).
L’adresse du mpu est défini dans la fonction mpu.begin(0x69).
Pour identifier l’adresse de votre appareil, vous pouvez charger un code de scan I2C
Bonjour, il existe des codes permettant de trouver les appareils brancher sur i2c
Voici un exemple :
#include « Wire.h »
void setup(){
Wire.begin();
Serial.begin(9600);
}
void loop(){
byte error, address;
int nDevices;
Serial.println(« Scanning… »);
nDevices = 0;
for(address = 8; address < 127; address++ ){
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0){
Serial.print("I2C device found at address 0x");
if (address < 16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");
nDevices++;
}
else if (error == 4) {
Serial.print("Unknow error at address 0x");
if (address < 16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
delay(5000);
}
Bonjour,
Comment passer de l’accélération à la vitesse de translation sur X/Y/Z en m/s et non la vitesse de rotation en rad/s?
Merci
Bonjour,
L’accélération et la vitesse de rotation sont les données brutes données par le MPU6050.
il faut intégrer l’accélération numériquement pour obtenir la vitesse. Il peut y avoir beaucoup d’erreur si le signal est bruité. Il faudra certainement ajouter des filtres.