Projet stabilisation active

Je pensais que les valeurs étaient directement lues par la carte, je vais mettre au début de la partie de quoi lire ces valeurs

J-M-L:
sur cette partie:
où lisez vous les valeurs de l'accéléromètre dans votre code?

J'ai rajouté acc.getAcceleration(&ax,&ay,&az) pour connaitre ces valeurs

void loop()
{
    float ax, ay, az;
    acc.getAcceleration(&ax,&ay,&az);
    int axa, axy;  
    float b = (sqrt(ax*ax)+(ay*ay)+(az*az));
    
   
    axa = asin(ax/b);  // on passe d'une valeure d'accélération à un angle
    axy = asin(ay/b);
  
    servox.write(-axa);
    servoy.write(-axy);
    
    delay(50);
}

Et elles viendraient magiquement dans vos variables ? Allons allons... :slight_smile:

c'est vrai que c'est bête quand on y pense :smiley:

Vous progressez sur le chemin de la sagesse :slight_smile:

Pour poursuivre, que pensez vous que retourne la fonction [color=red]xx[/color]= asin(v) (petit indice, regardez le commentaire en anglais dans le code source) et demandez vous si c'est compatible avec ce qu'attend l'appel de méthode write sur vos instances de Servo servox.write([color=red]xx[/color])

et bien le write de mon servomoteur nécessite un angle en °, je crois que j'aurais du mettre la fonction sin dans ce cas ? mais fonction que l'on m'a fournit est bien arcsin(v)

vous n'avez pas répondu à la question clé - quelle est l'unité de l'angle retourné par arc-sinus()

la doc dit cela (si vous êtes allé voir):

// The asin() function computes the principal value of the arc sine of
// __x.  [color=red]The returned value is in the range [-pi/2, pi/2] radians[/color]. A
// domain error occurs for arguments not in the range [-1, +1].

extern double asin(double __x) __ATTR_CONST__;

est-ce que ma question est plus claire comme cela?

En regardant la doc du MMA7660, je pense que vous avez pris en compte qu'au mieux, la résolution de votre stabilisation sera de 2.69 °.

Cordialement.

Pierre

Bonjour JML, désolé de mon absence étant en bac blanc cette semaine je ne me suis pas trop posé sur le problème? si je comprends bien mon erreur viendrait de l'unité de ma fonction. Cependant la formule littérale contient un arcsin, je devrais alors changer ma formule ou traduire les valeurs sous forme [-1;1].

Non

vous avez des radians entre [-pi/2, pi/2] en sortie de la fonction et voulez des degrés entre 0 et 180....

Faut être plus explicite ?

Non c'est bon j'ai compris où vous vouliez en venir cette fois, il me faut donc passer les radians en degrés.
J'ai trouvé cette formule sur un autre forum : angle_radians = angle_degres * pi / 180

je devrais donc faire : angle_radians *180 /M_PI pour avoir mes degrés

M_PI viens de la librairie arduino de base et donne une valeur de pi

presque - n'oubliez pas que l'intervalle de départ est entre [-pi/2, pi/2] soit -90° et +90° soit une amplitude de 180° mais vous voulez un nombre en 0° et 180° (même amplitude mais il faut aussi faire une translation)

oui je viens de m'en rendre compte en testant le programme sur mon installation, je vais essayer de trouver comment définir ces plages, merci

Petit indice: si vous ajoutez PI/2 à la valeur retournée par l'arc-sinus, votre intervalle en radian devient [0, pi].... sachant que 0 radian c'est 0° et PI radian c'est 180°... :slight_smile:

[EDIT:] JML plus rapide

Il suffit d'ajouter 90.

Donc en somme si je rajoute 90 (pi/2) à la valeur de mon arc sinus je n'ai pas besoin de m'embêter avec les plages et je peux passer directement de radians en degrés comme les limites des plages sont égales :slight_smile:

si x est entre [-pi/2, pi/2] alors y = (x+pi/2) est entre [0, pi] et donc a = (y * 180 / pi) sera entre [0, 180]

--> a = (x+pi/2) * (180/pi)

--> ou encore en développant a = 180 x / pi + 90 (ce que jambe appelle ajouter 90)

Je vous avoue que je suis un peu perdu là :sweat_smile: mais je comprends le système, a serait donc ma valeur en degrés et les opérations au dessus la manière d'y arriver à partir des radians :wink:

euh vous nous avez pas dit

je suis en terminale S SI

dans le premier mail?
il me semble que ce sont des maths de niveau 4ème ou 3ème... faut réviser le cercle unitaire et la définition des radians...

oui si x est le résultat du arc-sinus, alors a est la valeur correspondante en degrés, tournée dans le sens des aiguilles d'une montre en 90° (mais attention demandez vous si c'est le même angle)

oups.. :slight_smile: en effet je connais le cercle trigo en math et les radians en SI mais je suis ne me souviens pas avoir fait de changement de plage de valeur c'est ce qui me perturbait

Mon programme en est donc arrivé là :

#include <MMA7660.h>
#include <Wire.h>
#include <Servo.h>
#define M_PI 3.141592653589793238462643
MMA7660 acc;   //accéléromètre
Servo servox;  //servomoteur axe x
Servo servoy;  //servomoteur axe y

void setup()
{
    int ax = 0; // position initiale totalement horizontale
    int ay = 0;
    int az = 0;
    Wire.begin();
    acc.init();
    Serial.begin(115200); // calibrage à 115 200 bauds
    servox.attach(6); // servomoteur axe x
    servoy.attach(7); // servomoteur axe y
    
    
    
}

void loop()
{
    float ax, ay, az;
    acc.getAcceleration(&ax,&ay,&az);// demander l'accélération mesurée par l'accéléromètre
    int axa, aya;  
    float b = (sqrt(ax*ax)+(ay*ay)+(az*az));// constante 
    
    
    axa = 180*asin(ax/b)/ (M_PI + 90);  // on passe d'une valeure d'accélération à un angle
    aya = 180*asin(ay/b)/ (M_PI + 90);
    
    servox.write(-axa);
    servoy.write(-aya);
    
    delay(5000);
}

il ne m'affiche aucune erreur lorsque je le compile il ne me reste plus qu'à le tester en simulation réel pour voir si il manque encore des choses :slight_smile: