Salut !
Alors d'abord pour la stabilité de l'altitude. Ca peut effectivement venir du calibrage de l'acceleromètre. Mais ça peut aussi venir du BMP qui met un peu de temps à "chauffer". Il faut voir si cela fini par se stabiliser au bout d'un moment.
Pour le filtre de kalman il n'y a pas à se soucier de l'orientation du vario. C'est la bibliothèque "vertaccel" qui s'occupe de ça. Mais la encore il faut que l'acceleromètre soit bien qualibré.
Pour l'altitude farfelue, il faut que j'explique un point de programmation important.
----------------
Je pense que tu as compris que les fonctions en C++ peuvent pendre des
paramètres (ex : bmp.altitude(P, 1015) on donne deux pression à la fonction, P et 1015 ) et qu'elles peuvent
retourner des valeurs ( ex : A = bmp.altitude(P, 1015) , la fonction retourne l'altitude avec les deux pressions et on la place dans A ).
Donc il y a une première erreur importante :
char result = bmp.startMeasurment();
Cette fonction retourne une valeur dans "result". Selon la doc de la fonction. Le résultat est 0 en cas d'erreur et autrement c'est le nombre de millisecondes qu'il faut attendre avant de lire la pression. Dans ton cas tu n'attends pas et donc tu n'obtient pas la bonne valeur.
Il faut faire aussi attention à l'ordre des fonctions. Dans ta fonction setup :
kalmanvert.init(bmp.altitude(P ,1015) + correction, vertaccel_getValue(), 0.1, 0.3, millis() );
bmp.setOversampling(4);
Tu lis l'altitude "bmp.altitude(P ,1015) " sans avoir lancé une mesure "bmp.startMeasurment()". Et tu règle la précision "bmp.setOversampling(4)" après avoir lu la première altitude "bmp.altitude(P ,1015)".
Donc déjà dans la fonction setup, avant de s'occuper de kalman il faut :
bmp.begin(); //initialiser le BMP
bmp.setOversampling(4); //régler la précision maximale
char wt = bmp.startMeasurment(); //lancer un première mesure
delay(wt); //attendre, normalement il faudrait vérifier que wt n'est pas 0
bmp.getTemperatureAndPressure(T,P); //lire la mesure
double alti = bmp.altitude(P ,1015); //calculer une première altitude
Le deuxième erreur est un peu la même. Pour l'acceleration, il faut vérifier qu'il y a une valeur qui est prête à être lue. Cela se fait avec la fonction :
vertaccel_dataReady();
Dans ton cas tu lance cette fonction sans regarder ce qu'elle
retourne. Donc en fait cela ne sert à rien puisque l'objectif de cette fonction c'est de savoir si une "donnée" est prête a être lue. Cette fonction retourne un "boolean" (vrai ou faux). Donc il faut tester ce qu'elle donne.
boolean accelReady = vertaccel_dataReady(); // dans accelReady il y a vrai ou faux
if( accelReady ) {
// ce code n'est executé que si il y a une valeur d'acceleration à lire
...
}
... // le programme continue
Tu peux abrégé ça en :
if( vertaccel_dataReady() ) {
// ce code n'est executé que si il y a une valeur d'acceleration à lire
...
}
Du coup pour attendre qu'une valeur accélération est prête pour ensuite la lire il faut faire :
while( ! vertaccel_dataReady() ) { //tant que l'acceleromètre n'est pas prêt
// on fait rien
}
/* maintenant on peut lire une valeur */
vertaccel_updateData();
double accel = vertaccel_getValue();
Donc dejà avec ça tu pourra initialiser le filtre de kalman avec de bonnes valeurs (alti, accel). Il restera le problème de "chauffe" des instruments. Mais c'est plus marginal.
Voilà pour la fonction setup. Malheureusement pour la fonction loop ça se complique
. Pourquoi ? Par que dans un boucle qui gère plein de choses (l'accelerateur, l'alti, le speaker) on ne peut pas se permettre d'
attendre sans rien faire que les valeur de l'alti et de l'accel arrivent. Il faut s'arrenger pour pouvoir continuer à travailler pendant mes mesures.
Mais c'est justement l'interêt de des fonctions "bmp.startMeasurment()" et "vertaccel_dataReady()". Elle permettre de savoir si on est pret à lire une valeur.
Alors la il faut bien suivre :
Il faut que ton alti soit en permanence en train de faire une mesure. Et il te faut une variable pour stocker le temps à partir duquel tu pourra lire la valeur :
Donc en dehors de toutes les fonctions tu créé une variable :
unsigned long altiReadyTime;
Ensuite dès la fin de ta fonction setup il faut relancer un "bmp.startMeasurment()". Et enregistrer ce temps :
char wt = bmp.startMeasurment(); //wt c'est pour "wait time"
altiReadyTime = millis() + wt; // milli donne le temps actuel et on ajoute le delai
Maintenant dans la boocle loop. Pour savoir si tu peux lire une alti tu fait :
if( millis() > altiReadyTime ) {
//le temps actuel est supérieur au temps "ready"
}
Pour savoir si tu peux lire une valeur d'acceleration tu fait :
if( vertaccel_dataReady() ) {
//l'accel est prêt
}
Tu peux combiner les deux ainsi :
if( millis() > altiReadyTime && vertaccel_dataReady() ) {
// les deux sont prêt
}
Dans c'est dans ce "if" que :
-> tu lis les valeurs alti et accel
-> tu met à jour kalman
-> tu lis les valeurs de kalman
-> tu relance une mesure d'alti en enregistrant le temps "ready"
Un peu comme dans la fonction setup en fait.
Ensuite par contre le code du beeper tu peux l'executer autant que tu veux (c'est très rapide).
Pour l'écran. Ce n'est pas la peine de toucher à l'affichage si tu n'a pas de nouvelle mesure où si tu n'a pas touché de boutons.
Mais là c'est encore du travail ....
Mais l'essenciel c'est de comprendre cette gestion du temps.
Amuse toi bien.