Quantcast
Channel: Framboise 314, le Raspberry Pi à la sauce française….
Viewing all articles
Browse latest Browse all 1015

Evaluation du LSM9DS1, un capteur 9 degrés de liberté

$
0
0

LSM9DS1_250pxJ’ai l’ambition de réaliser un horizon artificiel en particulier pour l’ULM de mon ami Thierry dont vous pouvez suivre l’évolution et la conception sur la page ulmminimalist 🙂
Pour mémoire un horizon artificiel est un indicateur d’attitude qui visualise les angles de tangage et de roulis de l’avion tel que celui qui est représenté ci-dessous :

Un horizon artificiel à base de Raspberry Pi

 

VMS_Artificial_Horizon

Horizon artificiel

Le capteur LSM9D1

Cet horizon pourrait être réalisé en utilisant un Raspberry Pi0, un afficheur graphique d’environ 3 pouces (7,6 cm) de diagonale et un capteur LSM9DS1.

La première étape consiste à évaluer le capteur LSM9DS1 qui sera le cœur de l’instrument, de quantifier la précision des données et d’effectuer la calibration.

Présentation du LSM9DS1

Le LSM9DS1 est un capteur à 9 degrés de liberté, c’est à dire qu’il mesure l’accélération sur 3 axes, la rotation sur 3 axes et enfin le champ magnétique, toujours sur 3 axes.

lsm9ds1_axesC’est un capteur très sophistiqué qui offre de multiples possibilités de mise en œuvre : déclenchement d’interruptions, mise en sommeil, bufferisation de données… Pour l’évaluation toutes ces options ne nous intéressent pas et on ne retrouvera pas ces possibilités dans le logiciel.

Montage hardware

Pour l’évaluation j’utilise un module de sparkfun : https://www.sparkfun.com/products/13284

module sparkfunCe module est câblé par défaut en I2C c’est à dire qu’il suffit de relier 4 fils sur le connecteur : 0 et +3,3V ainsi que les deux fils de communication du bus I2C. J’utilise des cartes protos mais il est bien sûr possible de réaliser une connexion directe.

LSM9DS1_2

Prérequis logiciels

Comme j’ai une longue habitude du langage Pascal et du développement Delphi sous Windows, je vais utiliser l’IDE Lazarus. J’ai aussi choisi d’enregistrer des séquences de mesures en utilisant la base de données SQLite.

En résumé on va installer le compilateur Free Pascal fpc, Lazarus et la base de données sqlite par la séquence suivante :

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install fpc
sudo apt-get install lazarus
sudo apt-get install sqlite3 libsqlite3-dev

Sur mon Rpi 3 tout c’est passé sans souci et je retrouve Lazarus dans la rubrique Programmation du Menu.

Enfin il ne faut pas oublier d’activer l’interface i2c-1 qui ne l’est pas par défaut. Il suffit de cocher l’option dans l’écran Menu >> Préférences>> Configuration du Raspberry Pi.

ConfigPi

Le logiciel

La plupart des lecteurs de ce site ne sont sans doute pas familier avec le langage Pascal objet et Lazarus. Le but de cet article n’est pas de faire un tuto mais je vais commenter les grandes lignes du logiciel.

Les briques de base

L’accès I2C

L’unité LocalBus_Ctlr.pas assure l’accès de bas niveau au bus I2C. L’unité devra également gérer à terme le bus SPI, un début d’implémentation est dans le code. J’ai implémenté une classe générique abstraite qui permet au capteur d’accéder aux registres de façon transparente qu’on l’ait câblé en I2C ou en SPI. Dans tous les cas on dispose des fonctions de base :

  • lecture d’un registre par son adresse : function GetRegisterValue(DevReg: byte): byte;
  • écriture d’un registre : procedure SetRegisterValue(DevReg: byte; RegVal: byte);
  • lecture d’un bloc de données : procedure GetRegistersValues(DevReg: byte; var RegsVals: array of byte);
Nota
L’unité sensor_types définit les types de données qu’on va manipuler, par exemple un vecteur (X, Y, Z) de nombres flottant en simple précision (7 à 8 chiffres significatifs ce qui est largement suffisant). La déclaration :
Int16_4IO = record
   case RawInput: boolean of
      True: (bytes: array[0..1] of byte);
      False: (intValue: Int16);
   end;

permet un accès au choix des octets (bytes) ou d’une valeur entière (intValue sur 2 octets) et nous évite le transcodage : on recopie les registres du capteur dans la table des octets et on lit directement la valeur entière sur 16 bits.

Le module d’enregistrement sqlite

sqlite370_bannerCela peut sembler complexe d’utiliser une structure de base de données pour enregistrer nos mesures. Le but est de poser les bases d’un outil d’enregistrement souple et capable de gérer un volume important de données comme par exemple un enregistreur de vol. Et cela nous permet de constater tout l’intérêt des composants standards de Lazarus qui font que le codage de cette fonction ne demande que quelques dizaines de lignes.

Les fonctions

  • Initalisation : constructor Create(AOwner: TComponent; ADB: string) permet de créer le fichier de base de données. J’ai créé le dossier MLogs sous /home/pi. Le fichier LSM9DS1Calibration.s3db sera créé pour l’enregistrement des mesures.
  • La procédure CreateDataTable(TableDescriptor: TDataTableDescriptor): permet de créer la table d’enregistrement des données. La première colonne est obligatoirement la date/heure de l’enregistrement. On passe en paramètre la liste des noms de colonnes à créer, liste simplement constituée des noms des colonnes.
  • La procédure RecordDatas(ATime: TDateTime; Datas: array of single) qui va enregistrer une ligne de données : il suffit de passer en paramètre la date/heure et la liste des valeurs.

