IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Utiliser un PID pour améliorer la stabilisation d'une plateforme MPU6050


Sujet :

Arduino

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 20
    Points : 9
    Points
    9
    Par défaut Utiliser un PID pour améliorer la stabilisation d'une plateforme MPU6050
    Bonsoir,
    Je dois faire une sorte de plateforme afin de stabiliser une caméra à l'aide d'une arduino UNO, d'un servo-moteur et d'un MPU6050.
    J'arrive bien à faire en sorte que la "caméra" reste droite mais je dois l'améliorer grâce à l'utilisation d'un PID.
    J'ai fais quelque recherches sur internet pour en arriver à ce code, mais je ne pense vraiment pas qu'il soit correct. Je dois tester la stabilisation pour Ki=Kd=0, puis Kp=Kd=0 puis enfin Kp=Ki=0.
    Je ne comprend cependant pas quoi mettre comme valeur dans "setpoint"
    Pourriez-vous m'éclaircir ?
    Merci d'avance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    #include <Wire.h>
    #include <MPU6050.h>
    #include <Servo.h>
    #include <PID_v1.h>
     
    #define _DEBUG false 
    //-------------Declarations capteur et servo----------------
    Servo servo1, servo2;         
    int servo1_pin = 11;
    int servo2_pin = 10;
    MPU6050 sensor ;
    int16_t ax, ay, az ;
    int16_t gx, gy, gz ;
    //---------PID--------------
    double input;
    double output;
    double setpoint;
    double Kp=0, Ki=10, Kd=0;
     
    PID myPID(&input, &output, &setpoint, Kp, Ki, Kd, REVERSE);
     
     
     
    void setup ( )
    {
    servo1.attach ( servo1_pin );
    servo2.attach ( servo2_pin );
    Wire.begin ( );
    Serial.begin  (9600);
    Serial.println  ( "Initializing the sensor" );
    sensor.initialize ( );
    Serial.println (sensor.testConnection ( ) ? "Successfully Connected" : "Connection failed");
    delay (1000);
    Serial.println ( "Taking Values from the sensor" );
    setpoint=90;
    myPID.SetMode(AUTOMATIC);
    myPID.SetTunings(Kp,Ki,Kd);
    myPID.SetOutputLimits(0, 180);
     
    delay (1000);
    }
     
     
     
     
    void loop ( )
    {
    sensor.getMotion6 (&ax, &ay, &az, &gx, &gy, &gz);
    input=map (ay, 17000, -17000, 0, 180) ;
    myPID.Compute();
    servo1.write(output);
    Serial.println(output);
     
    //delay(200);
     
    }

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 579
    Points : 56 603
    Points
    56 603
    Billets dans le blog
    40
    Par défaut
    Bonjour,

    setpoint, c'est la consigne en entrée. Mais pour t'aider davantage, il faudrait nous détailler un peu la structure de ton système et son asservissement.

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par f-leb Voir le message
    Bonjour,

    setpoint, c'est la consigne en entrée. Mais pour t'aider davantage, il faudrait nous détailler un peu la structure de ton système et son asservissement.
    J'essaye en quelque sorte de reproduire un stabilisateur de caméra comme sur ce site : https://www.instructables.com/id/Gyr...ino-and-Servo/
    Et le problème est que même en lisant plusieurs articles, codes, sur le PID je n'arrive toujours pas à comprendre comment l'appliquer à mon problème

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 579
    Points : 56 603
    Points
    56 603
    Billets dans le blog
    40
    Par défaut
    Pour moi, c'est un système en boucle ouverte. Tu pilotes le servo en fonction de l'inclinaison du support mais tu n'as aucun retour sur l'angle pris réellement en sortie du servo.

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par f-leb Voir le message
    Pour moi, c'est un système en boucle ouverte. Tu pilotes le servo en fonction de l'inclinaison du support mais tu n'as aucun retour sur l'angle pris réellement en sortie du servo.
    D'accord mais je n'arrive pas trop à faire le lien avec mon problème

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 266
    Points : 4 810
    Points
    4 810
    Par défaut
    Bonjour

    Un régulateur PID, va prendre une valeur de consigne (l’assiette de la caméra doit être à 0°) c'est le setpoint et une valeur mesurée (un capteur sur la caméra qui va donner la mesure de l’assiette, c'est loin d'être évident ici), il en fait la différence (c'est l'erreur du système) puis va passer cela dans un calcul (le PID) pour en sortir la valeur qui est appliquée à l'entrainement.

    De base une régulation PI ou PID c'est pour un système intégrateur. Sauf que un servomoteur n'est pas un système intégrateur. On lui donne une consigne et il y a va. Pour le faire, à l'intérieur il y a déjà un régulateur PI ou PID.

    Ce que F-Leb t'explique c'est que dans ce cas on ne fait pas de régulation. On mesure l'assiette de la breadboard (il y a tant d’inclinaison latérale et avant/arrière) et on donne la commande aux servos d'être à l'opposé (pour que la somme soit nulle et la caméra à l’horizontale). Mais ce n'est en aucun cas l'application normale d'un PID (qui devrait avoir le capteur d'angle sur la partie destinée à la caméra) et qui devrait utiliser des moteurs et non des servomoteurs.

    Au passage Kp = 0 donnera un système instable (Ki <> 0) ou qui ne reste pas en place (Ki = 0 et Kd <> 0) ...

    Delias

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    D'accord merci pour ces précisions.
    Cependant j'ai un autre, problème : sans le PID j'ai changé mon code pour un code qui semble plus correct et vus beaucoup de fois sur internet, mais quand je suis "à plat" la valeur "angle" retournée n'est pas du tout égale à 0... entre 20 et 22...
    Je ne comprend pas comment cela peut marcher chez tout le monde et pas chez moi, mes branchements sont pourtant correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #include "Wire.h"  
    #include "I2Cdev.h" 
    #include "MPU6050.h"
    #include <Servo.h>
    #include "math.h"
     
    MPU6050 accelgyro;
     Servo servo1, servo2; 
    int16_t ax, ay, az;  //mesures brutes
    int16_t gx, gy, gz;
    float angle=0;
     
     
    void setup()
    {
      Wire.begin(); 
      Serial.begin(9600);
      while (!Serial) 
      {
        ;
      }
      accelgyro.initialize();
    servo1.attach(11);
      delay(1000);
    }
     
    void loop() 
    {
      accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
      angle=0.98*(angle+float(gy)*0.01/131) + 0.02*atan2((double)ax,(double)az)*180/PI; //Filtre complémentaire + (180/PI pour une mesure en degrés)
      Serial.println(angle); 
      servo1.write(angle);
     
      delay(10);
    }

  8. #8
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 185
    Points : 11 551
    Points
    11 551
    Par défaut
    Bonjour à tous,
    Tout à fait, l'exemple dans le lien donné plus haut n'est pas vraiment un système asservie, ce système ne fait pas réellement de régulation il fait de la compensation.

    Sinon pour expliquer "avec les mains" le rôle de kp, ki, et kd je dirai :
    kp, c'est la commande en elle même, par exemple si ça penche je compense de x% dans l'autre sens.
    ki, corrige la dérive de l'erreur entre la mesure et sa correction.
    kd, affectera la rapidité de l'asservissement sachant que plus on est rapide et plus on va créer de l'oscillation en cas de réaction.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  9. #9
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    En fait j'aimerai donner un angle à ma plateforme, puis neutraliser les effets des correcteurs
    (Kp= Kd = 0) puis donner différentes valeurs à KI analyser le comportement de mon système en
    terme de rapidité et précision ? Mais je n'arrive pas à "coder" tout ça, j'ai regarder plein d'exemples sur internet mais j'ai des résultats vraiment catastrophiques

  10. #10
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 579
    Points : 56 603
    Points
    56 603
    Billets dans le blog
    40
    Par défaut
    La plateforme stabilisatrice du site instructables n'est pas un système asservi, inutile d'essayer d'y coller un PID, ou alors il faut revoir la conception du système.

    Delias te l'a expliqué, une modification "simple" à mettre en oeuvre serait de mettre le MPU6050 sur le support en sortie du servomoteur.
    Dans ce cas la consigne est une constante (setpoint), par exemple 0° si tu veux que le support reste horizontal. Le MPU6050 retourne un angle qui n'est pas nul, il y a donc une erreur que le PID va pouvoir corriger.

    Pour la mesure d'inclinaison, as-tu un lien vers la bibliothèque que tu utilises ?

  11. #11
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    C'est pourtant une consigne que j'ai dans mon projet, c'est qu'à mon avis pour le PID on se base que sur un cas particulier d'où le "commencer par incliner votre plateforme d'un certain angle".
    Pour les bibliothèques :
    https://github.com/jrowberg/i2cdevli...master/Arduino , il y a les 2 bibliothèques "I2Cdev" et "MPU6050" sur ce lien

  12. #12
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 579
    Points : 56 603
    Points
    56 603
    Billets dans le blog
    40
    Par défaut
    Citation Envoyé par Lilou7813 Voir le message
    Je ne comprend pas comment cela peut marcher chez tout le monde et pas chez moi, mes branchements sont pourtant corrects
    C'est ce qu'ils disent tous, mais apparemment ton capteur semble bien communiquer s'il retourne des valeurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      angle=0.98*(angle+float(gy)*0.01/131) + 0.02*atan2((double)ax,(double)az)*180/PI; //Filtre complémentaire + (180/PI pour une mesure en degrés)
    ça ressemble bien à ce qu'on trouve un peu partout...

    Mais ton capteur est-il bien positionné ? La rotation est mesurée autour de l'axe Y mais il y a deux possibilités.
    Le capteur est-il bien "à plat" au démarrage de l'Arduino ?

  13. #13
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par f-leb Voir le message
    Mais ton capteur est-il bien positionné ?
    Le capteur est-il bien "à plat" au démarrage de l'Arduino ?
    Oui effectivement j'ai résolu ce problème, maintenant y'en a un autre c'est que le servo est vraiment lent quoi, je sais pas si c'est possible qu'il réagisse vraiment rapidement lorsque j'incline la plateforme

  14. #14
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 579
    Points : 56 603
    Points
    56 603
    Billets dans le blog
    40
    Par défaut
    Tu peux peut-être jouer avec les coefficients du filtre (0.98 et 0.02).

    Quelle est la référence du servo ? Comment est-il alimenté ?

  15. #15
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    C'est un FS90 alimenté en 5V

  16. #16
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Ah j'ai mis 0.6 et 0.4 c'est beaucoup mieux, et c'est possible de rendre le mouvement plus "lisse", ça donne un effet un peu "cranté" quand le servo tourne ?

  17. #17
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 579
    Points : 56 603
    Points
    56 603
    Billets dans le blog
    40
    Par défaut
    Quand tu dis qu'il est lent, c'est que sa vitesse de rotation est faible ou bien parce qu'il met du temps à réagir ?

    Tu passes par une alimentation extérieure ? Sinon, à 6V tu gagnes 15-20% en vitesse de rotation.

  18. #18
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Je suis branché directement sur le port 5V de mon Arduino UNO et c'était la vitesse de rotation mais j'ai changé les coefficients du filtre et ça m'a l'air pas mal

  19. #19
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 579
    Points : 56 603
    Points
    56 603
    Billets dans le blog
    40
    Par défaut
    Pour un seul servo tournant "à vide", ça passe encore... Avec un 2e servo et sous charge, tu peux mettre l'Arduino à genoux...
    Demande à notre spécialiste, organisateur de servo parades

  20. #20
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 149
    Points : 21
    Points
    21
    Par défaut
    Bonjour , j'ai un peu le meme problème je cherche a savoir comment insérer mon correcteur dans mon stabilisateur avec une masse mobile . Le lien de mon projet est ci-dessous:
    https://www.developpez.net/forums/d1...u-arduino-uno/
    Merci d'avance pour votre aide.

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/03/2009, 12h30
  2. Réponses: 1
    Dernier message: 27/11/2008, 11h55
  3. cherche aide pour améliorer le traitement d'une requête
    Par nomade333 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 22/04/2008, 15h15
  4. Utiliser un userform pour lire et écrire dans une feuille de calculs
    Par sebi78 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/04/2007, 20h51
  5. Réponses: 10
    Dernier message: 10/11/2005, 17h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo