Tags:
create new tag
view all tags

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. mpu6050.png

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.

MPU6050 WeMos D1 bus GPIO
Vcc 5V  
GND GND  
SCL D1 22
SDA D2 21
INT D0 26

Exécuter le programme i2cScan.py et vérifier que le MPU6050 est reconnu sur le bus I2C. On devrait trouver ceci :

i2cscan.png

É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

Topic attachments
I Attachment History Action Size Date Who Comment
PNGpng i2cscan.png r1 manage 27.4 K 2022-05-08 - 19:09 UliRaich  
PNGpng mpu6050.png r1 manage 167.5 K 2022-02-21 - 15:14 UliRaich  
Edit | Attach | Watch | Print version | History: r3 < r2 < r1 | Backlinks | Raw View | Raw edit | More topic actions
Topic revision: r3 - 2022-06-19 - UliRaich
 
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2022 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback