MPU6050, un accéléromètre et gyroscope
Introduction
Le MPU6050 est un circuit intégré qui contient un accéléromètre et un gyroscope. L'accéléromètre mesure l’accélération statique dans les trois axes, tandis que le gyroscope mesure la rotation autour ces trois axes.
Exercice 1 : Comprendre le bus I2C
Lire la documentation du bus I2C et les fiches techniques du MPU6050:
Lire les fiches techniques du MPU6050
Le pilote le plus complet que j'ai trouvé sur internet est celui de Jeff Rowberg. Ce pilote est écrit en C++ et il est destiné au SDK Arduino. Pour l'utiliser avec MicroPython il doit être porté de C++ à Python. Ce pilote ne comporte pas seulement l'accès à tous les registres du MPU6050 mais aussi des fonctions pour faire marcher le contrôleur de mouvement digital (DMP: Digital Motion Controller) , pour lequel je n'ai trouvé aucune autre information.
Connecter le MPU6050 avec la carte CPU sur les pins Vcc, GND, SDA,SCL et INT.
Exécuter le programme
i2cScan.py et vérifier que le MPU6050 est reconnu sur le bus I2C. On devrait trouver ceci :
Écrire le programme i2cScan.py vous même.
Exercice 2 : Vérification du registre d'identification
Écrire un programme qu'imprime le contenu du registre d'identification (registre WHO_AM_I)
Exercice 3 : Écrire et lire des registres
Créer un programme qui écrit un registre et vérifier que les données ont bien été enregistrés. Utiliser le registre SMPLRT_DIV (adresse 0x19) pour cet essai.
Attention : Après l'enclenchement du MPU6050 ou après un reset (registre PWR_MGMT_1, bit 7) le module se trouve dans un mode d'économie d'énergie ou la plupart des registres ne peuvent pas être modifié. Ceci est indiqué par the bit SLEEP (bit 6) du registre PWR_MGMT_1. Ce bit doit être mis à zéro pour mettre le MPU6050 en fonctionnement normal.
Plusieurs de registres du MPU6050 contiennent soit de bits simples, soit des champs de bits pour contrôler une fonctionnalité du module.
- Créer des fonctions qui lisent ou écrivent les registres
- readByte(register)
- writeByte(register,value)
- readShort(register): lire 2 octets de 2 registres consécutifs, concaténer les résultats et le transformer en valeur int de Python. Les valeurs du MPU6050 sont des valeurs 16 bits avec signe !
- writeShort(register,value): Tranformer la valeur de int a une valeur 16 bits avec signe et l'écrire dans les registres.
- Créer des fonctions qui lisent ou écrivent un bit spécifique dans un registre.
- readBit(register,bitPosition)
- writeBit(register,bitPosition,value)
- Créer des fonctions qui lisent ou écrivent un champ de bits dans un registre
- readBits(register,bitPosition,no_of_bits)
- writeBits(register,bitPosition,no_of_bits,value)
Exercice 4 : Lecture des données
Lire les données brutes de l'accéléromètre et du gyroscope et convertir ces valeurs dans des données physiques (unité : g pour l'accélération et
dps: dégréés par seconde, pour le gyroscope). Est-ce que ces valeurs sont raisonnables ?. Pour l'accélération, on doit trouver 1 g pour la direction vertical, zéro pour les autres.
Attention : Les données du MPU6050 sont des valeurs 16 bit avec signe, qui doivent être convertis en valeurs entier Python.
Modifier la résolution de la mesure (gamme complète : +- 2g, +-4g, +-8g, +-16g) et observer la différence de lecture. Écrire une fonction qui retourne les mesures en unité physique.
Exercice 5 : Écrire les méthodes d'accès pour les registres
En utilisant les fonctions de l'exercice 3, écrire de méthodes d'accès aux registres du MPU6050. Exemples :
- reset(): Device reset. Mettre le bit reset dans le registre MPU9250_RA_PWR_MGMT_1
- getSleep(): Lire lee bit SLEEP du registre MPU9250_RA_PWR_MGMT_1
- setSleep(value): value=True met le MPU6050 en mode veille, value=False le met en mode : opération normale
- getAccelX(): retourne la valeur d'accélération en X
- getAccelY(): retourne la valeur d'accélération en Y
- getAccelZ(): retourne la valeur d'accélération en Z
- getAcceleration() : retourne les valeurs d'accélération en X,Y and Z
- getFullScale, setFullScale,...
Exercice 6 : Calibration
Calibrer le MPU6050.
- Lire les offsets par défaut (après reset). Augmenter les offset en petit pas et lire les valeurs de l'accéléromètre. Trouver l'offset quand la valeur d'accéléromètre passe de négatif à positif (zero crossing)
Si on n'a pas trouvé l'offset (no zero crossing) répéter la procédure en diminuant les offsets en petit pas.
- Calibrer le MPU6050 en utilisant un algorithme PID. Voir l'exemple IMU_Zero.py
Exercice 7 :Le pilote
Étudier le
pilote du MPU6050.
Écrire des programmes qui l'utilisent. Changer la fréquence d'acquisition de données, changer la résolution de l'accéléromètre ou du gyroscope, lire les résultats de mesures…
Exercice 8 : Interruptions mouvement et inactivité
Écrire un programme qui détecte le mouvement et l'inactivité. Générer et capter des interruptions pour les deux cas.
Exercice 9 : Lecture du FiFo
Lire l'accélération et rotation en utilisant le FiFo.
--
Uli Raich - 2022-02-21
Comments