SUJET SUR MPU 6050
1 - Présentation :
Les MPU 6050/6500/9250 sont des modules accéléromètres, gyroscopes et
magnétomètres (boussole pour ceux qui n’ont pas compris – uniquement le
9250). Mais pour une raison qui m’échappe, ils font également office de capteur
de température. (Note pour moi-même : En offrir plein aux joueurs de l’OM pour
prise de température avant et après chaque match dans le…enfin bref !)
Première question : qu’est-ce qu’un gyroscope ? Bon, en bon français, ça donne :
c’est quoi un gyroscope ? Alors, d’après le philosophe internetius wikipediatius, «
Un gyroscope (du grec « qui observe la rotation ») est un appareil qui exploite le
principe de la conservation du moment cinétique en physique (ou encore stabilité
gyroscopique ou effet gyroscopique). Cette loi fondamentale de la mécanique
veut qu’en l’absence de couple appliqué à un solide en rotation autour d’un de
ses axes principaux, celui-ci conserve son axe de rotation invariable. Lorsqu’un
couple est appliqué à l’appareil, il provoque une précession ou une nutation du
solide en rotation. » En clair, un gyroscope est un capteur de position angulaire
sur 3 axes (x, y, z).
Deuxième question : C’est quoi un accéléromètre ? Haha, cette fois-ci je ne me
suis pas trompé ! Un accéléromètre, comme son nom l’indique, sert à mesurer
l’accélération d’un corps (comme l’accélération de Mbappé face à la défense
marseillaise incapable de le rattraper). Par exemple, le compteur de vitesse d’une
voiture permet de calculer l’accélération d’une voiture qui passe de 0 à 100 km/h
en 3 secondes (comme la Ferrari de Mbappé qu’il ne peut toujours pas conduire
vu qu’il n’a pas le permis !).
Un accéléromètre est un appareil qui mesure la vibration ou l'accélération du mouvement
d'une structure. La force provoquée par les vibrations ou un changement de mouvement
(accélération) pousse la masse à « serrer » le matériau piézoélectrique qui produit une
charge électrique proportionnelle à la force qui lui est exercée. Étant donné que la charge
est proportionnelle à la force, et que la masse est une constante, la charge est donc
également proportionnelle à l'accélération.
2 - Montage :
Pour réaliser ce projet, vous aurez besoin d’une carte Arduino Uno, de quelques
câbles, et d’un module MPU6050, 6500 ou 9250. Ces composants simples sont
tout ce dont vous avez besoin pour démarrer votre expérience d’équilibrage avec
le MPU.
3 - Programmation :
#include "Wire.h"
const int MPU_addr=0x68; int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
int minVal=265; int maxVal=402;
double x; double y; double z;
void setup(){
[Link]();
[Link](MPU_addr);
[Link](0x6B);
[Link](0);
[Link](true);
[Link](9600);
}
void loop(){
[Link](MPU_addr);
[Link](0x3B);
[Link](false);
[Link](MPU_addr,14,true);
AcX=[Link]()<<8|[Link]();
AcY=[Link]()<<8|[Link]();
AcZ=[Link]()<<8|[Link]();
int xAng = map(AcX,minVal,maxVal,-90,90);
int yAng = map(AcY,minVal,maxVal,-90,90);
int zAng = map(AcZ,minVal,maxVal,-90,90);
x= RAD_TO_DEG * (atan2(-yAng, -zAng)+PI);
y= RAD_TO_DEG * (atan2(-xAng, -zAng)+PI);
z= RAD_TO_DEG * (atan2(-yAng, -xAng)+PI);
[Link]("AngleX= "); [Link](x);
[Link]("AngleY= "); [Link](y);
[Link]("AngleZ= "); [Link](z);
[Link]("-----------------------------------------");
delay(400);
}
Copy
Mais comme nous aimons ajouter une touche de fun chez Eagle Robotics, nous
allons utiliser le Shield Joystick conçu par Eagle Robotics. Ce shield est équipé
d’un joystick, de 4 boutons, d’un port pour module Bluetooth, d’un port pour écran
OLED 0.96 pouces, et enfin d’un port pour module accéléromètre-gyroscope
MPU6050/6500/9250. En clair, pourquoi se contenter du beurre quand on peut
avoir l’argent du beurre aussi ? Ou encore, pourquoi faire simple quand on peut
se compliquer la tâche ?
Nous allons donc réaliser un programme qui va lire les données des angles x, y
et z, et les afficher dans un premier temps sur l’écran 0.96 pouces.
#include "SPI.h"
#include "Wire.h"
#include "Adafruit_GFX.h"
#include "Adafruit_SSD1306.h"
#define SCREEN_WIDTH 128 // Largeur de l'écran OLED en pixels
#define SCREEN_HEIGHT 64 // Hauteur de l'écran OLED en pixels
// Declaration de l'écran SSD1306 connecté en I2C (pins SDA, SCL)
#define OLED_RESET 4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire,
OLED_RESET);
const int MPU_addr=0x68; // Adresse I2C du MPU-6050
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
double x; double y; double z;
int minVal=265; int maxVal=402;
void setup() {
[Link](9600);
[Link]();
[Link](MPU_addr);
[Link](0x6B);
[Link](0); // Reveil du MPU-6050
[Link](true);
// accès à l'écran
if() { // ou 0x3D
[Link](F("connection impossible"));
for(;;);
}
}
void loop() {
adxl();
delay(40);
}
void adxl(){
[Link](MPU_addr);
[Link](0x3B);
[Link](false);
[Link](MPU_addr,14,true);
AcX=[Link]()<<8|[Link](); // 0x3B (ACCEL_XOUT_H) & 0x3C
(ACCEL_XOUT_L)
AcY=[Link]()<<8|[Link](); // 0x3D (ACCEL_YOUT_H) & 0x3E
(ACCEL_YOUT_L)
AcZ=[Link]()<<8|[Link](); // 0x3F (ACCEL_ZOUT_H) & 0x40
(ACCEL_ZOUT_L)
Tmp=[Link]()<<8|[Link](); // 0x41 (TEMP_OUT_H) & 0x42
(TEMP_OUT_L)
GyX=[Link]()<<8|[Link](); // 0x43 (GYRO_XOUT_H) & 0x44
(GYRO_XOUT_L)
GyY=[Link]()<<8|[Link](); // 0x45 (GYRO_YOUT_H) & 0x46
(GYRO_YOUT_L)
GyZ=[Link]()<<8|[Link](); // 0x47 (GYRO_ZOUT_H) & 0x48
(GYRO_ZOUT_L)
[Link]("AcX = "); [Link](AcX);
[Link](" | AcY = "); [Link](AcY);
[Link](" | AcZ = "); [Link](AcZ);
[Link](" | Tmp = "); [Link](Tmp/340.00+36.53);
//Température en degrés celcius
[Link](" | GyX = "); [Link](GyX);
[Link](" | GyY = "); [Link](GyY);
[Link](" | GyZ = "); [Link](GyZ);
int xAng = map(AcX,minVal,maxVal,-90,90);
int yAng = map(AcY,minVal,maxVal,-90,90);
int zAng = map(AcZ,minVal,maxVal,-90,90);
x= RAD_TO_DEG * (atan2(-yAng, -zAng)+PI);
y= RAD_TO_DEG * (atan2(-xAng, -zAng)+PI);
z= RAD_TO_DEG * (atan2(-yAng, -xAng)+PI);
//Affichage du résultat sur l'écran 0.96 pouces
[Link]();
[Link](2);
[Link](SSD1306_WHITE);
[Link](0,0);
[Link](F("X"));
[Link](50,0);
[Link](x);
[Link](0,20);
[Link](F("Y"));
[Link](50,20);
[Link](y);
[Link](0,40);
[Link](F("Z"));
[Link](50,40);
[Link](z);
[Link]();
delay(300);
}
Copy
Avec une touche d’innovation chez Eagle Robotics, nous allons aller encore plus
loin ! Nous allons désormais commander un robot à l’aide de notre module
MPU6050 et du Bluetooth. Prenons par exemple le fameux Spiderbot V12
Android, un robot conçu à la base pour être piloté par un smartphone Android via
une application (la nôtre, bien sûr). Cependant, pour cette occasion spéciale,
nous avons créé une liaison automatique entre le module HC05 du Shield
Joystick Eagle et le module Bluetooth du robot dès la mise sous tension. En
conséquence, le robot est maintenant pilotable à partir du Shield Joystick, mais
aussi via l’application Android sur smartphone. Attendez une minute ! Nous
venons de créer un nouveau produit.
Et maintenant, place au code !
// Programme côté Shield:
#include "SPI.h"
#include "Wire.h"
#include "Adafruit_GFX.h"
#include "Adafruit_SSD1306.h"
#include "SoftwareSerial.h"
#define SCREEN_WIDTH 128 // Largeur de l'écran OLED en pixels
#define SCREEN_HEIGHT 64 // Hauteur de l'écran OLED en pixels
// Déclaration de l'écran SSD1306 connecté en I2C (pins SDA, SCL)
#define OLED_RESET 4 //
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire,
OLED_RESET);
SoftwareSerial BT (7,8);
const int MPU_addr=0x68; // I2C address of the MPU-6050
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
double x; double y; double z; double w;
int minVal=265; int maxVal=402;
char a; // Donnée si on veut recevoir de la donnée Bluetooth
void setup() {
[Link](9600); //Activation du Bluetooth
[Link](9600); // Activation du Port série
[Link](); // Activation du MPU6050
[Link](MPU_addr);
[Link](0x6B);
[Link](0);
[Link](true);
// Activation du Display
if() { // ou Adresse
0x3D
[Link](F("Connection impossible"));
for(;;);
}
void loop() {
[Link](MPU_addr);
[Link](0x3B);
[Link](false);
[Link](MPU_addr,14,true);
AcX=[Link]()<<8|[Link](); // 0x3B (ACCEL_XOUT_H) & 0x3C
(ACCEL_XOUT_L)
AcY=[Link]()<<8|[Link](); // 0x3D (ACCEL_YOUT_H) & 0x3E
(ACCEL_YOUT_L)
AcZ=[Link]()<<8|[Link](); // 0x3F (ACCEL_ZOUT_H) & 0x40
(ACCEL_ZOUT_L)
Tmp=[Link]()<<8|[Link](); // 0x41 (TEMP_OUT_H) & 0x42
(TEMP_OUT_L)
GyX=[Link]()<<8|[Link](); // 0x43 (GYRO_XOUT_H) & 0x44
(GYRO_XOUT_L)
GyY=[Link]()<<8|[Link](); // 0x45 (GYRO_YOUT_H) & 0x46
(GYRO_YOUT_L)
GyZ=[Link]()<<8|[Link](); // 0x47 (GYRO_ZOUT_H) & 0x48
(GYRO_ZOUT_L)
int xAng = map(AcX,minVal,maxVal,-90,90);
int yAng = map(AcY,minVal,maxVal,-90,90);
int zAng = map(AcZ,minVal,maxVal,-90,90);
x= RAD_TO_DEG * (atan2(-yAng, -zAng)+PI);
y= RAD_TO_DEG * (atan2(-xAng, -zAng)+PI);
z= RAD_TO_DEG * (atan2(-yAng, -xAng)+PI);
[Link]();
[Link](2);
[Link](SSD1306_WHITE);
[Link](0,0);
[Link](F("X"));
[Link](50,0);
[Link](x);
[Link](0,20);
[Link](F("Y"));
[Link](50,20);
[Link](y);
[Link](0,40);
[Link](F("Z"));
[Link](50,40);
[Link](z);
[Link]();
delay(300);
w = x + y + z;
if( w >= 50 && w <= 80){
[Link](w);
[Link]("mode droite");
[Link]('r');
while(w >= 50 && w <= 80){
delay(1);
adxl();
}
[Link]("exit de droite");
[Link]('s');
}
else if (w >= 190 && w <= 260){
[Link](w);
[Link]("mode arriere");
[Link]('b');
while(w >= 190 && w <= 260){
delay(1);
adxl();
}
[Link]("exit de arriere");
[Link]('s');
}
else if (w >= 280 && w <= 350){
[Link](w);
[Link]("mode gauche");
[Link]('l');
while(w >= 280 && w <= 350){
delay(1);
adxl();
}
[Link]("exit de gauche");
[Link]('s');
}
else if (w >= 680 && w <= 720){
[Link](w);
[Link]("mode avant");
[Link]('f');
while(w >= 680 && w <= 720){
delay(1);
adxl();
}
[Link]("exit de avant");
[Link]('s');
}
else {
[Link](w);
[Link]("mode stop");
}
delay(40);
}
void adxl(){
[Link](MPU_addr);
[Link](0x3B);
[Link](false);
[Link](MPU_addr,14,true);
AcX=[Link]()<<8|[Link](); // 0x3B (ACCEL_XOUT_H) & 0x3C
(ACCEL_XOUT_L)
AcY=[Link]()<<8|[Link](); // 0x3D (ACCEL_YOUT_H) & 0x3E
(ACCEL_YOUT_L)
AcZ=[Link]()<<8|[Link](); // 0x3F (ACCEL_ZOUT_H) & 0x40
(ACCEL_ZOUT_L)
Tmp=[Link]()<<8|[Link](); // 0x41 (TEMP_OUT_H) & 0x42
(TEMP_OUT_L)
GyX=[Link]()<<8|[Link](); // 0x43 (GYRO_XOUT_H) & 0x44
(GYRO_XOUT_L)
GyY=[Link]()<<8|[Link](); // 0x45 (GYRO_YOUT_H) & 0x46
(GYRO_YOUT_L)
GyZ=[Link]()<<8|[Link](); // 0x47 (GYRO_ZOUT_H) & 0x48
(GYRO_ZOUT_L)
int xAng = map(AcX,minVal,maxVal,-90,90);
int yAng = map(AcY,minVal,maxVal,-90,90);
int zAng = map(AcZ,minVal,maxVal,-90,90);
x= RAD_TO_DEG * (atan2(-yAng, -zAng)+PI);
y= RAD_TO_DEG * (atan2(-xAng, -zAng)+PI);
z= RAD_TO_DEG * (atan2(-yAng, -xAng)+PI);
[Link]();
[Link](2);
[Link](SSD1306_WHITE);
[Link](0,0);
[Link](F("X"));
[Link](50,0);
[Link](x);
[Link](0,20);
[Link](F("Y"));
[Link](50,20);
[Link](y);
[Link](0,40);
[Link](F("Z"));
[Link](50,40);
[Link](z);
[Link]();
delay(300);
w = x + y + z;
}