IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Résultats avec un capteur accéléromètre-gyromètre-magnétomètre LSM9DS1


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné

    Homme Profil pro
    Technicien
    Inscrit en
    Août 2013
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 440
    Par défaut Résultats avec un capteur accéléromètre-gyromètre-magnétomètre LSM9DS1
    Bonsoir


    Je cherche à obtenir les valeurs de la position angulaire d'un objet au cours du temps. Pour cela, j'utilise un capteur accéléromètre-gyromètre-magnétomètre : le LSM9DS1.

    Pour premier essai, j'ai utilisé le programme ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    //Déclaration des bibiliothèques nécessaires
    #include <Wire.h>
    #include <SPI.h>
    #include <Adafruit_LSM9DS1.h>
    #include <Adafruit_Sensor.h>  // not used in this demo but required!
     
    //Déclaration des variables
    int timeRes ; // période d'échantillonnage en ms
    int dureeAcquisition ; // durée totale de l'acquisition  en s
    unsigned long tempsZero;
    unsigned long tempsCourant;
    int topDepart = 0;
    String envoi;
    unsigned long baud = 115200; // flux de la liaison série
     
    unsigned long tempsPrec;
    long start = 0 ;
     
     
    // i2c
    Adafruit_LSM9DS1 lsm = Adafruit_LSM9DS1();
     
    #define LSM9DS1_SCK A5
    #define LSM9DS1_MISO 12
    #define LSM9DS1_MOSI A4
    #define LSM9DS1_XGCS 6
    #define LSM9DS1_MCS 5
    // You can also use software SPI
    //Adafruit_LSM9DS1 lsm = Adafruit_LSM9DS1(LSM9DS1_SCK, LSM9DS1_MISO, LSM9DS1_MOSI, LSM9DS1_XGCS, LSM9DS1_MCS);
    // Or hardware SPI! In this case, only CS pins are passed in
    //Adafruit_LSM9DS1 lsm = Adafruit_LSM9DS1(LSM9DS1_XGCS, LSM9DS1_MCS);
     
     
    void setupSensor()
    {
      // 1.) Set the accelerometer range
      lsm.setupAccel(lsm.LSM9DS1_ACCELRANGE_2G);
      //lsm.setupAccel(lsm.LSM9DS1_ACCELRANGE_4G);
      //lsm.setupAccel(lsm.LSM9DS1_ACCELRANGE_8G);
      //lsm.setupAccel(lsm.LSM9DS1_ACCELRANGE_16G);
     
      // 2.) Set the magnetometer sensitivity
      lsm.setupMag(lsm.LSM9DS1_MAGGAIN_4GAUSS);
      //lsm.setupMag(lsm.LSM9DS1_MAGGAIN_8GAUSS);
      //lsm.setupMag(lsm.LSM9DS1_MAGGAIN_12GAUSS);
      //lsm.setupMag(lsm.LSM9DS1_MAGGAIN_16GAUSS);
     
      // 3.) Setup the gyroscope
      //lsm.setupGyro(lsm.LSM9DS1_GYROSCALE_245DPS);
      //lsm.setupGyro(lsm.LSM9DS1_GYROSCALE_500DPS);
      lsm.setupGyro(lsm.LSM9DS1_GYROSCALE_2000DPS);
     
     
    }
     
     
    void setup()
    {
      Serial.begin(baud);
      tempsPrec = millis();
      tempsZero = millis();
      envoi = "0";
     
      // Vérification de la détection du capteur
      if (!lsm.begin())
      {
        Serial.println("Oops ... unable to initialize the LSM9DS1. Check your wiring!");
        while (1);
      }
     
      // helper to just set the default scaling we want, see above!
      setupSensor();
    }
     
     
    void lecture()
    {
      lsm.read();  /* ask it to read in the data */
     
      /* Get a new sensor event */
      sensors_event_t a, m, g, temp;
     
      lsm.getEvent(&a, &m, &g, &temp);
     
      Serial.print(tempsCourant / 1000.0 , 3);
      Serial.print("\t");
      Serial.print(a.acceleration.x);
      Serial.print("\t");
      Serial.print(a.acceleration.y);
      Serial.print("\t");
      Serial.print(a.acceleration.z);
      Serial.print("\t");
      Serial.print(g.gyro.x);
      Serial.print("\t");
      Serial.print(g.gyro.y);
      Serial.print("\t");
      Serial.println(g.gyro.z);
     
      tempsPrec += timeRes;
    }
     
     
    void reglages()
    {
      String prm;
      String rec;
      int posC;
     
      while (topDepart == 0) {
        envoi = Serial.readString();
     
        Serial.print("Saisir la période d'échantillonnage (en ms) : ");
        while (Serial.available() == 0 );
        if (Serial.available() != 0)
        {
          timeRes = Serial.parseInt(); //on enregistre la valeur saisie dans timeRes
          Serial.println(timeRes);
          delay(100); //délai de temporisation
        }
     
        Serial.print("Saisir la durée d'acquisition (en ms) : ");
        while (Serial.available() == 0 );
        if (Serial.available() != 0)
        {
          dureeAcquisition = Serial.parseInt(); //on enregistre la valeur saisie dans dureeAcquisition
          Serial.println(dureeAcquisition);
          delay(100); //délai de temporisation
        }
     
        Serial.println("Saisir S pour lancer l'acquisition : ");
        while (Serial.available() == 0 );
        if (Serial.available() != 0)
        {
          topDepart = 1;
          Serial.flush();
          tempsPrec = 0;
          tempsZero = millis();
          Serial.print("t");  // donne la date en seconde
          Serial.print('\t');
          Serial.print("Ax"); // donne la valeur recalculée de la tension
          Serial.print('\t');
          Serial.print("Ay"); // donne la valeur recalculée de la tension
          Serial.print('\t');
          Serial.print("Az"); // donne la valeur recalculée de la tension
          Serial.print('\t');
          Serial.print("Gx"); // donne la valeur recalculée de la tension
          Serial.print('\t');
          Serial.print("Gy"); // donne la valeur recalculée de la tension
          Serial.print('\t');
          Serial.println("Gz"); // donne la valeur recalculée de la tension
          Serial.print("ms");  // donne la date en milliseconde
          Serial.print('\t');
          Serial.print("m.s^-2"); // donne la valeur recalculée de la tension
          Serial.print('\t');
          Serial.print("m.s^-2"); // donne la valeur recalculée de la tension
          Serial.print('\t');
          Serial.print("m.s^-2"); // donne la valeur recalculée de la tension
          Serial.print('\t');
          Serial.print("rad.s^-2"); // donne la valeur recalculée de la tension
          Serial.print('\t');
          Serial.print("rad.s^-2"); // donne la valeur recalculée de la tension
          Serial.print('\t');
          Serial.println("rad.s^-2"); // donne la valeur recalculée de la tension
        }
      }
    }
     
     
    void loop()
    {
      tempsCourant = millis() - tempsZero;
      if (  topDepart == 0) {
        reglages();
      } else {
        if (tempsCourant <= dureeAcquisition) {
          if (tempsCourant >= tempsPrec) {
            lecture();
          }
        }
      }
      Serial.flush();
    }
    En faisant balancer un peu le capteur, j'obtiens les résultats suivants
    test_accelerometregyrometre.pdf

    J'arrive à voir qu'effectivement un mouvement a lieu mais je suis bloqué pour remonter ensuite à la valeur de l'angle par rapport à la verticale.
    Au passage, je suis surpris de voir que malgré mon mouvement de balancier, les valeurs sur les axes du gyromètres n'évoluent quasiment pas.

    Merci d'avance pour votre aide.
    [Nouveau] Envie de tracer des circuits électriques : essayez le package LaTeX CircuiTikZ

    Pour créer une belle table des matières sur LibreOffice - N'oubliez pas de consulter les FAQ en cas de question !

    Envie de se lancer dans l'aventure Arduino : allez faire un tour sur ce cours.


    Ma réponse vous a plu ? Un petit vote serait sympa

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 914
    Par défaut
    Vous avez essayé le code de base de la librairie pour voir si vous obtenez des valeurs cohérentes sur les 3 capteurs ?

  3. #3
    Membre chevronné

    Homme Profil pro
    Technicien
    Inscrit en
    Août 2013
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 440
    Par défaut
    Bonjour

    Les valeurs obtenues avec le programme de la bibliothèque donne des résultats similaires : seule l'accélération est modifiée lors d'un mouvement du capteur.
    [Nouveau] Envie de tracer des circuits électriques : essayez le package LaTeX CircuiTikZ

    Pour créer une belle table des matières sur LibreOffice - N'oubliez pas de consulter les FAQ en cas de question !

    Envie de se lancer dans l'aventure Arduino : allez faire un tour sur ce cours.


    Ma réponse vous a plu ? Un petit vote serait sympa

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 914
    Par défaut
    Citation Envoyé par nlbmoi Voir le message
    Bonjour

    Les valeurs obtenues avec le programme de la bibliothèque donne des résultats similaires : seule l'accélération est modifiée lors d'un mouvement du capteur.
    Salut

    Vous êtes sûr d’avoir un LSM9DS1 ?

  5. #5
    Membre chevronné

    Homme Profil pro
    Technicien
    Inscrit en
    Août 2013
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 440
    Par défaut
    Salut

    Oui, enfin c'est bien ce qui est marqué sur le capteur.
    Je précise d'ailleurs que pour une autre manipulation où je n'ai besoin que de l'accélération et les résultats obtenus sont bien conformes à ce que j'attends : le problème est, à priori de ce que j'en vois, lié au gyromètre.
    [Nouveau] Envie de tracer des circuits électriques : essayez le package LaTeX CircuiTikZ

    Pour créer une belle table des matières sur LibreOffice - N'oubliez pas de consulter les FAQ en cas de question !

    Envie de se lancer dans l'aventure Arduino : allez faire un tour sur ce cours.


    Ma réponse vous a plu ? Un petit vote serait sympa

  6. #6
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 914
    Par défaut
    Citation Envoyé par nlbmoi Voir le message
    Je précise d'ailleurs que pour une autre manipulation où je n'ai besoin que de l'accélération et les résultats obtenus sont bien conformes à ce que j'attends : le problème est, à priori de ce que j'en vois, lié au gyromètre.
    -> Le gyromètre donne une vitesse de rotation sur chaque axe (ce n'est pas une accélération en rad/s2).
    Nom : 5112d376ce395fc826000001.jpg
Affichages : 372
Taille : 13,6 Ko
    (source SparkFun)

    Je ne sais pas comment ni où est accroché votre capteur mais êtes vous sûr qu'il tourne autour d'un axe ? Le plus souvent on voit une inclinaison mais pas une rotation

    Pour les 2 autres capteurs:

    - L'accéléromètre donne l'accélération sur les 3 axes, par exemple au repos vous devriez mesure l'attraction terrestre sur l'axe de Z et rien nulle part ailleurs.
    - Le magnétomètre est sensible au champs magnétique et donc va indiquer dans la plupart des cas le Nord magnétique.

    avez vous vérifié cela ?

  7. #7
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonjour nlbmoi
    Citation Envoyé par nlbmoi Voir le message
    Je cherche à obtenir les valeurs de la position angulaire d'un objet au cours du temps
    Si c'est le roll ou le pitch, l'exemple de la bibliothèque LSM9DS1_Basic_I2C de Sparkfun les donne.
    Je n'ai, malheureusement, pas ce capteur pour essayer.

    Cordialement
    jpbbricole

  8. #8
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 914
    Par défaut
    les valeurs semblent incohérentes et le niveau de bruit sur accx, accy et accz n'est pas non plus génial si vous avez tourné à plat sans déplacement.

    êtes vous sûr que le module est bien alimenté ?

    passez le gyro en lsm.LSM9DS1_GYROSCALE_245DPS vu qu'il ne va pas tourner super vite de toutes façons et essayez à nouveau.
    (la légende est fausse pour le gyro, ce n'est pas une accélération mais une vitesse qu'il délivre).

    j'ai plusieurs types de MPUs mais pas celui là..

  9. #9
    Membre chevronné

    Homme Profil pro
    Technicien
    Inscrit en
    Août 2013
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 440
    Par défaut
    J'ai vérifié l'alimentation : tout est ok. Après, les résultats de l'accélération sont cohérentes ce qui tend à me dire que l'alimentation est correcte.

    L'essai en changeant le calibre du gyroscope : j'ai maintenu le capteur fixe pendant quelques secondes avant de le faire tourner à plat
    Nom : essai3_.jpg
Affichages : 326
Taille : 120,1 Ko
    [Nouveau] Envie de tracer des circuits électriques : essayez le package LaTeX CircuiTikZ

    Pour créer une belle table des matières sur LibreOffice - N'oubliez pas de consulter les FAQ en cas de question !

    Envie de se lancer dans l'aventure Arduino : allez faire un tour sur ce cours.


    Ma réponse vous a plu ? Un petit vote serait sympa

  10. #10
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 914
    Par défaut
    c'est déjà un peu plus propre

    vous avez effectué un calibrage ? la librairie de SparkFun a une fonction à mettre dans le setup() pour cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    LSM9DS1 imu;
    void setup(){
        imu.calibrate(false);         //calibrates but does not store bias
        imu.calibrateMag(true);       //calibrates and stores bias
    il semble que celle d'Adafruit n'en ait pas, vous pourriez vous inspirer de ce qu'à fait SparkFun pour calibrer peut-être ou de cet article

Discussions similaires

  1. [AJAX] Résultat avec Ajax
    Par incao dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 13/05/2006, 22h14
  2. [MySQL] problème de résultat avec une requête
    Par jexl dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 29/03/2006, 23h23
  3. [SQL] Problème de résultat avec une requête
    Par raptorman dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 04/01/2006, 17h16
  4. Générer un fichier résultat avec sépateur ;
    Par soulryo dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 30/08/2005, 09h57
  5. Générer un fichier résultat avec sépateur ;
    Par soulryo dans le forum Langage SQL
    Réponses: 3
    Dernier message: 29/08/2005, 12h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo