Sylvain Mahé Le site Web Retour à l'accueil Principes Partager mes idées et mes projets librement et gratuitement. Thématiques Mécatronique du système embarqué, artisanat pluridisciplinaire, bricolage commun, esthétique logicielle et matérielle, minimalisme fonctionnel, conceptualisation alternative, rédaction technique et littéraire, partage pédagogique documenté. Contact ✆ Téléphone : 06.45.49.96.98
✉ E-mail : contact@sylvainmahe.site
✎ Site Web : sylvainmahe.site
Écriture de la page : Sylvain Mahé
Mesurer des mouvements avec la classe TwiMpu6050 Le composant MPU6050 est une centrale inertielle électronique qui, à l'instar de l'équivalent mécanique, permet de détecter des mouvements sous la forme de vitesses angulaires et d'accélérations latérales (x), longitudinales (y), et verticales (z). Ce composant communique en TWI (pour "Two Wire Interface" ou interface à deux fils) à la vitesse de 400KHz avec le microcontrôleur. Ports des automates programmables concernés par le TWI : Automate programmable MODULABLE 20 :
- Port GPIO 19 (PC4) = SDA (serial data line)
- Port GPIO 20 (PC5) = SCL (serial clock line)

Automate programmable MODULABLE 32 :
- Port GPIO 17 (PC0) = SCL (serial clock line)
- Port GPIO 18 (PC1) = SDA (serial data line)
La classe TwiMpu6050 simplifie grandement la mise en œuvre de ce composant complexe tout en y exploitant les meilleures performances afin de réaliser des applications notamment en robotique terrestre et aérienne les plus pointues. Le composant MPU6050 est équipé d'accéléromètres, de gyroscopes, et d'un calculateur intégré qui offre l'avantage de pouvoir dissocier les différents axes à l'aide d'algorithmes qui travaillent avec toutes les données des capteurs, de sorte qu'avec la classe TwiMpu6050 vous disposez des variables représentant les axes de translation nommés tx, ty, et tz, ainsi que des axes de rotation nommés rx, ry, et rz. Le MPU6050 dispose également d'un capteur de température : Pour compenser les dilatations thermiques des accéléromètres et des gyroscopes causées par les variations de température, le MPU6050 est équipé d'un capteur de température dont la valeur est accessible depuis la variable temperature de l'objet instancié correspondant. Représentation des données : Noms des variables, intervalles, et unités de mesure :
tx = ± 16g
ty = ± 16g
tz = ± 16g
rx = ± 2000°/s
ry = ± 2000°/s
rz = ± 2000°/s
temperature = -40°C à +85°C
Les accélérations en translation tx, ty, et tz sont exprimées en nombre de g (1g étant égal à l'accélération de la pesanteur à la surface de la Terre). Les vitesses angulaires rx, ry, et rz sont exprimées en degrés angulaires par seconde. La température est exprimée en degrés Celsius. Exemple d'utilisation de la classe TwiMpu6050 : #include <TwiMpu6050.h> int main() { TwiMpu6050 myInertialUnit = TwiMpu6050 (0x69); while (true) { myInertialUnit.read(); //myInertialUnit.tx représente la translation sur l'axe x //myInertialUnit.ty représente la translation sur l'axe y //myInertialUnit.tz représente la translation sur l'axe z //myInertialUnit.rx représente la rotation sur l'axe x //myInertialUnit.ry représente la rotation sur l'axe y //myInertialUnit.rz représente la rotation sur l'axe z //myInertialUnit.temperature représente la température dans le composant } return 0; } Dans cet exemple, un objet myInertialUnit de type TwiMpu6050 est déclaré, en paramètre est indiqué l'adresse 0x69 du composant MPU6050 sur le bus TWI : Si vous ne connaissez pas l'adresse TWI du composant MPU6050 et que ce dernier est le seul périphérique connecté au bus TWI, vous pouvez indiquer 0 en paramètre, car en interne une fonction se chargera d'effectuer une recherche et de trouver l'adresse du périphérique automatiquement. Puis dans la boucle while la fonction read associée à l'objet myInertialUnit est appelée, ce qui permet de lire la totalité des capteurs du composant MPU6050. Cette action met à jour les variables tx, ty, tz, rx, ry, rz, et temperature relatives à l'objet myInertialUnit. Vous pouvez utiliser ces variables à la suite dans votre programme. Autres fonctions utiles : En supplément de la fonction read qui effectue la lecture de tous les capteurs du composant MPU6050, vous pouvez utiliser les fonction readTranslation, readRotation, et readTemperature qui respectivement permettent d'effectuer uniquement la lecture des 3 axes de translation, des 3 axes de rotation, ou seulement de la température. Ces fonctions offrent l'avantage comparativement à la fonction read d'être plus rapides d'exécution si vous avez besoin seulement de connaître la translation, la rotation, ou la température. Stabilisation d'un aéronef : Si vous souhaitez stabiliser les différents axes d'un aéronef, la centrale inertielle MPU6050 est toute indiquée. Exemple d'asservissement d'un servo-moteur avec le composant MPU6050 afin de stabiliser un axe d'un aéronef : #include <TwiMpu6050.h> #include <PwmWrite.h> #include <Math.h> int main() { TwiMpu6050 myInertialUnit = TwiMpu6050 (0x68); PwmWrite myServo = PwmWrite (1); PwmWrite::start (50); while (true) { myInertialUnit.read(); //ci-dessous la largeur d'impulsion du signal PWM qui asservi le servo-moteur va varier en fonction de l'axe rx de la centrale inertielle myServo.us (Math::curve (-100, myInertialUnit.rx, 100, 1000, 2000, 0)); } return 0; } Dans cet exemple le servo-moteur pourrait commander la gouverne aérodynamique d'un avion, le MPU6050 détecterait alors les mouvements du fuselage et pourrait les compenser en temps réel en envoyant les bons ordres aux bons moments avec la bonne amplitude (via quelques réglages de suivi de la consigne, de débattements, et de sens des commandes) pour conserver une trajectoire rectiligne de l'aéronef. Libre à vous d'utiliser toutes les capacités en précision et en rapidité de la centrale inertielle MPU6050 à l'aide de la classe dédiée TwiMpu6050. Références : Récapitulatif des fonctions et variables de cette classe : float tx = 0; float ty = 0; float tz = 0; float rx = 0; float ry = 0; float rz = 0; float temperature = 0; TwiMpu6050 (const unsigned char DEVICE); void read(); void readTranslation(); void readRotation(); void readTemperature();