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.