Note

Bonjour, bienvenue dans la communauté SunFounder pour les passionnés de Raspberry Pi, Arduino et ESP32 sur Facebook ! Plongez dans l’univers de Raspberry Pi, Arduino et ESP32 avec d’autres passionnés.

Pourquoi nous rejoindre ?

  • Support d’experts : Résolvez les problèmes après-vente et relevez les défis techniques grâce à l’aide de notre communauté et de notre équipe.

  • Apprendre & Partager : Échangez des conseils et tutoriels pour perfectionner vos compétences.

  • Aperçus exclusifs : Obtenez un accès anticipé aux nouvelles annonces de produits et à des avant-premières.

  • Réductions spéciales : Bénéficiez de réductions exclusives sur nos derniers produits.

  • Promotions festives et concours : Participez à des concours et promotions pendant les fêtes.

👉 Prêt à explorer et à créer avec nous ? Cliquez sur [Ici] et rejoignez-nous dès aujourd’hui !

2.2.6 Module MPU6050

Introduction

Le MPU-6050 est le premier et le seul dispositif de suivi de mouvement à 6 axes au monde (3 axes de gyroscope et 3 axes d’accéléromètre), conçu pour les smartphones, les tablettes et les capteurs portables répondant aux exigences de faible consommation, de faible coût et de haute performance.

Dans cette expérience, nous utiliserons le bus I2C pour obtenir les valeurs du capteur d’accélération et du gyroscope du MPU6050 et les afficherons à l’écran.

Composants nécessaires

Dans ce projet, nous aurons besoin des composants suivants :

../_images/2.2.6_mpu6050_list.png

Schéma de câblage

Le module MPU6050 communique avec le microcontrôleur via l’interface de bus I2C. Les broches SDA1 et SCL1 doivent être connectées aux broches correspondantes.

../_images/2.2.6_mpu6050_schematic.png

Procédure expérimentale

Étape 1 : Montez le circuit.

../_images/2.2.6_mpu6050_circuit.png

Étape 2 : Configurez l’I2C (consultez l’annexe Configuration I²C. Si l’I2C est déjà configuré, ignorez cette étape.)

Étape 3 : Accédez au dossier du code.

cd ~/davinci-kit-for-raspberry-pi/python-pi5

Étape 4 : Exécutez le fichier exécutable.

sudo python3 2.2.6_mpu6050.py

Lorsque le code est exécuté, l’angle de déviation des axes x et y, ainsi que l’accélération et la vitesse angulaire sur chaque axe, seront calculés puis affichés à l’écran.

Note

  • Si vous obtenez l’erreur FileNotFoundError: [Errno 2] No such file or directory: '/dev/i2c-1', vous devez vous référer à Configuration I²C pour activer l’I2C.

  • Si vous obtenez l’erreur ModuleNotFoundError: No module named 'smbus2', exécutez la commande sudo apt install python3-smbus2.

  • Si l’erreur OSError: [Errno 121] Remote I/O error apparaît, cela signifie que le module est mal câblé ou endommagé.

Avertissement

En cas de message d’erreur RuntimeError: Cannot determine SOC peripheral base address, veuillez consulter Si gpiozero ne fonctionne pas..

Code

Note

Vous pouvez Modifier/Réinitialiser/Copier/Exécuter/Arrêter le code ci-dessous. Mais avant cela, vous devez accéder au chemin source du code, comme davinci-kit-for-raspberry-pi/python-pi5. Après avoir modifié le code, vous pouvez l’exécuter directement pour voir l’effet.

import smbus
import math
import time

# Registres de gestion de l'alimentation
power_mgmt_1 = 0x6b
power_mgmt_2 = 0x6c

def read_byte(adr):
    return bus.read_byte_data(address, adr)

def read_word(adr):
    high = bus.read_byte_data(address, adr)
    low = bus.read_byte_data(address, adr+1)
    val = (high << 8) + low
    return val

def read_word_2c(adr):
    val = read_word(adr)
    if (val >= 0x8000):
        return -((65535 - val) + 1)
    else:
        return val

def dist(a,b):
    return math.sqrt((a*a)+(b*b))

def get_y_rotation(x,y,z):
    radians = math.atan2(x, dist(y,z))
    return -math.degrees(radians)

