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

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    octobre 2019
    Messages
    14
    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 : 14
    Points : 4
    Points
    4
    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
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : janvier 2009
    Messages : 10 642
    Points : 46 291
    Points
    46 291
    Billets dans le blog
    9
    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
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    octobre 2019
    Messages
    14
    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 : 14
    Points : 4
    Points
    4
    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
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : janvier 2009
    Messages : 10 642
    Points : 46 291
    Points
    46 291
    Billets dans le blog
    9
    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
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    octobre 2019
    Messages
    14
    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 : 14
    Points : 4
    Points
    4
    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
    839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : septembre 2008
    Messages : 839
    Points : 2 721
    Points
    2 721
    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
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    octobre 2019
    Messages
    14
    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 : 14
    Points : 4
    Points
    4
    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
    Ancien développeur matériel électronique (Hard/Soft)
    Inscrit en
    avril 2002
    Messages
    2 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ancien développeur matériel électronique (Hard/Soft)
    Secteur : Service public

    Informations forums :
    Inscription : avril 2002
    Messages : 2 492
    Points : 8 502
    Points
    8 502
    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
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    octobre 2019
    Messages
    14
    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 : 14
    Points : 4
    Points
    4
    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
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : janvier 2009
    Messages : 10 642
    Points : 46 291
    Points
    46 291
    Billets dans le blog
    9
    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
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    octobre 2019
    Messages
    14
    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 : 14
    Points : 4
    Points
    4
    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
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : janvier 2009
    Messages : 10 642
    Points : 46 291
    Points
    46 291
    Billets dans le blog
    9
    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
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    octobre 2019
    Messages
    14
    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 : 14
    Points : 4
    Points
    4
    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
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : janvier 2009
    Messages : 10 642
    Points : 46 291
    Points
    46 291
    Billets dans le blog
    9
    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
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    octobre 2019
    Messages
    14
    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 : 14
    Points : 4
    Points
    4
    Par défaut
    C'est un FS90 alimenté en 5V

  16. #16
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    octobre 2019
    Messages
    14
    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 : 14
    Points : 4
    Points
    4
    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
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : janvier 2009
    Messages : 10 642
    Points : 46 291
    Points
    46 291
    Billets dans le blog
    9
    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
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    octobre 2019
    Messages
    14
    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 : 14
    Points : 4
    Points
    4
    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
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : janvier 2009
    Messages : 10 642
    Points : 46 291
    Points
    46 291
    Billets dans le blog
    9
    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

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