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

Abonnez-vous à notre Chaîne YouTube "Devenir Ingénieur"  pour bénéficier de nouveaux projets et suivre l'actualité du blog

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

[Total : 1   Moyenne : 5/5]

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Anti-Robot *