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é
Créer un horizon artificiel avec la classe TwiBno055 La centrale inertielle électronique BNO055 de mise en œuvre grandement simplifiée via la classe TwiBno055 dédiée, permet comme son équivalent mécanique, de détecter des mouvements sur les 3 axes de navigation. Équipé d'un puissant calculateur interne et d'un algorithme de fusion performant, ce composant propose des données résultantes absolues, au sens où elles ne sont pas influencées et perturbées par les mouvements du composant dans l'espace, et en abstraction par rapport à l'accélération de la pesanteur. Le composant BNO055 dispose également de magnétomètres dont l'application principale est la détection du champ magnétique terrestre. 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)
Les meilleures performances du composant BNO055 sont exploitées avec simplicité via la classe TwiBno055 afin de réaliser des applications notamment en robotique terrestre et aérienne les plus élaborées. De nombreuses données sont disponibles avec la classe TwiBno055 que vous pouvez utiliser dans le fonctionnement de vos projets les plus complexes et variés. Représentation des données : Noms des variables, intervalles, et unités de mesure :
gx = ± 39.2266m/s²
gy = ± 39.2266m/s²
gz = ± 39.2266m/s²
tx = ± 39.2266m/s²
ty = ± 39.2266m/s²
tz = ± 39.2266m/s²
rx = ± 2000°/s
ry = ± 2000°/s
rz = ± 2000°/s
mx = ± 1300µT
my = ± 1300µT
mz = ± 2500µT
qw = ± 1 (sans unité)
qx = ± 1 (sans unité)
qy = ± 1 (sans unité)
qz = ± 1 (sans unité)
pitch = ± 180° angulaires
pitchAero = ± 90° angulaires
roll = ± 180° angulaires
rollAero = ± 90° angulaires
compass = ± 180° angulaires
north = faux ou vrai (magnétomètre non calibré ou calibré)
temperature = -40°C à +85°C
Exemple d'utilisation de la classe TwiBno055 : #include <TwiBno055.h> int main() { TwiBno055 myInertialUnit = TwiBno055 (0x29); while (true) { myInertialUnit.read(); //myInertialUnit.gx représente l'accélération de la pesanteur sur l'axe x //myInertialUnit.gy représente l'accélération de la pesanteur sur l'axe y //myInertialUnit.gz représente l'accélération de la pesanteur sur l'axe z //myInertialUnit.tx représente l'accélération latérale sur l'axe x //myInertialUnit.ty représente l'accélération longitudinale sur l'axe y //myInertialUnit.tz représente l'accélération verticale sur l'axe z //myInertialUnit.rx représente la vitesse de rotation sur l'axe x //myInertialUnit.ry représente la vitesse de rotation sur l'axe y //myInertialUnit.rz représente la vitesse de rotation sur l'axe z //myInertialUnit.mx représente l'induction électromagnétique sur l'axe x //myInertialUnit.my représente l'induction électromagnétique sur l'axe y //myInertialUnit.mz représente l'induction électromagnétique sur l'axe z //myInertialUnit.qw représente le quaternion w //myInertialUnit.qx représente le quaternion x //myInertialUnit.qy représente le quaternion y //myInertialUnit.qz représente le quaternion z //myInertialUnit.pitch représente l'axe de tangage sur une rotation complète //myInertialUnit.pitchAero représente l'axe de tangage sur deux demi-rotations symétriques //myInertialUnit.roll représente l'axe de roulis sur une rotation complète //myInertialUnit.rollAero représente l'axe de roulis sur deux demi-rotations symétriques //myInertialUnit.compass représente la direction par rapport au Nord magnétique //myInertialUnit.north représente la calibration du magnétomètre //myInertialUnit.temperature représente la température dans le composant } return 0; } Dans cet exemple, un objet myInertialUnit de type TwiBno055 est déclaré, en paramètre est indiqué l'adresse 0x29 du composant BNO055 sur le bus TWI : Si vous ne connaissez pas l'adresse TWI du composant BNO055 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 BNO055. Cette action met à jour les variables gx, gy, gz, tx, ty, tz, rx, ry, rz, mx, my, mz, qw, qx, qy, qz, pitch, pitchAero, roll, rollAero, compass, north, 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 BNO055, vous pouvez utiliser les fonction readGravity, readTranslation, readRotation, readQuaternion, readMagnetism, readHorizon, readDirection, et readTemperature qui respectivement permettent d'effectuer uniquement la lecture des 3 axes de gravité, des 3 axes de translation, des 3 axes de rotation, des 3 axes de magnétisme, des 4 axes de quaternion, des 2 axes d'assiette (l'horizon artificiel), du cap (la boussole) et de la calibration du magnétomètre, 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 gravité, la translation, la rotation, les quaternions, le magnétisme, l'assiette, le cap, ou la température. Le BNO055 est adapté pour les applications qui requièrent une centrale inertielle avec des données absolues, un horizon artificiel, et une boussole. Les données d'horizon artificiel : Les variables pitch, pitchAero, roll, et rollAero représentent l'assiette, soit l'horizon artificiel. Les données des variables pitch et roll débattent sur ± 180° angulaires, alors que les données des variables pitchAero et rollAero débattent sur ± 90° angulaires, pour exemple ceci trouve son utilité en aéronautique : Imaginons un avion en vol inversé et en piqué avec une inclinaison de 45° angulaires par rapport au sol. Le pilote automatique reprenant les commandes afin de remettre l'aéronef à plat, si l'axe de tangage est réglé sur ± 180° angulaires, le plus court chemin avec le vol à plat, soit le 0° angulaire, est de rattraper l'assiette avec une action cabreur, ce qui fait parcourir seulement 135° angulaires au lieu de 225° angulaires si l'action était piqueur. Si l'avion est proche du sol, le crash est inévitable. En revanche, si l'axe de tangage est réglé sur ± 90° angulaires, une remise à plat de l'avion ne demande de parcourir que 45° angulaires. Une fois cette action effectuée, l'avion est en vol horizontal mais toujours sur le dos (vol inversé), une action d'un demi-tour sur l'axe de roulis est moins périlleuse et permet de rétablir le vol à plat. Pour le maintient de l'assiette d'un tel aéronef, il est donc recommandé d'utiliser ± 90° angulaires pour l'axe de tangage, soit la variable pitchAero, et ± 180° angulaires pour l'axe de roulis, soit la variable roll. De même, un risque important existe si vous utilisez ± 90° angulaires pour l'axe de tangage et également de roulis, l'avion risque fortement dans certaines situations de se retrouver en vol inversé, et le pilote automatique n'y pourra rien, il aura fait ses corrections pour revenir à plat ! Dans vos projets avec horizon artificiel, il est donc primordial d'utiliser les variables adaptées à l'application demandée, et de s'interroger sur les actions à effectuer pour une remise à plat dans certaines situations. Les données de direction par rapport au Nord magnétique : La variable compass représente la boussole, soit la direction par rapport au Nord magnétique. Cette donnée débat de ± 180° angulaires, le 0° angulaire étant la direction du Nord magnétique. Cette donnée n'est valide que lorsque les magnétomètres du composant BNO055 sont calibrés, ce qui s'obtient en effectuant quelques mouvements circulaires avec celui-ci : Au démarrage du BNO055, la direction du Nord magnétique est fausse, et est indiquée explicitement par la variable north avec la valeur false (faux). Pour effectuer la calibration des magnétomètres, effectuez quelques mouvements en huit avec le composant BNO055 afin qu'il enregistre une cartographie du magnétisme. Une fois la calibration réalisée, la variable north sera true (vrai), ce qui signifie que l'indication du Nord magnétique accessible avec la variable compass est valide. Attention, le Nord magnétique ne doit pas être confondu avec le Nord géographique, les deux non ni la même direction, ni le même sens. Références : Récapitulatif des fonctions et variables de cette classe : float gx = 0; float gy = 0; float gz = 0; float tx = 0; float ty = 0; float tz = 0; float rx = 0; float ry = 0; float rz = 0; float mx = 0; float my = 0; float mz = 0; float qw = 0; float qx = 0; float qy = 0; float qz = 0; float pitch = 0; float pitchAero = 0; float roll = 0; float rollAero = 0; float compass = 0; bool north = false; signed int temperature = 0; TwiBno055 (const unsigned char DEVICE); void read(); void readGravity(); void readTranslation(); void readRotation(); void readQuaternion(); void readMagnetism(); void readHorizon(); void readDirection(); void readTemperature();