# Micro contrôleurs AVR/Travail pratique/Utilisation du MPU9250

Le MPU9250 est composé d'un MPU6050 (déjà présenté dans un TP précédent) et d'un magnétomètre AK8963. Il dispose donc des six axes du MPU6050 (3 pour l'accéléromètre et 3 pour le gyroscope) et des trois axes du magnétomètre. Un tel dispositif sera donc qualifié de 9 axes (9 Degree Of Freedom = 9 DOF).
L'objectif de ce TP est d'amener l'étudiant à comprendre les différences de comportements des accéléromètres, des gyroscopes et des magnétomètres en résolvant au mieux le problème de mesure de l'attitude c'est-à-dire la rotation des axes de cet objet MPU9250 par rapport à un repère d'inertie. Dans ce TP on considérera bien sûr la terre (c'est-à-dire votre salle de classe) comme un référentiel d'inertie.

## Documentation

Une présentation en français de l' IMU9250 est disponible ICI. Elle a été réalisée par Vincent Kerhoas.

## Introduction aux spécifications

Nous allons passer en revue un ensemble de spécifications sur le MPU 9250. Elles nous permettront de comprendre ce que l'on peut envisager de faire avec ce composant. Ces spécifications sont disponibles ICI (MPU9250 datasheet).

### Spécifications du gyroscope

Nous donnons seulement un extrait des caractéristiques du gyroscope :

#### Gyroscope MPU9250

    ParamètreConditionsminTypiquemaxUnités Pleine échelleFS_SEL=0+/- 250°/s FS_SEL=1+/- 500°/s FS_SEL=2+/- 1000°/s FS_SEL=3+/- 2000°/s SensibilitéFS_SEL=0131LSB/(°/s) FS_SEL=165.5LSB/(°/s) FS_SEL=232.8LSB/(°/s) FS_SEL=316.4LSB/(°/s)
Dans le cas d'un choix FS_SEL à 0, la mesure sera donnée avec 131/(°/s) (lire 131 par [° par seconde]). Autrement dit, une mesure de 250 °/s donnera 131*250 soit 32750. Ceci montre que les données sont sur 16 bits et elles sont signées. Le type C pour les récupérer est donc soit "int" soit "int16_t". Cela montre qu'inversement, pour avoir votre vitesse angulaire en °/s il suffit de prendre le résultat envoyé par le capteur et de le diviser par 131.

### Spécifications de l'accéléromètre

Nous donnons seulement un extrait des caractéristiques de l'accéléromètre :

#### Accéléromètre MPU9250

    ParamètreConditionsminTypiquemaxUnités Pleine échelleAS_SEL=0+/- 2g AS_SEL=1+/- 4g AS_SEL=2+/- 8g AS_SEL=3+/- 16g SensibilitéAS_SEL=016384LSB/g AS_SEL=18192LSB/g AS_SEL=24096LSB/g AS_SEL=32048LSB/g
Dans le cas d'un choix de AS_SEL à 0, la mesure sera donnée avec 16384/g (lire 16384 par g et non pas 16384 divisé par g !!!). Autrement dit, une mesure d'un g donnera 16384 tandis que deux g donnera 32768. Ceci montre que les données sont sur 16 bits et elles sont signées. Le type C pour les récupérer est donc soit "int" soit "int16_t".

### Spécification du magnétomètre

Nous donnons seulement un extrait des caractéristiques du magntomètre :

#### Magnétomètre MPU9250

    ParamètreConditionsminTypiquemaxUnités Pleine échelle4800uT Nb bits CAN14bits Sensibilité0.6uT/LSB Tolérence initiale+/- 500LSB

## Faire fonctionner le MPU9250 en simple i2c
### Installation de la librairie correspondante

Il y a plusieurs librairies utilisables pour le MPU9250. On vous demande d'installer bolderflight/MPU9250 de Brian R Taylor et de réussir à faire fonctionner l'exemple Basic_I2C. Il s'agit d'une simple lecture des données de l'accéléromètre, des données du gyroscope et des données du magnétomètre et de leur affichage à l'aide d'une liaison série dans le moniteur série de l'Arduino. Une fois que tout fonctionne vous êtes prêt pour réaliser l'application 1.

### Application 1 : inclinomètre

On va maintenant se servir de la position de l'accélération de pesanteur par rapport à nos axes pour essayer de trouver l'attitude de notre repère. En clair nous allons abandonner (momentanément) les données du gyroscope, du magnétomètre et de la température pour ne garder que celles de l'accéléromètre.
On va d’abord simplifier le problème en le ramenant en deux dimensions. L'accéléromètre que vous utilisez a ses deux axes X et Y clairement indiqués. Naturellement l'axe Z est perpendiculaire à ces deux axes.
On va s'intéresser à une rotation autour de l'axe Y (tangage). L'accéléromètre devra donc rester horizontal par rapport à l'axe X !!!
À l'aide de la figure explicative ci-dessous, on vous demande de retrouver l'angle de tangage de votre repère.
Indication : Quelle est la relation entre les coordonnées ax et az et l'angle ? Le calcul d'une tangente inverse est en général mieux réalisé par la primitive atan2 que atan. Chercher la documentation sur ce point sur Internet.
Note : Il est possible que vous considériez l'axe Z dans l'autre sens ! Tout dépend comment vous tenez l'accéléromètre.

### Application 2 : inclinomètre sur deux axes

Les deux axes en question dans le titre de cette section sont le tangage et le roulis (Tilt (Pitch) et Roll en anglais). Un cours sur le sujet est disponible dans Youtube en anglais. La leçon 6 nous intéresse particulièrement : 9-Axis IMU LESSON 6: Determine Tilt From 3-axis Accelerometer.
Ce que l'on vous demande de réaliser est tout simplement ce qu'il y a dans cette leçon 6 avec un matériel complètement différent :
* 9 axes MPU9250 d'Invensense au lieu du 9 axes BNO055 d'Adafruit
* bolderflight/Librairie MPU9250 de Brian R Taylor au lieu de la librairie Adafruit
* Si vous faites fonctionner le code de la solution ci-dessus avec un accéléromètre en main vous vous apercevrez très rapidement que ce code possède un inconvénient de taille : si vous faites trembler horizontalement l'accéléromètre il vous donnera un angle de roulis ou un angle de tangage (ou les deux) suivant vos tremblements... et ceci malgré le fait que vous restez horizontal ! Ceci s'explique facilement : vous ajoutez une accélération supplémentaire qui va détruire les beaux calculs trigonométriques qui sont bâtis autour de l'hypothèse que seule la gravitation entre en jeux !
* C'est à cause de ce défaut qu'il nous faudra ajouter plus tard les données du gyroscope dans nos calculs.

### Application 3 : stabilisation

On vous demande de réaliser ce que montre la vidéo de cette page (ou directement dans youtube). Cela nécessite un servomoteur et un accéléromètre.