.. note:: Bonjour et bienvenue dans la Communauté Facebook des passionnés de Raspberry Pi, Arduino et ESP32 de SunFounder ! Plongez plus profondément dans l'univers des Raspberry Pi, Arduino et ESP32 avec d'autres passionnés. **Pourquoi rejoindre ?** - **Support d'experts** : Résolvez les problèmes après-vente et les défis techniques avec l'aide de notre communauté et de notre équipe. - **Apprendre et partager** : Échangez des astuces et des tutoriels pour améliorer vos compétences. - **Aperçus exclusifs** : Accédez en avant-première aux annonces de nouveaux produits et aux aperçus. - **Réductions spéciales** : Profitez de réductions exclusives sur nos produits les plus récents. - **Promotions festives et cadeaux** : Participez à des cadeaux et des promotions de vacances. 👉 Prêt à explorer et à créer avec nous ? Cliquez [|link_sf_facebook|] et rejoignez-nous aujourd'hui ! .. _2.2.9_c: 2.2.9 Module MPU6050 =========================== Introduction ----------------- Le MPU-6050 est le premier et unique dispositif de suivi de mouvement à 6 axes au monde (gyroscope à 3 axes et accéléromètre à 3 axes) conçu pour les smartphones, tablettes et capteurs portables qui possèdent ces caractéristiques, y compris les exigences de faible consommation d'énergie, de faible coût et de haute performance. Dans cette expérience, nous utilisons l'I2C pour obtenir les valeurs du capteur d'accélération à trois axes et du gyroscope à trois axes du MPU6050 et les afficher à l'écran. Composants nécessaires ------------------------------ Dans ce projet, nous avons besoin des composants suivants. .. image:: ../img/list_2.2.6.png Il est certainement pratique d'acheter un kit complet, voici le lien : .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Nom - ARTICLES DANS CE KIT - LIEN * - Kit Raphael - 337 - |link_Raphael_kit| Vous pouvez également les acheter séparément à partir des liens ci-dessous. .. list-table:: :widths: 30 20 :header-rows: 1 * - INTRODUCTION DES COMPOSANTS - LIEN D'ACHAT * - :ref:`cpn_gpio_extension_board` - |link_gpio_board_buy| * - :ref:`cpn_breadboard` - |link_breadboard_buy| * - :ref:`cpn_wires` - |link_wires_buy| * - :ref:`cpn_mpu6050` - |link_mpu6050_buy| Schéma de câblage ----------------- Le MPU6050 communique avec le microcontrôleur via l'interface de bus I2C. Le SDA1 et le SCL1 doivent être connectés à la broche correspondante. .. image:: ../img/image330.png Procédures expérimentales ---------------------------------- **Étape 1 :** Construire le circuit. .. image:: ../img/image227.png **Étape 2** : Configurer l'I2C (voir l'annexe :ref:`i2c_config`. Si vous avez déjà configuré l'I2C, passez cette étape.) **Étape 3 :** Aller dans le dossier du code. .. raw:: html .. code-block:: cd ~/raphael-kit/c/2.2.9/ **Étape 4 :** Compiler le code. .. raw:: html .. code-block:: gcc 2.2.9_mpu6050.c -lwiringPi -lm **Étape 5 :** Exécuter le fichier exécutable. .. raw:: html .. code-block:: sudo ./a.out Après l'exécution du code, l'angle de déviation des axes x et y, ainsi que l'accélération et la vitesse angulaire sur chaque axe lus par le MPU6050 seront affichés à l'écran après calcul. .. note:: * Si vous obtenez une erreur avec le message ``wiringPi.h: No such file or directory``, veuillez vous référer à :ref:`install_wiringpi`. * Si vous obtenez l'erreur ``Unable to open I2C device: No such file or directory``, vous devez consulter :ref:`i2c_config` pour activer l'I2C et vérifier si le câblage est correct. **Code** .. code-block:: c #include #include #include #include int fd; int acclX, acclY, acclZ; int gyroX, gyroY, gyroZ; double acclX_scaled, acclY_scaled, acclZ_scaled; double gyroX_scaled, gyroY_scaled, gyroZ_scaled; int read_word_2c(int addr) { int val; val = wiringPiI2CReadReg8(fd, addr); val = val << 8; val += wiringPiI2CReadReg8(fd, addr+1); if (val >= 0x8000) val = -(65536 - val); return val; } double dist(double a, double b) { return sqrt((a*a) + (b*b)); } double get_y_rotation(double x, double y, double z) { double radians; radians = atan2(x, dist(y, z)); return -(radians * (180.0 / M_PI)); } double get_x_rotation(double x, double y, double z) { double radians; radians = atan2(y, dist(x, z)); return (radians * (180.0 / M_PI)); } int main() { fd = wiringPiI2CSetup (0x68); wiringPiI2CWriteReg8 (fd,0x6B,0x00);//disable sleep mode printf("set 0x6B=%X\n",wiringPiI2CReadReg8 (fd,0x6B)); while(1) { gyroX = read_word_2c(0x43); gyroY = read_word_2c(0x45); gyroZ = read_word_2c(0x47); gyroX_scaled = gyroX / 131.0; gyroY_scaled = gyroY / 131.0; gyroZ_scaled = gyroZ / 131.0; //Print values for the X, Y, and Z axes of the gyroscope sensor. printf("My gyroX_scaled: %f\n", gyroY X_scaled); printf("My gyroY_scaled: %f\n", gyroY Y_scaled); printf("My gyroZ_scaled: %f\n", gyroY Z_scaled); acclX = read_word_2c(0x3B); acclY = read_word_2c(0x3D); acclZ = read_word_2c(0x3F); acclX_scaled = acclX / 16384.0; acclY_scaled = acclY / 16384.0; acclZ_scaled = acclZ / 16384.0; //Print the X, Y, and Z values of the acceleration sensor. printf("My acclX_scaled: %f\n", acclX_scaled); printf("My acclY_scaled: %f\n", acclY_scaled); printf("My acclZ_scaled: %f\n", acclZ_scaled); printf("My X rotation: %f\n", get_x_rotation(acclX_scaled, acclY_scaled, acclZ_scaled)); printf("My Y rotation: %f\n", get_y_rotation(acclX_scaled, acclY_scaled, acclZ_scaled)); delay(100); } return 0; } **Explication du code** .. code-block:: c int read_word_2c(int addr) { int val; val = wiringPiI2CReadReg8(fd, addr); val = val << 8; val += wiringPiI2CReadReg8(fd, addr+1); if (val >= 0x8000) val = -(65536 - val); return val; } Lecture des données du capteur envoyées par le MPU6050. .. code-block:: c double get_y_rotation(double x, double y, double z) { double radians; radians = atan2(x, dist(y, z)); return -(radians * (180.0 / M_PI)); } Obtention de l'angle de déviation sur l'axe Y. .. code-block:: c double get_x_rotation(double x, double y, double z) { double radians; radians = atan2(y, dist(x, z)); return (radians * (180.0 / M_PI)); } Calcul de l'angle de déviation de l'axe X. .. code-block:: c gyroX = read_word_2c(0x43); gyroY = read_word_2c(0x45); gyroZ = read_word_2c(0x47); gyroX_scaled = gyroX / 131.0; gyroY_scaled = gyroY / 131.0; gyroZ_scaled = gyroZ / 131.0; //Print values for the X, Y, and Z axes of the gyroscope sensor. printf("My gyroX_scaled: %f\n", gyroY X_scaled); printf("My gyroY_scaled: %f\n", gyroY Y_scaled); printf("My gyroZ_scaled: %f\n", gyroY Z_scaled); Lecture des valeurs des axes x, y et z sur le capteur gyroscopique, conversion des métadonnées en valeurs de vitesse angulaire, puis impression de celles-ci. .. code-block:: c acclX = read_word_2c(0x3B); acclY = read_word_2c(0x3D); acclZ = read_word_2c(0x3F); acclX_scaled = acclX / 16384.0; acclY_scaled = acclY / 16384.0; acclZ_scaled = acclZ / 16384.0; //Print the X, Y, and Z values of the acceleration sensor. printf("My acclX_scaled: %f\n", acclX_scaled); printf("My acclY_scaled: %f\n", acclY_scaled); printf("My acclZ_scaled: %f\n", acclZ_scaled); Lecture des valeurs des axes x, y et z sur le capteur d'accélération, conversion des métadonnées en valeurs de vitesse accélérée (unité de gravité), puis impression de celles-ci. .. code-block:: c printf("My X rotation: %f\n", get_x_rotation(acclX_scaled, acclY_scaled, acclZ_scaled)); printf("My Y rotation: %f\n", get_y_rotation(acclX_scaled, acclY_scaled, acclZ_scaled)); Impression des angles de déviation des axes x et y. Image du phénomène ----------------------- .. image:: ../img/image228.jpeg