ExerciceMPU6050

Page Actions

MPU6050, un acc\xE9l\xE9rom\xE8tre et gyroscope

Introduction

Le MPU6050 est un circuit int\xE9gr\xE9 qui contient un acc\xE9l\xE9rom\xE8tre et un gyroscope. L'acc\xE9l\xE9rom\xE8tre mesure l\x92acc\xE9l\xE9ration 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\xE9 sur internet est celui de Jeff Rowberg. Ce pilote est \xE9crit en C++ et il est destin\xE9 au SDK Arduino. Pour l'utiliser avec MicroPython il doit \xEAtre port\xE9 de C++ \xE0 Python. Ce pilote ne comporte pas seulement l'acc\xE8s \xE0 tous les registres du MPU6050 mais aussi des fonctions pour faire marcher le contr\xF4leur de mouvement digital (DMP: Digital Motion Controller) , pour lequel je n'ai trouv\xE9 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\xE9cuter le programme i2cScan.py et v\xE9rifier que le MPU6050 est reconnu sur le bus I2C. On devrait trouver ceci :

i2cscan.png

\xC9crire le programme i2cScan.py vous m\xEAme.

Exercice 2 : V\xE9rification du registre d'identification

\xC9crire un programme qu'imprime le contenu du registre d'identification (registre WHO_AM_I)

Exercice 3 : \xC9crire et lire des registres

Cr\xE9er un programme qui \xE9crit un registre et v\xE9rifier que les donn\xE9es ont bien \xE9t\xE9 enregistr\xE9s. Utiliser le registre SMPLRT_DIV (adresse 0x19) pour cet essai.
Attention : Apr\xE8s l'enclenchement du MPU6050 ou apr\xE8s un reset (registre PWR_MGMT_1, bit 7) le module se trouve dans un mode d'\xE9conomie d'\xE9nergie ou la plupart des registres ne peuvent pas \xEAtre modifi\xE9. Ceci est indiqu\xE9 par the bit SLEEP (bit 6) du registre PWR_MGMT_1. Ce bit doit \xEAtre mis \xE0 z\xE9ro pour mettre le MPU6050 en fonctionnement normal.

Plusieurs de registres du MPU6050 contiennent soit de bits simples, soit des champs de bits pour contr\xF4ler une fonctionnalit\xE9 du module.
  • Cr\xE9er des fonctions qui lisent ou \xE9crivent les registres
    • readByte(register)
    • writeByte(register,value)
    • readShort(register): lire 2 octets de 2 registres cons\xE9cutifs, concat\xE9ner les r\xE9sultats 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'\xE9crire dans les registres.
  • Cr\xE9er des fonctions qui lisent ou \xE9crivent un bit sp\xE9cifique dans un registre.
    • readBit(register,bitPosition)
    • writeBit(register,bitPosition,value)
  • Cr\xE9er des fonctions qui lisent ou \xE9crivent 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\xE9es

Lire les donn\xE9es brutes de l'acc\xE9l\xE9rom\xE8tre et du gyroscope et convertir ces valeurs dans des donn\xE9es physiques (unit\xE9 : g pour l'acc\xE9l\xE9ration et dps: d\xE9gr\xE9\xE9s par seconde, pour le gyroscope). Est-ce que ces valeurs sont raisonnables ?. Pour l'acc\xE9l\xE9ration, on doit trouver 1 g pour la direction vertical, z\xE9ro pour les autres.

Attention : Les donn\xE9es du MPU6050 sont des valeurs 16 bit avec signe, qui doivent \xEAtre convertis en valeurs entier Python.

Modifier la r\xE9solution de la mesure (gamme compl\xE8te : +- 2g, +-4g, +-8g, +-16g) et observer la diff\xE9rence de lecture. \xC9crire une fonction qui retourne les mesures en unit\xE9 physique.

Exercice 5 : \xC9crire les m\xE9thodes d'acc\xE8s pour les registres

En utilisant les fonctions de l'exercice 3, \xE9crire de m\xE9thodes d'acc\xE8s 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\xE9ration normale
  • getAccelX(): retourne la valeur d'acc\xE9l\xE9ration en X
  • getAccelY(): retourne la valeur d'acc\xE9l\xE9ration en Y
  • getAccelZ(): retourne la valeur d'acc\xE9l\xE9ration en Z
  • getAcceleration() : retourne les valeurs d'acc\xE9l\xE9ration en X,Y and Z
  • getFullScale, setFullScale,...

Exercice 6 : Calibration

Calibrer le MPU6050.
  • Lire les offsets par d\xE9faut (apr\xE8s reset). Augmenter les offset en petit pas et lire les valeurs de l'acc\xE9l\xE9rom\xE8tre. Trouver l'offset quand la valeur d'acc\xE9l\xE9rom\xE8tre passe de n\xE9gatif \xE0 positif (zero crossing)
    Si on n'a pas trouv\xE9 l'offset (no zero crossing) r\xE9p\xE9ter la proc\xE9dure 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

\xC9tudier le pilote du MPU6050.

\xC9crire des programmes qui l'utilisent. Changer la fr\xE9quence d'acquisition de donn\xE9es, changer la r\xE9solution de l'acc\xE9l\xE9rom\xE8tre ou du gyroscope, lire les r\xE9sultats de mesures\x85

Exercice 8 : Interruptions mouvement et inactivit\xE9

\xC9crire un programme qui d\xE9tecte le mouvement et l'inactivit\xE9. G\xE9n\xE9rer et capter des interruptions pour les deux cas.

Exercice 9 : Lecture du FiFo

Lire l'acc\xE9l\xE9ration et rotation en utilisant le FiFo.

-- %USERSIG{UliRaich - 2022-02-21}%

Comments

 
I Attachment Action Size Date Who Comment
i2cscan.pngpng i2cscan.png manage 27 K 08 May 2022 - 19:09 UnknownUser  
mpu6050.pngpng mpu6050.png manage 167 K 21 Feb 2022 - 15:14 UnknownUser  
Topic revision: r3 - 19 Jun 2022, UliRaich