Catégories
Arduino capteur drone électronique

Drone | Arduino #6: Comment ça marche le capteur MPU-6050 GY-521 (Accéléromètre + Gyro) ?

Objectifs

  1. Comprendre l’utilité d’un capteur gyroscopique /accéléromètre
  2. Savoir utiliser le capteur GY-521 avec Arduino
  3. Savoir la différence entre un accéléromètre et un gyroscope
  4. Savoir les caractéristiques du gyroscope et de l’accéléromètre
  5. Visualiser l’évolution temporelle des signaux des deux capteurs
  6. Et plus encore.

Fonctionnement

La carte GY-521 est muni d’un capteur MEMS MPU-6050. Le circuit contient trois capteurs: Un accéléromètre à trois composantes (3 axes), un gyroscope à 3C et un capteur de température.

Schéma bloc du circuit MPU-60×0

Schéma bloc GY-521 MPU-6050

Package du circuit MPU-60×0

Package

Schéma électronique de la carte GY-521

shéma capteur GY-521 MPU-6050

Caractéristiques du gyroscope

  1. Le gyroscope MEMS à trois axes du MPU-60X0 comprend un large éventail de fonctionnalités:
  2. Capteurs de vitesse angulaire (gyroscopes) à sortie numérique des axes X, Y et Z avec une plage pleine échelle programmable par l’utilisateur de ± 250, ± 500, ± 1000 et ± 2000 ° / s
  3. Le signal de synchronisation externe connecté à la broche FSYNC prend en charge la synchronisation d’image, vidéo et GPS
  4. Les ADC 16 bits intégrés permettent l’échantillonnage simultané des gyroscopes
  5. Compensation de la stabilité en température intégrée dans le capteur
  6. Amélioration des performances de bruit basse fréquence
  7. Filtre passe-bas programmable numériquement
  8. Courant de fonctionnement du gyroscope: 3,6 mA
  9. Faible consommation au repos 5µA
  10. Facteur d’échelle de sensibilité calibré en usine
  11. Auto-test de l’utilisateur

Caractéristiques de l’accéléromètre

  1. L’accéléromètre MEMS à trois axes du MPU-60X0 comprend un large éventail de fonctionnalités:
  2. Accéléromètre à trois axes à sortie numérique avec une plage de pleine échelle programmable de ± 2g, ± 4g, ± 8g et
  3. ± 16g
  4. Les ADC 16 bits intégrés permettent l’échantillonnage simultané des accéléromètres sans multiplexeur
  5. Courant de fonctionnement normal de l’accéléromètre: 500µA
  6. Courant du mode accéléromètre basse puissance: 10µA à 1,25Hz, 20µA à 5Hz, 60µA à 20Hz, 110µA à 40 Hz
  7. Détection et signalisation d’orientation
  8. Détection de robinet
  9. Interruptions programmables par l’utilisateur
  10. Interruption High-G
  11. Auto-test de l’utilisateur

Applications

  1. Stabilisateur vidéo / image
  2. Contrôle / navigation des applications de l’interface utilisateur sans contact
  3. Technologie MotionCommand  (pour les raccourcis gestuels)
  4. Contrôle par le mouvement le mouvement (drone, télécommande magic, console de jeu, etc.)
  5. Reconnaissance gestuelle
  6. Services basés sur la localisation
  7. Stabilisateur des drones et robots
  8. Combiné et jeux portables
  9. Contrôleurs de jeu basés sur le mouvement
  10. Télécommandes 3D pour DTV et décodeurs connectés à Internet, souris 3D
  11. Capteurs portables pour la santé, le fitness et le sport
  12. Jouets

Montage avec Aduino

Montage Arduino GY-521

// Pinout 
/*
VCC -> 3.3 V / 5 V (péférable)
GND -> GND
SCL -> A5
SDA -> A4

XDA -> NC (non connecté)
XCL -> NC
ADO -> NC
INT -> NC
*/

Programme Arduino (voir la vidéo)

Fonction de lecture des capteurs

void ReadGY521( int *GyAccTempp, int *GATCorrr)
{
// Init du module GY-521
Wire.beginTransmission(MPU);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU,14,true);

// Lecture des données (3 axes accélérometre + température + 3 axes gyroscope
for (int i=0;i<NumData;i++)
{
if(i!=3)
{
GyAccTempp[i]=(Wire.read()<<8|Wire.read()) + GATCorrr[i];
}
else
{
GyAccTempp[i]=(Wire.read()<<8|Wire.read()) + GATCorrr[i];
GyAccTempp[i] = GyAccTempp[i]/340 + 36.53;
}
}
}

Fonction du conversion des données accéléromètre en pitch/roll/yaw

void ComputeAngle(int *GyAccTempp,  double *PitchRol)
{
double x = GyAccTempp[0];
double y = GyAccTempp[1];
double z = GyAccTempp[2];

PitchRol[0] = atan(x/sqrt((y*y) + (z*z))); // pitch
PitchRol[1] = atan(y/sqrt((x*x) + (z*z))); // roll
PitchRol[2] = atan(z/sqrt((x*x) + (y*y))); // pitch

//Conversion Radian en degrée
PitchRol[0] = PitchRol[0] * (180.0/pi);
PitchRol[1] = PitchRol[1] * (180.0/pi) ;
PitchRol[2] = PitchRol[2] * (180.0/pi) ;
}

Affichage des données de l’Accéléromètre

  Serial.print(GyAccTemp[0]); Serial.print(",");
Serial.print(GyAccTemp[1]); Serial.print(",");
Serial.println(GyAccTemp[2]);

Affichage des données du gyroscope

  Serial.print(GyAccTemp[4]); Serial.print(",");
Serial.print(GyAccTemp[5]); Serial.print(",");
Serial.println(GyAccTemp[6]);

Affichage des valeurs de la température

  Serial.println(GyAccTemp[3]); 

Programme principal

#include<Wire.h>
#include <math.h>
#define NumData 7
#define pi 3.1415926535897932384626433832795
#define MPU 0x68

// Pinout
/*
VCC -> 3.3 V / 5 V (péférable)
GND -> GND
SCL -> A5
SDA -> A4

XDA -> NC (non connecté)
XCL -> NC
ADO -> NC
INT -> NC
*/

int GyAccTemp[NumData];
int GATCorr[NumData]={0,0,0,0,0,0,0};
//int GATCorr[NumData]={-950,-300,0,-1600,480,170,210};

double PitchRoll[3];

void setup()
{
// Init module GY-512
Wire.begin();
Wire.beginTransmission(MPU);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);

// Init port série
Serial.begin(9600);
}
void loop()
{
// Lecture du capteur
ReadGY521( GyAccTemp, GATCorr);

// Conversion pitch/Roll / Yaw
ComputeAngle(GyAccTemp, PitchRoll);

// Affichage dans le port série Roll/Pitch/ Yaw en °
/*Serial.print(PitchRoll[0]); Serial.print(",");
Serial.print(PitchRoll[1]); Serial.print(",");
Serial.println(PitchRoll[2]); //Serial.print(";");
delay(100);*/

// Affichage des 3 Axes de l'Accéléromètre
Serial.print(GyAccTemp[0]); Serial.print(",");
Serial.print(GyAccTemp[1]); Serial.print(",");
Serial.println(GyAccTemp[2]);

// Affichage 3 Axes du Gyroscope
/*Serial.print(GyAccTemp[4]); Serial.print(",");
Serial.print(GyAccTemp[5]); Serial.print(",");
Serial.println(GyAccTemp[6]);*/
}



// Lecture des données des capteurs
void ReadGY521( int *GyAccTempp, int *GATCorrr)
{
// Init du module GY-521
Wire.beginTransmission(MPU);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU,14,true);

// Lecture des données (3 axes accéléromètre + température + 3 axes gyroscope
for (int i=0;i<NumData;i++)
{
if(i!=3)
{
GyAccTempp[i]=(Wire.read()<<8|Wire.read()) + GATCorrr[i];
}
else
{
GyAccTempp[i]=(Wire.read()<<8|Wire.read()) + GATCorrr[i];
GyAccTempp[i] = GyAccTempp[i]/340 + 36.53;
}
}
}

//Conversion des données accéléromètre en pitch/roll/yaw
void ComputeAngle(int *GyAccTempp, double *PitchRol)
{
double x = GyAccTempp[0];
double y = GyAccTempp[1];
double z = GyAccTempp[2];

PitchRol[0] = atan(x/sqrt((y*y) + (z*z))); // pitch
PitchRol[1] = atan(y/sqrt((x*x) + (z*z))); // roll
PitchRol[2] = atan(z/sqrt((x*x) + (y*y))); // pitch

//Conversion Radian en degré
PitchRol[0] = PitchRol[0] * (180.0/pi);
PitchRol[1] = PitchRol[1] * (180.0/pi) ;
PitchRol[2] = PitchRol[2] * (180.0/pi) ;
}

Datasheet du circuit MPU-60X0

Datasheet GY-521 MPU-6050

Obtenir le fichier PDF du capteur MPU-60X0

Accueil Drone avec Arduino

2 réponses sur « Drone | Arduino #6: Comment ça marche le capteur MPU-6050 GY-521 (Accéléromètre + Gyro) ? »

Bonjour, non initié en électronique je souhaiterai un boîtier de commande équipé du capteur mpu 6050 ou autre pour programmer le déplacement d’un panneau solaire motorisé fai maison.
Merci du coup de main
Jm

Bonjour, merci pour votre commentaire. Le capteur est sensible aux vibrations, je vous recommande un capteur type potentiomètre
facile d’utilisation (tension proportionnelle à l’angle de rotation du curseur).

Laisser un commentaire