.. 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 [|link_sf_facebook|] et rejoignez-nous dès aujourd'hui ! .. _2.2.6_py_pi5: 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 : .. image:: ../python_pi5/img/2.2.6_mpu6050_list.png .. raw:: html
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. .. image:: ../python_pi5/img/2.2.6_mpu6050_schematic.png Procédure expérimentale -------------------------- **Étape 1 :** Montez le circuit. .. image:: ../python_pi5/img/2.2.6_mpu6050_circuit.png **Étape 2 :** Configurez l'I2C (consultez l'annexe :ref:`i2c_config`. Si l'I2C est déjà configuré, ignorez cette étape.) **Étape 3 :** Accédez au dossier du code. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/python-pi5 **Étape 4 :** Exécutez le fichier exécutable. .. raw:: html .. code-block:: 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 à :ref:`i2c_config` 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é. .. warning:: En cas de message d'erreur ``RuntimeError: Cannot determine SOC peripheral base address``, veuillez consulter :ref:`faq_soc`. **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. .. raw:: html .. code-block:: python 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** #. Lire les données envoyées par le MPU6050. .. code-block:: python 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 #. Calculer l'angle de déviation sur l'axe y. .. code-block:: python def get_y_rotation(x,y,z): radians = math.atan2(x, dist(y,z)) return -math.degrees(radians) #. Calculer l'angle de déviation sur l'axe x. .. code-block:: python def get_x_rotation(x,y,z): radians = math.atan2(y, dist(x,z)) return math.degrees(radians) #. Lire les valeurs des axes x, y et z du gyroscope, convertir les données en vitesse angulaire et les afficher. .. code-block:: python 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)) #. 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. .. code-block:: python 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) #. Afficher les angles de déviation sur les axes x et y. .. code-block:: python 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))