Accéléromètre MPU6050 problème d'orientation avec pesanteur

Bonjour à tous,

Dans un premier temps merci pour votre intérêt pour ce topic.
Voici un petit résumé qui m'a amené au problème qui m'accable aujourd'hui, pour un projet en école d'ingénieur je dois réaliser un modèle miniature de ce qu'on appellerais un détecteur de choc.
Ce dispositif serais présent dans des voitures de courses, évidemment c'est un projet fictif mais pour notre présentation nous souhaitons pouvoir faire une démonstration auprès d'un jury.

Cette maquette comporte un module MKR1000 pour faire comprendre au jury que c'est un système embarqué et d'un MPU6050, le servomoteur ici me sert juste à savoir que le programme a détecté un choc.

J'ai esquissé le code suivant :

#include <Wire.h> //
#include <MPU6050.h> // Importation des bibliothéques pour la lecture et communication avec les modules
#include <Servo.h> //

MPU6050 mpu; // Attribution du mot clé utilisé pour définir le capteur
Servo monServo; // Attribution du mot clé utilisé pour définir le moteur

float offset = 0.0;                  // Variable pour stocker la valeur de correction
const float seuilDeceleration = -10.0; // Seuil de décélération pour activer le servomoteur

void setup() {
  Serial.begin(9600);
  Wire.begin(); // Initialisation des communications 

  monServo.attach(5);  // Initialisation des communication avec le servo moteur en donnant le PIN utilisé
  
  mpu.initialize();  // Initialisation des communications avec le capteurs 
  mpu.setFullScaleAccelRange(3); // Initialisation de la plage de valeur utilisée par le capteur ici le catpeur ira jusqu'à +/- 16g 

  if (mpu.testConnection()) { // Test de communication avec l'accéléromètre 
    Serial.println("MPU6050 connection successful");
  } else {
    Serial.println("MPU6050 connection failed");
    while (1);
  }

  Serial.println("Auto-correction en cours... Veuillez placer le MPU6050 à plat et immobile...");
  delay(3000);  // Laissez le temps de placer le MPU6050 dans une position stable

  // Mesure des valeurs d'accélération en position stable
  int16_t stable_az;
  mpu.getAcceleration(NULL, NULL, &stable_az);
  offset = static_cast<float>(stable_az) / 2048.0;

  Serial.print("Valeur de correction : ");
  Serial.println(offset);
}

void loop() {
  int16_t az;  // Valeur d'accélération selon l'axe Z

  mpu.getAcceleration(NULL, NULL, &az);

  // Appliquer la correction
  float accelerationInG = (static_cast<float>(az) / 2048.0) - offset;

  // Envoyer les données au moniteur série
  Serial.println(accelerationInG);

  // Activer le servomoteur si la décélération dépasse le seuil
  if (accelerationInG < seuilDeceleration) {
    monServo.write(90);  // Angle de 90 degrés 
    delay(1000);        // Laissez le servomoteur activé pendant une seconde
    monServo.write(0);   // Ramenez le servomoteur à sa position initiale 
  }

  delay(500);  // Délai entre chaque lecture
}

J'ai donc effectué plusieurs test ou je lance ma maquette contre un mur pour vérifier les valeurs de g que j'obtiens, les valeurs sont cohérentes avec des décélérations à -16g qui est de toute façon la valeur la plus élevée que peut traiter le MPU.

Cependant nous arrivons au problème principal, lorsque la voiture parcours le circuit des inclinaison ont lieu, donc des composantes parasites de la pesanteurs vont s'ajouter au valeur d'accélérations générer par la voiture et donc fausser mes mesures et pourrait donc fausser la détection d'un choc.
J'ai essayer avec des calculs de projections mais ça ne fonctionne pas.... Je m'en remet donc à vous, je tiens à rappeler que je suis complétement débutant et que mon programme résulte d'un tas de recherche sur le net...

Ma question est donc la suivante, comment faire pour soustraire ces composantes parasites en fonctions de l'inclinaison de ma voiture sur les différents axes ?

Merci

Expliquez ce que vous avez fait

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.