![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Accelero Brindan
Diff: main.cpp
- Revision:
- 2:59eeb8637e5d
- Parent:
- 1:bcb2d1a61147
--- a/main.cpp Thu May 09 14:43:53 2019 +0000 +++ b/main.cpp Thu May 09 21:02:26 2019 +0000 @@ -7,49 +7,49 @@ LSM6DS33 acc = LSM6DS33(I2C_SDA, I2C_SCL); //Déclarations des broches pour la communication en I2C -float axx0; -float ayy0; +float axx0; // On définit la variable pour l'accélération initiale en x +float ayy0; // On définit la variable pour l'accélération initiale en y -float axx1; -float ayy1; +float axx1; // On définit la variable pour l'accélération évoluant au cours du temps selon x +float ayy1; // On définit la variable pour l'accélération évoluant au cours du temps selon y -float vx0; -float vy0; +float vx0; // On définit la variable pour la vitesse initiale en x +float vy0; // On définit la variable pour la vitesse initiale en y -float vx; -float vy; -float V; +float vx; // On définit la variable pour la vitesse évoluant au cours du temps selon x +float vy; // On définit la variable pour la vitesse évoluant au cours du temps selon y +float V; // On définit la variable pour la norme de la vitesse. -float epsilonx; -float epsilony; +float epsilonx; // Variable utilisé pour l'initialisation, elle permet d'avoir la valeur de axx0 la plus proche possible de l'accélération initiale en x +float epsilony; // Variable utilisé pour l'initialisation, elle permet d'avoir la valeur de ayy0 la plus proche possible de l'accélération initiale en y +// En effet, lors de la mesure de l'accélération initiale, on ne peut pas être certains que la première mesure faite par l'accéléromètre correspond +// exactement à l'accélération intiale : il est possible qu'un léger décalage/rotation ait eu lieu, résultant à une accélération intiale erronée. +// Par la suite, on explique la méthode utilisée pour résoudre ce problème -float tabax[5]; -float tabay[5]; -float tabvx[5]; -float tabvy[5]; +float tabax[5]; // Tableau des 5 dernières accélérations en x mesurées +float tabay[5]; // Tableau des 5 dernières accélérations en y mesurées +float tabvx[5]; // Tableau des 5 dernières vitesses en x mesurées +float tabvy[5]; // Tableau des 5 dernières vitesses en y mesurées -int k; - +int k; // Variable d'incrémentation -int a1; //Grandeurs pour déterminer si les roues de la voiture sont immobiles -int a2; //ou non. Mesure si la valeur du compteur incrémental change int main() { - a2 = 0; - k = 0; - vx = 0; - vy = 0; + // On initialise les différentes variables qui évoluent : + k = 0; // l'entier k nous permettant d'indexer les mesures + vx = 0; // la vitesse en x + vy = 0; // la vitesse en y - acc.begin(); + acc.begin(); // On démarre la lecture de l'accéléromètre - acc.readAccel(); - axx0 = acc.ax; - ayy0 = acc.ay; + acc.readAccel(); // On lit les données de l'accéléromètre + axx0 = acc.ax; // On affecte à axx0 la première lecture par l'accéléromètre selon l'axe x + ayy0 = acc.ay; // On affecte à ayy0 la première lecture par l'accéléromètre selon l'axe y - acc.readAccel(); - epsilonx = acc.ax-axx0; - epsilony = acc.ay-ayy0; + acc.readAccel(); // On lit de nouveau les valeurs sur l'accéléromètre et on les compare avec les valeurs précédentes + epsilonx = acc.ax-axx0; // écart selon x entre la nouvelle accélération et l'ancienne accélértion + epsilony = acc.ay-ayy0; // écart selon y entre la nouvelle accélération et l'ancienne accélértion while (1) { @@ -57,22 +57,22 @@ // On calcule l'écart entre la valeur lue et la valeur initial (contenant le bruit) // On veut que l'accéleration qu'on mesure soit nul, pour cela, nous devons trouver axx0 // le plus précisement possible ( à 10^-2). On pourra alors retrancher axx0 au futur valeur. - - while(abs(epsilonx)>0.001 or abs(epsilony)>0.001) + // NB : D'autres méthodes sont possibles, par exemple faire la moyenne des n premières valeurs... + while(abs(epsilonx)>0.001 or abs(epsilony)>0.001) { axx0=axx0+epsilonx; ayy0=ayy0+epsilony; acc.readAccel(); epsilonx = acc.ax-axx0; epsilony = acc.ay-ayy0; - printf("epsilonx vaut : %f\n", epsilonx); + printf("epsilonx vaut : %f\n", epsilonx); printf("epsilony vaut : %f\n", epsilony); } // Mesure de l'accélération en g (1g = 9,8 m/s^2) acc.readAccel(); - axx1 = acc.ax-axx0; - ayy1 = acc.ay-ayy0; + axx1 = acc.ax-axx0; // accélération en x mesurée auquel nous avons retranché l'accélération initial en x + ayy1 = acc.ay-ayy0; // accélération en y mesurée auquel nous avons retranché l'accélération initial en y // Condition de seuil pour eviter de prendre en compte le bruit if (abs(axx1) < 0.01) @@ -85,19 +85,22 @@ } // Calcul de la vitesse par intégration wait(0.0005); - vx = vx + axx1*9.8*0.0005*1000; - vy = vy + ayy1*9.8*0.0005*1000; - V = sqrt(vx*vx+vy*vy); + vx = vx + axx1*9.8*0.0005*1000; // l'accéleration est lue en g, on souhaite l'obtenir en m/s^2. Lors de l'intégration, on multiplie tout simplement + vy = vy + ayy1*9.8*0.0005*1000; // par le temps d'intégration entre deux lectures. + V = sqrt(vx*vx+vy*vy); // Calcul de la norme de la vitesse - if (abs(vx)<0.001) - { + if (abs(vx)<0.001) // On considère que si la vitesse mesurée est inférieur à 0.001 m/s résulte du bruit + { // Cette condition fixe notre sensibilité, ainsi toute vitesse inférieur à cette condition est tout simplement ignorée. vx=0; } if (abs(vy)<0.001) { vy=0; } - + // Malgré tout, due au faite que l'accéleration n'est pas continue, nous n'arrivons pas à faire redescendre la vitesse à 0. + // (problème d'intégration de l'accéleration due à son échantillonnage) + // Pour combler ce soucis, nous comparons les 5 dernières valeurs et considérons que si l'accélération ET la vitesse est inférieur à une certaines valeurs + // alors, l'objet est bien immobile et on remet donc la vitesse à zéro. if (k == 5) {k=0;}; tabax[k] = axx1; tabay[k] = ayy1; @@ -122,8 +125,6 @@ //printf("acceleration en V = %f\n", V); - //if (a1=a2) - } // fin du while } // fin du main \ No newline at end of file