def get_x_rotation(x,y,z):
    radians = math.atan2(y, dist(x,z))
    return math.degrees(radians)


bus = smbus.SMBus(1) # Initialisation du bus I2C
address = 0x68       # Adresse obtenue avec la commande i2cdetect

# Sortir le MPU6050 du mode veille
bus.write_byte_data(address, power_mgmt_1, 0)

while True:
    time.sleep(0.1)
    gyro_xout = read_word_2c(0x43)
    gyro_yout = read_word_2c(0x45)
    gyro_zout = read_word_2c(0x47)

    print ("gyro_xout : ", gyro_xout, " scaled: ", (gyro_xout / 131))
    print ("gyro_yout : ", gyro_yout, " scaled: ", (gyro_yout / 131))
    print ("gyro_zout : ", gyro_zout, " scaled: ", (gyro_zout / 131))

    accel_xout = read_word_2c(0x3b)
    accel_yout = read_word_2c(0x3d)
    accel_zout = read_word_2c(0x3f)

    accel_xout_scaled = accel_xout / 16384.0
    accel_yout_scaled = accel_yout / 16384.0
    accel_zout_scaled = accel_zout / 16384.0

    print ("accel_xout: ", accel_xout, " scaled: ", accel_xout_scaled)
    print ("accel_yout: ", accel_yout, " scaled: ", accel_yout_scaled)
    print ("accel_zout: ", accel_zout, " scaled: ", accel_zout_scaled)

    print ("x rotation: " , get_x_rotation(accel_xout_scaled, accel_yout_scaled, accel_zout_scaled))
    print ("y rotation: " , get_y_rotation(accel_xout_scaled, accel_yout_scaled, accel_zout_scaled))

    time.sleep(1)

Explication du code

  1. Lire les données envoyées par le MPU6050.

    def read_word(adr):
        high = bus.read_byte_data(address, adr)
        low = bus.read_byte_data(address, adr+1)
        val = (high << 8) + low
        return val
    
    def read_word_2c(adr):
        val = read_word(adr)
        if (val >= 0x8000):
            return -((65535 - val) + 1)
        else:
            return val
    
  2. Calculer l’angle de déviation sur l’axe y.

    def get_y_rotation(x,y,z):
        radians = math.atan2(x, dist(y,z))
        return -math.degrees(radians)
    
  3. Calculer l’angle de déviation sur l’axe x.

    def get_x_rotation(x,y,z):
        radians = math.atan2(y, dist(x,z))
        return math.degrees(radians)
    
  4. Lire les valeurs des axes x, y et z du gyroscope, convertir les données en vitesse angulaire et les afficher.

    gyro_xout = read_word_2c(0x43)
    gyro_yout = read_word_2c(0x45)
    gyro_zout = read_word_2c(0x47)
    
    print ("gyro_xout : ", gyro_xout, " scaled: ", (gyro_xout / 131))
    print ("gyro_yout : ", gyro_yout, " scaled: ", (gyro_yout / 131))
    print ("gyro_zout : ", gyro_zout, " scaled: ", (gyro_zout / 131))
    
  5. Lire les valeurs des axes x, y et z de l’accéléromètre, convertir les données en accélération (en unités de gravité) et les afficher.

    accel_xout = read_word_2c(0x3b)
    accel_yout = read_word_2c(0x3d)
    accel_zout = read_word_2c(0x3f)
    
    accel_xout_scaled = accel_xout / 16384.0
    accel_yout_scaled = accel_yout / 16384.0
    accel_zout_scaled = accel_zout / 16384.0
    
    print ("accel_xout: ", accel_xout, " scaled: ", accel_xout_scaled)
    print ("accel_yout: ", accel_yout, " scaled: ", accel_yout_scaled)
    print ("accel_zout: ", accel_zout, " scaled: ", accel_zout_scaled)
    
  6. Afficher les angles de déviation sur les axes x et y.

    print ("x rotation: " , get_x_rotation(accel_xout_scaled, accel_yout_scaled, accel_zout_scaled))
    print ("y rotation: " , get_y_rotation(accel_xout_scaled, accel_yout_scaled, accel_zout_scaled))