Le module LSM9DS1

C’est le module qui va nous permettre d’accéder aux capteurs en masquant la complexité de la mise en œuvre et aussi de nous fournir des données corrigées et dans le format souhaité.

 

Nota
Pour le traitement de grandeur physique j’utilise systématiquement les unités SI en interne. Si besoin c’est au moment de l’affichage que je réalise la conversion d’unité pour l’affichage (Y en a qui ont essayé autrement, ils ont eu des problèmes : plantage de fusée, de sonde spatiale).

Ce module permet

  • L’accès en écriture et lecture des registres par leur symbole : property Register[r: TLSM9DS1_Regs]: byte read GetRegister write SetRegister;
  • La lecture des données accélération, gyro, magnétique et éventuellement température en unité SI
    property Acceleration: V3D_Single read GetXL;
    property Gyro: V3D_Single read GetG;
    property Magneto: V3D_Single read GetM;
    property Temperature: single read GetTemp;

et les fonctions annexes :

  • Vérification de la connexion par l’interrogation des registre WHO_AM_I
    function CheckWhoAmI(var waiXL_G: byte; var waiM: byte): boolean;
  • Disponibilité des nouvelles données
    function DatasReady(var dXL_Ready: boolean; var dG_Ready: boolean; var dM_Ready: boolean;): boolean;

Le code de test

Une fois les modules fonctionnels le code de test devient très simple.

testduLSM9DS1

Initialisation

L’initialisation est réalisée dans la fonction FormCreate qui est déclenchée automatiquement à la création de la fiche du programme.

Tests de base

  • contrôle WHO_AM_I
  • lecture d’un registre

Mesures

Les boutons permettent la lecture et l’affichage des données :

  • accélération
  • gyro
  • magnéto

Exemple de code

procedure TfTest.btnGyroClick(Sender: TObject);
const rad2deg: single = 180./Pi; // 57.29578
var vG: V3D_Single;
begin
   vG:= AGSensor.Gyro;
   eGX.Text:= Format('%f [°/s]', [vG.X*rad2deg]);
   eGY.Text:= Format('%f [°/s]', [vG.Y*rad2deg]);
   eGZ.Text:= Format('%f [°/s]', [vG.Z*rad2deg]);
end;

Le bouton Continu permet d’afficher les valeurs en continu sur un rythme de 2 mesures / s.

Création de la base de données

Ce bouton déclenche l’enregistrement de séries (6) de séquences de 1000 mesures des 9 axes de liberté. Entre chaque série le logiciel demande de modifier la position du capteur. Choisissez des positions dans les 3 axes de l’espace et pensez à bien caler le capteur. Le résultat est sauvegardé dans le fichier /home/pi/Mlogs/ LSM9DS1Calibration.s3db (pensez à créer le dossier). Nota : la vitesse d’acquisition est inférieure à ce qu’elle devrait être théoriquement. Il va falloir examiner où se trouve le goulet d’étranglement.

Calibration du capteur

La calibration du capteur consiste à calculer les offsets et facteurs d’échelle à appliquer pour obtenir les résultats conforme aux grandeurs physiques :

  • L’accélération au repos doit être de 9,80655 en module
  • Le gyro doit être de zéro sur tous les axes
  • Le magnéto doit donner en module la force du champ magnétique local. Celui-ci peut être estimé par un calculateur en ligne, par exemple : http://geomag.nrcan.gc.ca/calc/mfcal-fr.php

Cette opération dépasse le cadre de cet article, et pour tout dire se révèle plus complexe que ce que j’avais pensé à l’origine : après un premier examen les valeurs brutes sont très approximatives et le calcul des coefficients doit être précis.

Pour faire ces calculs, qui restent à faire, je compte procéder en suivant les étapes suivantes :

  • Reprise de la base de données sur PC. Extraction des données avec sqlitemanager (utilitaire gratuit ne nécessitant pas d’installation). Ci-dessous extraction des moyennes pour chaque série  :

calibration

  • Poser un système d’équations pour les calcul des 6 inconnues : 3 offsets et 3 facteurs d’échelle. Le logiciel wxMaxima (également gratuit) permet de résoudre les équations. Ci-dessous un exemple avec un système limité à 3 équations pour la recherche des offsets (ox, oy, oz).

equations

Conclusion (forcément provisoire)

J’espère que cet article donnera des pistes à ceux qui voudrons tester des capteurs physiques Je joins le code complet du programme de test, code utilisable librement.

Il reste beaucoup à faire :

  • Consolider le code, en particulier avoir une gestion des erreurs aussi exhaustive que possible avec un enregistrement dans un fichier de logs, implémenter le SPI
  • Concevoir une carte d’acquisition avec ce capteur, un module GPS, un capteur de pression et une alimentation 12V (éventuellement au standard pHAT)
  • Réaliser l’interface graphique
ulm

L’ULM de Thierry un projet déjà bien avancé !

Toute personne souhaitant participer au projet ou partager des résultats avec d’autres capteurs est bienvenue. Le tout sera publié sur OpenAvionics.

Sources


Viewing all articles
Browse latest Browse all 1015

Trending Articles