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