Condition pour arrêter l'affichage de données issues d'un gyroscope

Bonjour,

J’ai une sorte de planche montée sur un axe et je souhaite mesurer son inclinaison, c’est à dire l’angle total parcouru depuis sa position de départ à sa position finale (lorsqu’elle rencontre une butée) et l’afficher sur mon LCD.

J’utilise pour ça un gyroscope, en intégrant la vitesse angulaire par rapport au temps, et en sommant au fur et à mesure pour avoir l’angle parcouru à un instant t.

J’ai pour l’instant le programme suivant, qui fonctionne :

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.write(byte(0));  
  lcd.setCursor(1,0);
  lcd.print("Inclinaison");
  lcd.setCursor(15,0);
  lcd.write(byte(3));
  lcd.setCursor(0,1);
  lcd.print("Calibration     ");
  lcd.setCursor(15,1);
  lcd.write(byte(2));  
  while (activeButton == 0) {
    int button;
    readKey = analogRead(0);
    button = evaluateButton(readKey);
    switch (button) {
      case 3: // bouton bas
      lcd.setCursor(0,1);
      lcd.print("Calibration     ");      
      Calibration_capteurs();
      lcd.setCursor(12,1);
      lcd.print("OK");
      delay(1000);
      lcd.setCursor(0,1);
      lcd.print("Mesure:         ");
      Temps = micros();
      GyroAngleY=0;
      while (readKey<50 || readKey>250){ // bouton haut pour stop
        IMU.readSensor();
        GyroY = IMU.getGyroY_rads();
        GyroY = GyroY - GyroY_Moy_Repos; // calibration
        GyroAngleY += GyroY * (Periode / 1000000); // intégration + somme au fur et à mesure
        lcd.setCursor(8,1);
        lcd.print(-GyroAngleY,2); // affichage
        while (micros() - Temps < Periode); // durée boucle
        Temps = micros();
        readKey = analogRead(0);
      }
      break;

Et je souhaite qu’il arrête “tout seul” quand l’objet atteint la butée, sans que j’ai besoin d’appuyer sur la touche haut. Il me faut donc modifier ma condition en lui disant d’arrêter lorsque l’angle actuel n’est plus inférieur à l’angle précédent (c’est à dire qu’il ne descend plus).

Mais après avoir fait de nombreux essais, je n’arrive toujours pas à obtenir un truc fonctionnel… je viens donc à la pèche aux idées.

Bonobodu24:
J'utilise pour ça un gyroscope, en intégrant la vitesse angulaire par rapport au temps, et en sommant au fur et à mesure pour avoir l'angle parcouru à un instant t.

Tu veux dire un gyromètre ?

Bonobodu24:
Et je souhaite qu'il arrête "tout seul" quand l'objet atteint la butée, sans que j'ai besoin d'appuyer sur la touche haut. Il me faut donc modifier ma condition en lui disant d'arrêter lorsque l'angle actuel n'est plus inférieur à l'angle précédent (c'est à dire qu'il ne descend plus).

Dans ta ligne de mise à jour de l'angle:

GyroAngleY += GyroY * (Periode / 1000000);

Si la nouvelle valeur est supérieure ou égale à la valeur précédente, c'est que GyroY est positif ou nul.
Donc, tu n'as qu'à détecter le moment ou GyroY devient positif ou nul.

Par contre, comme tu veux détecter des petites valeurs, il faudrait peut-être filtrer sur plusieurs mesures consécutives.

Oui gyromètre et non gyroscope.

J’avais pensé à cette solution mais je n’arrive pas à la mettre en place :

Temps = micros();
      GyroAngleY=0;
      IMU.readSensor();
      GyroY = IMU.getGyroY_rads();
      while (GyroY<0){
        IMU.readSensor();
        GyroY = IMU.getGyroY_rads();
        GyroY = GyroY - GyroY_Moy_Repos; // calibration
        GyroAngleY += GyroY * (Periode / 1000000); // intégration + somme au fur et à mesure
        lcd.setCursor(8,1);
        lcd.print(-GyroAngleY,2);
        while (micros() - Temps < Periode);
        Temps = micros();
        readKey = analogRead(0);
      }

Il ne rentre pas dans le while quand je met l’objet en mouvement (aucun affichage).

Je précise que de la manière dont est positionné mon capteur, je mesure des vitesses angulaire négatives durant le mouvement (d’où le -GyroAngle à l’affichage pour afficher l’angle “absolu”) mais comme vous le dites lors de l’arrêt la vitesse redevient positive (“choc”), puis nulle (objet arrêté) et donc la condition que vous proposez me semble bonne.

Bonjour,

As-tu essayé un affichage dans le moniteur série avant le while ?
Tu peux afficher "GyroY" pour voir si la valeur est bien négative et faire un autre affichage dans le while pour vérifier que tu rentres bien dedans