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 :

Correcteur PID avec un MPU6050 et un moteur.


Sujet :

Arduino

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    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 Correcteur PID avec un MPU6050 et un moteur.
    Bonsoir tout le monde ceci est la suite de mon projet de stabilisateur de bateau a masse mobile (Stabilisateur du porte avion Charle de Gaule ).Si vous souhaitez voir tout le debut de ce projet je vous invite a jeter un coup d'oeil sur ce lien :https://www.developpez.net/forums/d1...u-arduino-uno/. Si vous êtes toujours là ,mon projet actuel est de faire en sorte que la planche ce stabilise le plus rapidement possible à l'aide d'un correcteur PID. Je ne suis qu'au tout début de ce codage , j'ai pour le moment récupérer un code de correcteur PID d'un stabilisateur de drone avec 2 moteurs que j'ai déjà commencé à adapter. Néanmoins je fais face a quelque soucis, car je ne comprend pas absolument tout le code et a vrai dire je me sens un peu perdue . C'est pourquoi je sollicite votre aide . Merci à tous 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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    #include <Wire.h>
    int16_t Acc_rawY,Gyr_rawY;
    float Acceleration[2];
    float Gyro_angle[2];
    float Total_angle[2];
    float elapsedTime,time,timePrev;
    int i;
    float rad_to_deg = 180/3.141592654;
    float PID,pwmLeft,pwmRight,error,previous_error;
    float pid_d =0;
    float pid_i =0;
    float pid_p =0;
    double kp=3.55;
    double kd=0.005;
    double ki=2.05;
    double throttle =1300;
    float desired_angle =0;
     
     
    void setup() {
      Wire.begin();
      Wire.beginTransmission(0x68);
      Wire.write(0);
      Wire.endTransmission(true);
      Serial.begin(250000);
      moteur.attach(...);
      time = millis();
      moteur.writeMicroseconds(1000);
      delay(7000);
    }
     
    void loop() {
     
      timePrev = time;
      time = millis();
      elapsedTime = (time - timePrev) / 1000;
      Wire.beginTransmission(0x68);
      Wire.write(0x3B);
      Wire.endTransmission(false);
      Wire.requestFrom(0x68,6,true);
      Acc_rawY = Wire.read()<<8| Wire.read();
      Gyro_angle[1] = Gyr_rawY/131;
      Total_angle[1] = 0.98*(Total_angle[1] + Gyro_angle[1]*elapsedTime) + 0.02*Acceleration_angle[1];
       error = Total_angle[1] - desired_angle;
      pid_p = kp*error;
    if (-3<error) and (error<3){
      pid_i = pid_i +(ki*error);
    }
      pid_d = kd*((error - previous_erreur)/elapsedTime);
      PID = pid_d + pid_i + pid_p;
    if(PID<-1000){
      PID=-1000;
    }
    if (PID>1000){
      PID=1000
    }
      pwmLeft = throttle +PID;
      pwmRight = throttle -PID;
     
    //Right
    if (pwmRight < 1000){
      pwmRight =1000;
     
    }
    if(pwmRight>2000){
      pwmRight =2000;
    } 
    //Left
    if (pwmLeft < 1000){
      pwmLeft =1000;
     
    }
    if(pwmLeft>2000){
      pwmLeft =2000;
    }
     
     
     
     
    Ce que je pensais faire!!!
     
    int i = 200
     
    if (abs (int alpha(t) - int alpha(t+1)) < 2 ){
      i+=5
      moteur.setSpeed(i)
    }
    else if (abs (int alpha(t) - alpha(t+1)) > 2 ){
      i-=5
      moteur.setSpeed(i)
    }

    Je ne comprend pas ceci:
    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
    if(PID<-1000){
      PID=-1000;
    }
    if (PID>1000){
      PID=1000
    }
      pwmLeft = throttle +PID;
      pwmRight = throttle -PID;
     
    //Right
    if (pwmRight < 1000){
      pwmRight =1000;
     
    }
    if(pwmRight>2000){
      pwmRight =2000;
    } 
    //Left
    if (pwmLeft < 1000){
      pwmLeft =1000;
     
    }
    if(pwmLeft>2000){
      pwmLeft =2000;
    }
    et ceci: //car c'est à dire que si error n'est pas inclus dans cette intervalle alors il n'a pas de correcteur intégrateur ,pourquoi donc?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (-3<error) and (error<3){
      pid_i = pid_i +(ki*error);
    }

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    j'ai vu
    qui reprend le concept d'une position destination donnée par une entrée externe (ici ils ont mis un encodeur rotatif) qui est un peu similaire à ce que jpbricole avait effectué avec son potentiomètre dans sa simulation. ça ne devrait pas être top dur à changer pour prendre comme consigne donc celle du MPU.

    le code se trouve ici

    ils utilisent la librairie TimerOne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      Timer1.initialize(sampleTime * 1000);               // setup timer 1
      Timer1.attachInterrupt(Compute);
    qui leur permet d'exécuter la fonction Compute() toutes les N µs, ici sampleTime vaut 10 donc ils appellent la fonction 100 fois par seconde. ça peut se faire sans cette librairie bien sûr, juste avec l'approche avec millis()

    Le régulateur PID est codé "à la main" dans la fonction Compute() avec des bornes min et max pour le pilotage de la vitesse.


    cette autre vidéo est pas mal pour comprendre le principe aussi


  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    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
    Merci beaucoup mais j'ai déjà regardé pas mal de vidéo du deuxièmes mecs car il a fait pas mal de video sur les pid .Mais bon pour le moment je n'en suis qu'au tout début et puis je n'est pas trop de temps pour cela non plus malheureusement . Mais merci pour le premier lien que je n'avais pas encore vue je vais jeter un coup d'deuil au code et je vous tiendrai au courant.😉😊

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    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
    Je ne sais pas si c'est possible et si ça intéresserait quelqu'un mais ça serait cool je trouve si on pouvait se réunir une soirée ou se fixer une heure et avoir une conversation à plusieurs .Après avoir ,que ça soit sur un chat vocal ou sur le chat du site par exemple pour pouvoir avancer plus vite sur le projet et avoir comme une relation prof/éleves ou nous réunissons tous notre savoir en directe .J'aimerai connaitre un peu votre avis sur la question .Pourriez vous mettre un pouce vert si vous êtes d'accord et rouge sinon . Merci bien.😊😊

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    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
    J'ai essayé de faire quelque essai et j'ai graisser mes axes de poulies et mon moteur pour leur donner une seconde vie et on voit vraiment la différence .Néanmoins au bout de 10 /15 seconde mon lmd182000t surchauffe et deviens intouchable malgré un dissipateur thermique ferreux, je cesse donc de faire tourner mon programme.Il est pourtant dit dans le datasheetqu'il supporte des piques de 6A de courant et 3A en continu . Je ne sais pas si il faut envisager le remplacer ,et par quoi dans ce cas?? Ou bien envisager un water cooling ?? J'ai fais des mesure en faisant tourner le moteur a vide car les valeurs non pas le temps de s'afficher si je rajoute les contraintes du système et je consomme 11,56V et 2,0 mA sur le calibre 600mA lorsque le moteur tourne dans le sens trigonométrique et 11,71V et 3,8mA sur le calibre 600mA lorsque le moteur tourne dans le sens des aiguilles d'une montre.A quoi cela peut il etre du et comment équilibrer ces valeurs ?De plus j'ai continuer le correcteur PID mais je bloque a cette étape je ne sais pas quoi écrire par la suite...
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    #include "Wire.h"  // Arduino Wire library
    #include "I2Cdev.h"  //Installer ces 2 librairies
    #include "MPU6050.h"
    #include "math.h"
    #include <AFMotor.h>
    #define moteurDirectionPin 8
    #define moteurVitessePin 11
    #define moteurDirectionCW HIGH                    // Sens des aiguilles d'une montre
    #define moteurDirectionCCW LOW  
    int16_t Acc_rawY,Gyr_rawY;
    float Acceleration[2];
    float Gyro_angle[2];
    float Total_angle[2];
    float elapsedTime,time,timePrev;
    int i;
    float rad_to_deg = 180/3.141592654;
    float PID,pwmLeft,pwmRight,error,previous_error;
    float pid_d =0;
    float pid_i =0;
    float pid_p =0;
    double kp=3.55;
    double kd=0.005;
    double ki=2.05;
    float desired_angle =0;
    // AD0 low = 0x68 (default for InvenSense evaluation board)
    // AD0 high = 0x69
    MPU6050 accelgyro;
    int inputPin =A0;
    int inputPin1 =A1;
    uint8_t Accel_range;
    uint8_t Gyro_range;
    float angle=0;
                      // Sens contraire (faudra peut etre inverser)
    byte moteurVitesse = 250;
    void setup() {
     
      pinMode (moteurVitessePin, OUTPUT);
      pinMode(moteurDirectionPin,OUTPUT);
      Wire.begin();  //I2C bus
      Serial.begin(9600);
      while (!Serial) {
        ; // wait for serial port to connect. Needed for native USB (LEONARDO)
      }
       // initialize device
      Serial.println("Initialisation I2C...");
      accelgyro.initialize();
     
      // verify connection
      Serial.println("Test de la conection du dispositif ...");
      Serial.println(accelgyro.testConnection() ? "MPU6050 connection reussie" : "MPU6050 connection echec");
      delay(1000);
     
      Serial.begin(9600);           // set up Serial library at 9600 bps
     
      pinMode(inputPin,INPUT_PULLUP);
      pinMode(inputPin1,INPUT_PULLUP);
      time = millis();        
      @moteur.writeMicroseconds(1000);     
      delay(7000);
     
    }
     
     
    void loop() {
     
      timePrev = time;
      time = millis();
      elapsedTime = (time - timePrev) / 1000;
      @Wire.beginTransmission(0x68);
      @Wire.write(0x3B);
      @Wire.endTransmission(false);
      @Wire.requestFrom(0x68,6,true);
      @Acc_rawY = Wire.read()<<8| Wire.read();
      Gyro_angle[1] = Gyr_rawY/131;
      Total_angle[1] = 0.98*(Total_angle[1] + Gyro_angle[1]*elapsedTime) + 0.02*Acceleration_angle[1];
       error = Total_angle[1] - desired_angle;
      pid_p = kp*error;
    if (-3<error) and (error<3){
      pid_i = pid_i +(ki*error);
    }
    else{
      pid_i = 0
    }
      pid_d = kd*((error - previous_erreur)/elapsedTime);
      PID = pid_d + pid_i + pid_p;
    }
     
    for i in range(0,255){
      if (abs (int alpha(t) - int alpha(t+1)) < 2 ){
      i+=PID
      moteur.setSpeed(i)
    }
    else if (abs (int alpha(t) - alpha(t+1)) > 2 ){
      i-=PID
      moteur.setSpeed(i)
    }
    }

    Et je ne comprend pas les lignes qui ont un @ à leur début.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    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
    Ah oui j'avais oublié voici mon circuit en entier.
    Pièce jointe 540392

  7. #7
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    je suppose que le moteur n'est pas alimenté par 2 piles AA ?

    Comment comptez vous tester ? pour que le PID fasse son boulot, il faut que la correction influence la boucle de mesure. tel que votre montage existe, pas simple de le mettre dans l'eau.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    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
    Oui effectivement le système est alimenter à l'aide d'une lipo de 3s de11,1V et 5200mAh. Et je vais placer 2 tige traversant la planche en son millieu .Voici le schema que j'avais fait en tout début de conception:Pièce jointe 540747

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    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, voici la dernière version de mon correcteur PID:


    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    #include "Wire.h"  // Arduino Wire library
    #include "I2Cdev.h"  //Installer ces 2 librairies
    #include "MPU6050.h"
    #include "math.h"
    #include <AFMotor.h>
    #define moteurDirectionPin 8
    #define moteurVitessePin 11
    #define moteurDirectionCW HIGH                    // Sens des aiguilles d'une montre
    #define moteurDirectionCCW LOW  
    int16_t Acc_rawY,Gyr_rawY;
    float Acceleration[1];
    float Gyro_angle[1];
    float Total_angle[1];
    float Acceleration_angle[1];
    float elapsedTime,time,timePrev;
    int i;
    float rad_to_deg = 180/3.141592654;
    float PID,error;
    float previous_error;
    float pid_d =0;
    float pid_i =0;
    float pid_p =0;
    double kp=3.55;
    double kd=0.005;
    double ki=2.05;
    float desired_angle =0;
    // AD0 low = 0x68 (default for InvenSense evaluation board)
    // AD0 high = 0x69
    MPU6050 accelgyro;
    int inputPin =A0;
    int inputPin1 =A1;
    uint8_t Accel_range;
    uint8_t Gyro_range;
    float angle=0;
                      // Sens contraire (faudra peut etre inverser)
    byte moteurVitesse = 250;
    void setup() {
     
      pinMode (moteurVitessePin, OUTPUT);
      pinMode(moteurDirectionPin,OUTPUT);
      Wire.begin();  //I2C bus
      Serial.begin(9600);
      while (!Serial) {
        ; // wait for serial port to connect. Needed for native USB (LEONARDO)
      }
       // initialize device
      Serial.println("Initialisation I2C...");
      accelgyro.initialize();
     
      // verify connection
      Serial.println("Test de la conection du dispositif ...");
      Serial.println(accelgyro.testConnection() ? "MPU6050 connection reussie" : "MPU6050 connection echec");
      delay(1000);
     
      Serial.begin(9600);           // set up Serial library at 9600 bps
     
      pinMode(inputPin,INPUT_PULLUP);
      pinMode(inputPin1,INPUT_PULLUP);
      time = millis();        
    }
     
    void loop() {
     
      timePrev = time;
      time = millis();
      elapsedTime = (time - timePrev) / 1000;
      Wire.beginTransmission(0x68);
      Wire.write(0x3B);
      Wire.endTransmission(false);
      Wire.requestFrom(0x68,6,true);
      Acc_rawY = Wire.read()<<8| Wire.read();
      Gyro_angle[1] = Gyr_rawY/131;
      Total_angle[1] = 0.98*(Total_angle[1] + Gyro_angle[1]*elapsedTime) + 0.02*Acceleration_angle[1];
      error = Total_angle[1] - desired_angle;
      pid_p = kp*error;
     
     if ((-3<error) and (error<3)){
      pid_i = pid_i +(ki*error);
    }
     
      pid_d = kd*((error - previous_error)/elapsedTime);
      PID = pid_d + pid_i + pid_p;
      uint8_t i;
    for(i=0; i<255; i++) {
    if (abs (int alpha(t) - int alpha(t+1)) < 2 ){
      i+=5
      moteur.setSpeed(i)
    }
    else if (abs (int alpha(t) - alpha(t+1)) > 2 ){
      i-=5
      moteur.setSpeed(i)
    }
    previous_error = error;
    }

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    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
    Bonsoir,
    Je n'arrive pas à voir d'ou viens le problème ,pourriez vous m'aider a comprendre.

  11. #11
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Citation Envoyé par seb201 Voir le message
    Bonsoir,
    Je n'arrive pas à voir d'ou viens le problème ,pourriez vous m'aider a comprendre.
    Il faut mettre les int entre parenthèses pour faire un cast (changement de type)

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    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
    Citation Envoyé par Jay M Voir le message
    Il faut mettre les int entre parenthèses pour faire un cast (changement de type)
    Merci ,j'ai désormais un second problème je ne sais pas comment stocké 2angles à deux temps différents pour pouvoir les comparer .Pièce jointe 542021

  13. #13
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    'ai désormais un second problème je ne sais pas comment stocké 2angles à deux temps différents pour pouvoir les comparer
    oui c'est pas magique comme ça, angle() n'est pas une fonction. est-ce juste la position précédente que vous voulez conserver ?

    notez que vous ne pouvez pas gérer le temps correctement avec des float
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float elapsedTime, time, timePrev;
    il faut prendre des unsigned long (ou uint32_t)

    pouvez vous poster la version en cours de votre code ?

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    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
    Oui je souhaite compter la valeur de l'angle précédent avec celle de l'angle actuel.
    Voici le code sans correcteur puis celui du correcteur PID.
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    #include "Wire.h"  // Arduino Wire library
    #include "I2Cdev.h"  //Installer ces 2 librairies
    #include "MPU6050.h"
    #include "math.h"
    #include <AFMotor.h>
    #define moteurDirectionPin 8
    #define moteurVitessePin 11
    #define moteurDirectionCW HIGH                    // Sens des aiguilles d'une montre
    #define moteurDirectionCCW LOW  
    // AD0 low = 0x68 (default for InvenSense evaluation board)
    // AD0 high = 0x69
    MPU6050 accelgyro;
    int inputPin =A0;
    int inputPin1 =A1;
    int16_t ax, ay, az;  //mesures brutes
    int16_t gx, gy, gz;
    uint8_t Accel_range;
    uint8_t Gyro_range;
    float angle=0;
                      // Sens contraire (faudra peut etre inverser)
    byte moteurVitesse = 250;
     
     
    void setup() {
      pinMode (moteurVitessePin, OUTPUT);
      pinMode(moteurDirectionPin,OUTPUT);
      Wire.begin();  //I2C bus
      Serial.begin(9600);
      while (!Serial) {
        ; // wait for serial port to connect. Needed for native USB (LEONARDO)
      }
     
      // initialize device
      Serial.println("Initialisation I2C...");
      accelgyro.initialize();
     
      // verify connection
      Serial.println("Test de la conection du dispositif ...");
      Serial.println(accelgyro.testConnection() ? "MPU6050 connection reussie" : "MPU6050 connection echec");
      delay(1000);
     
      Serial.begin(9600);           // set up Serial library at 9600 bps
      pinMode(inputPin,INPUT_PULLUP);
      pinMode(inputPin1,INPUT_PULLUP);
     
    }
     
    void loop() {
      accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
      angle=0.0*(angle+float(gy)*0.01/131) + 1*atan2((double)ax,(double)az)*180/PI;
      Serial.println(angle); 
      controlemotV2(angle);
      delay(10);
    }
     
    void controlemotV2(int alpha) {
     
    int Val1=digitalRead(inputPin);
     Serial.println(Val1);
     
     int Val2=digitalRead(inputPin1);
     Serial.println(Val2);
     
    if ( Val1==0){
       moteurVitesse = 255;
      analogWrite(moteurVitessePin,moteurVitesse);
      digitalWrite(moteurDirectionPin, moteurDirectionCCW);
     
     
    }
    else if ( Val2==0){
       moteurVitesse = 255;
      analogWrite(moteurVitessePin,moteurVitesse);
      digitalWrite(moteurDirectionPin, moteurDirectionCW);
    }
    else if (int (alpha < -10)){
       moteurVitesse = 255;
       analogWrite(moteurVitessePin,moteurVitesse);
       digitalWrite(moteurDirectionPin, moteurDirectionCCW); //fait avancer le chariot vers la droite
     
    }
    else if (int (alpha > 10)){
      moteurVitesse = 255;
      analogWrite(moteurVitessePin,moteurVitesse);
      digitalWrite(moteurDirectionPin, moteurDirectionCW); //fait avancer le chariot vers la gauche
     
    }
    else{
       moteurVitesse = 0;
      analogWrite(moteurVitessePin,moteurVitesse);
      digitalWrite(moteurDirectionPin, moteurDirectionCCW);
     
     }
    }
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    #include "Wire.h"  // Arduino Wire library
    #include "I2Cdev.h"  //Installer ces 2 librairies
    #include "MPU6050.h"
    #include "math.h"
    #include <AFMotor.h>
    #define moteurDirectionPin 8
    #define moteurVitessePin 11
    #define moteurDirectionCW HIGH                    // Sens des aiguilles d'une montre
    #define moteurDirectionCCW LOW  
    int16_t Acc_rawY,Gyr_rawY;
    float Acceleration[1];
    float Gyro_angle[1];
    float Total_angle[1];
    float Acceleration_angle[1];
    float elapsedTime,time,timePrev;
    int i;
    float rad_to_deg = 180/3.141592654;
    float PID,error;
    float previous_error =0;
    float pid_d =0;
    float pid_i =0;
    float pid_p =0;
    double kp=3.55;
    double kd=0.005;
    double ki=2.05;
    float desired_angle =0;
    // AD0 low = 0x68 (default for InvenSense evaluation board)
    // AD0 high = 0x69
    MPU6050 accelgyro;
    int inputPin =A0;
    int inputPin1 =A1;
    uint8_t Accel_range;
    uint8_t Gyro_range;
    float angle=0;
    int16_t ax, ay, az;  //mesures brutes
    int16_t gx, gy, gz;       
                      // Sens contraire (faudra peut etre inverser)
    byte moteurVitesse = 250;
    void setup() {
     
      pinMode (moteurVitessePin, OUTPUT);
      pinMode(moteurDirectionPin,OUTPUT);
      Wire.begin();  //I2C bus
      Serial.begin(9600);
      while (!Serial) {
        ; // wait for serial port to connect. Needed for native USB (LEONARDO)
      }
       // initialize device
      Serial.println("Initialisation I2C...");
      accelgyro.initialize();
     
      // verify connection
      Serial.println("Test de la conection du dispositif ...");
      Serial.println(accelgyro.testConnection() ? "MPU6050 connection reussie" : "MPU6050 connection echec");
      delay(1000);
     
      Serial.begin(9600);           // set up Serial library at 9600 bps
     
      pinMode(inputPin,INPUT_PULLUP);
      pinMode(inputPin1,INPUT_PULLUP);
      time = millis();        
    }
     
    void loop() {
      accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
      angle=0.0*(angle+float(gy)*0.01/131) + 1*atan2((double)ax,(double)az)*180/PI;
      Serial.println(angle); 
      controlemotV2(angle);
      delay(10);
    }
     
    void controlemotV2(int alpha) {
     
    int Val1=digitalRead(inputPin);
     Serial.println(Val1);
     
     int Val2=digitalRead(inputPin1);
     Serial.println(Val2);
     
    if ( Val1==0){
       moteurVitesse = 255;
      analogWrite(moteurVitessePin,moteurVitesse);
      digitalWrite(moteurDirectionPin, moteurDirectionCCW);
     
     
    }
    else if ( Val2==0){
       moteurVitesse = 255;
      analogWrite(moteurVitessePin,moteurVitesse);
      digitalWrite(moteurDirectionPin, moteurDirectionCW);
    }
    else if (int (alpha < -10)){
       moteurVitesse = 255;
       analogWrite(moteurVitessePin,moteurVitesse);
       digitalWrite(moteurDirectionPin, moteurDirectionCCW); //fait avancer le chariot vers la droite
     
    }
    else if (int (alpha > 10)){
      moteurVitesse = 255;
      analogWrite(moteurVitessePin,moteurVitesse);
      digitalWrite(moteurDirectionPin, moteurDirectionCW); //fait avancer le chariot vers la gauche
     
    }
    else{
       moteurVitesse = 0;
      analogWrite(moteurVitessePin,moteurVitesse);
      digitalWrite(moteurDirectionPin, moteurDirectionCCW);
     
     }
    }
     
     
     
    void correcteur() {
     
      timePrev = time;
      time = millis();
      elapsedTime = (time - timePrev) / 1000;
      Wire.beginTransmission(0x68);
      Wire.write(0x3B);
      Wire.endTransmission(false);
      Wire.requestFrom(0x68,6,true);
      Acc_rawY = Wire.read()<<8| Wire.read();
      Gyro_angle[1] = Gyr_rawY/131;
      Total_angle[1] = 0.98*(Total_angle[1] + Gyro_angle[1]*elapsedTime) + 0.02*Acceleration_angle[1];
      error = Total_angle[1] - desired_angle;
      pid_p = kp*error;
     
     if ((-3<error) and (error<3)){
      pid_i = pid_i +(ki*error);
    }
     
      pid_d = kd*((error - previous_error)/elapsedTime);
      PID = pid_d + pid_i + pid_p;
     
     
     angle-t
     
    for(i=0; i<255; i=i+5) {
    if ((abs (int (angle(timePrev))) - abs(int( angle(time)))) < 2 ){
      moteur.setSpeed(i)
      moteur.run(BACKWARD);
    }
    else if ((abs (int alpha(t)) - abs(int alpha(t+1))) > 2 ){
       moteur.setSpeed(i)
       moterur.run(FORWARD);
    }
    }
    previous-error=error
    }

  15. #15
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Salut

    Le MPU6050 contient un DMP ("Digital Motion Processor") qui fusionne en hardware les données de l'accéléromètre et du gyroscope pour minimiser les effets des erreurs inhérentes à chaque capteur. C'est ce que j'utilise généralement et soit on en tire les angles d'Euler, soit les angles de roulis, tangage, lacet comme sortie (ou quaternions mais ça ne vous aidera pas)

    Au vu de votre code (I2Cdev.h et MPU6050.h) je suppose que vous utilisez la bibliothèque i2cdevlib de Jeff Rowberg et qu'elle est installée correctement.
    (en gros vous avez dupliqué le répertoire dans i2cdevlib/Arduino/I2Cdev ainsi que i2cdevlib/Arduino/MPU6050 dans le répertoire des libraries standard). Cette bibliothèque a déjà tout pour utiliser le DMP, donc ce serait dommage de s'en passer.


    Pour le câblage, c'est standard mais il faut câbler la pin d'interruption

    ARDUINO <-> MPU6050
    GND <-> GND
    5V <-> VCC
    SCL <-> SCL
    SDA <-> SDA
    D2 <-> INT
    (et éventuellement GND <-> AD0 pour fixer l'adresse)


    essayez déjà ce bout de code avec la console ouverte à 115200 bauds:
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    // remerciement à Jeff Rowberg pour sa bibliothèque i2cdevlib
    #include "Wire.h"
    #include "I2Cdev.h" //copier https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/I2Cdev  dans le répertoire des librairies
    #include "MPU6050_6Axis_MotionApps20.h" //copier https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050 dans le répertoire des librairies
     
    MPU6050 mpu;
     
    #define EULER_ANGLES // à commenter pour ne pas afficher les angles d'Euler
    //#define YPR_ANGLES // à commenter pour ne pas afficher les angles de roulis, tangage, lacet
     
     
    const float RADIANS_TO_DEGREES = 180.0 / M_PI;
     
    // MPU control/status vars
    uint8_t mpuIntStatus;   // holds actual interrupt status byte from MPU
    uint16_t packetSize;    // expected DMP packet size (default is 42 bytes)
    uint16_t fifoCount;     // count of all bytes currently in FIFO
    uint8_t fifoBuffer[64]; // FIFO storage buffer, doit être plus grand que packetSize
     
    // variables d'orientation/mouvement
    Quaternion q;
    VectorFloat gravity;
    float ypr[3];
    float euler[3];
     
    uint32_t lastChrono;
     
    #ifdef EULER_ANGLES
    float lastPsi ;
    float lastTheta ;
    float lastPhi;
    #endif
     
     
     
    #ifdef YPR_ANGLES
    float lastYaw;
    float lastPitch;
    float lastRoll;
    #endif
     
     
    volatile bool mpuInterrupt = false;     // indicates whether MPU interrupt pin has gone high
    void dmpDataReady() {
      mpuInterrupt = true;
    }
     
     
    void setup() {
      uint8_t dmpStatus;
     
      Wire.begin();
      Serial.begin(115200);
     
      mpu.initialize();
      if (!mpu.testConnection()) {
        Serial.println(F("pas de MPU"));
        while (true);
      }
     
      if (dmpStatus = mpu.dmpInitialize()) {
        Serial.print(F("Erreur DMP #"));
        Serial.println(dmpStatus);
        while (true);
      }
     
      mpu.setDMPEnabled(true);
      attachInterrupt(0, dmpDataReady, RISING);
      mpuIntStatus = mpu.getIntStatus();
      packetSize = mpu.dmpGetFIFOPacketSize(); // 42
    }
     
    void loop()
    {
      if (mpuInterrupt || fifoCount >= packetSize) { // on a des données
        mpuInterrupt = false;
        mpuIntStatus = mpu.getIntStatus();
        fifoCount = mpu.getFIFOCount();
        if ((mpuIntStatus & 0x10) || fifoCount == 1024) {     // test si overflow (ne devrait pas arriver si on dépile vite la FIFO)
          mpu.resetFIFO();       // reset
        } else if (mpuIntStatus & 0x02) {       // verifie si on a le "DMP data ready interrupt" (this should happen frequently)
          while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount(); // on s'assure que le buffer est suffisant, ça devrait être le cas
          mpu.getFIFOBytes(fifoBuffer, packetSize); // read a packet from FIFO fifoBuffer
          fifoCount -= packetSize;
     
          mpu.dmpGetQuaternion(&q, fifoBuffer);
          uint32_t currentChrono = micros();
     
    #ifdef EULER_ANGLES
          // Obtain Euler angles from buffer
          mpu.dmpGetEuler(euler, &q);
     
          float currentPsi = -euler[0] * RADIANS_TO_DEGREES;
          float currentTheta = euler[1] * RADIANS_TO_DEGREES;
          float currentPhi = -euler[2] * RADIANS_TO_DEGREES;
     
          if ((abs(currentPsi - lastPsi) > 1) || (abs(currentTheta - lastTheta) > 1) || (abs(currentPhi - lastPhi) > 1)) {
            Serial.print(F("Euler\t"));
            Serial.print(currentPsi, 0);
            Serial.write("\t");
            Serial.print(currentTheta, 0);
            Serial.write("\t");
            Serial.println(currentPhi, 0);
            lastPsi = currentPsi;
            lastTheta = currentTheta;
            lastPhi = currentPhi;
          }
    #endif
     
    #ifdef YPR_ANGLES
          // Obtain YPR angles from buffer
          mpu.dmpGetGravity(&gravity, &q);
          mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
     
          float currentYaw = ypr[0] * RADIANS_TO_DEGREES;       // yaw: (about Z axis)
          float currentPitch = -ypr[1] * RADIANS_TO_DEGREES;    // pitch: (nose up/down, about Y axis)
          float currentRoll = ypr[2] * RADIANS_TO_DEGREES;      // roll: (tilt left/right, about X axis)
     
          if ((abs(currentYaw - lastYaw) > 1) || (abs(currentPitch - lastPitch) > 1) || (abs(currentRoll - lastRoll) > 1)) {
            Serial.print(F("YPR\t"));
            Serial.print(currentYaw, 0);
            Serial.write("\t");
            Serial.print(currentPitch, 0);
            Serial.write("\t");
            Serial.println(currentRoll, 0);
            lastYaw = currentYaw;
            lastPitch = currentPitch;
            lastRoll = currentRoll;
          }
    #endif
     
     
     
          lastChrono = currentChrono;
        }
      }
    }
    (la compilation donne pas mal de warning de redéfinition, vous pouvez les ignorer - Jeff n'a pas fait tout très propre )

    Ce code contient deux #define , un qui s'appelle YPR_ANGLES et l'autre EULER_ANGLES que vous commentez ou dé-commentez pour afficher soir les angles d'Euler, soit les angles de roulis, tangage, lacet.
    Tel que configuré, j'affiche les angles d'Euler en nombre entier.

    En bougeant votre MPU6050 sur ses 3 axes (autour des Z, X et Y, un par un pour que ce soit compréhensible) vous devriez voir les valeurs changer dans le moniteur série. Ce qui vous intéressera pour votre projet c'est la deuxième ou troisième valeur.

    Au bas de la loop() il y a un test pour voir si l'angle a suffisamment changé par rapport à la lecture précédente avant d'effectuer un affichage. C'est important de ne pas trop solliciter le port série car les interruptions sur Serial viennent en compétition avec celle de l'IMU, ça génère apparemment des instabilités et et on peut avoir des blocages dans la librairie Wire.

    Tel que c'est écrit, je ne mémorise les nouveaux angles dans les variables (lastXXX) que si l'affichage a été effectué parce que je veux voir un changement en absolu pour afficher.

    En pratique pour vous, il ne faut pas afficher les angles mais traiter l'évolution directement pour le pilotage du moteur par PID:
    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
    void loop()
    {
      if (mpuInterrupt || fifoCount >= packetSize) { // on a des données
        mpuInterrupt = false;
        mpuIntStatus = mpu.getIntStatus();
        fifoCount = mpu.getFIFOCount();
        if ((mpuIntStatus & 0x10) || fifoCount == 1024) {     // test si overflow (ne devrait pas arriver si on dépile vite la FIFO)
          mpu.resetFIFO();       // reset
        } else if (mpuIntStatus & 0x02) {       // verifie si on a le "DMP data ready interrupt" (this should happen frequently)
          while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount(); // on s'assure que le buffer est suffisant, ça devrait être le cas
          mpu.getFIFOBytes(fifoBuffer, packetSize); // read a packet from FIFO fifoBuffer
          fifoCount -= packetSize;
    
          mpu.dmpGetQuaternion(&q, fifoBuffer);
          uint32_t currentChrono = micros();
    
    
          // Obtain Euler angles from buffer
          mpu.dmpGetEuler(euler, &q);
          float currentPsi = -euler[0] * RADIANS_TO_DEGREES;
          float currentTheta = euler[1] * RADIANS_TO_DEGREES;
          float currentPhi = -euler[2] * RADIANS_TO_DEGREES;
    
    
         // ici on a dans lastTheta et lastChrono les anciennes valeurs
         // et dans currentTheta et currentChrono les valeurs du moment (temps en micro-secondes)
         // c'est ce que vous pouvez utiliser dans votre PID (si vous tournez autour de Theta, sinon prenez Phi)
    
    
    
          lastPsi = currentPsi;
          lastTheta = currentTheta;
          lastPhi = currentPhi;
          lastChrono = currentChrono;
        }
      }
    }
    (attention au "Gimble Lock" avec les angles d'Euler si vous voulez travailler en 3D. quand vous approcherez 90° sur certains axes vous verrez des valeurs incohérentes sur un autre axe. ce n'est pas un souci pour vous car vous vous intéressez à qu'un seul axe)

    ça aide ?

  16. #16
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    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
    Merci pour cette réponse je vais jeter un coup d'oeil a tout cela jeudi. mais j'ai une question que j'avais deja poser mais personne ne m'a répondu:


    "J'ai essayé de faire quelque essai et j'ai graisser mes axes de poulies et mon moteur pour leur donner une seconde vie et on voit vraiment la différence .Néanmoins au bout de 10 /15 seconde mon lmd182000t surchauffe et deviens intouchable malgré un dissipateur thermique ferreux, je cesse donc de faire tourner mon programme.Il est pourtant dit dans le datasheetqu'il supporte des piques de 6A de courant et 3A en continu . Je ne sais pas si il faut envisager le remplacer ,et par quoi dans ce cas?? Ou bien envisager un water cooling ?? J'ai fais des mesure en faisant tourner le moteur a vide car les valeurs non pas le temps de s'afficher si je rajoute les contraintes du système et je consomme 11,56V et 2,0 mA sur le calibre 600mA lorsque le moteur tourne dans le sens trigonométrique et 11,71V et 3,8mA sur le calibre 600mA lorsque le moteur tourne dans le sens des aiguilles d'une montre.A quoi cela peut il etre du et comment équilibrer ces valeurs."

    J'ai demander a mon professeur de si aujourd'hui et il m'a dis que cela pouvait venir du faite que la fréquence de mon pwm est peut être trop élevé . Pour savoir quelle fréquence minimum je dois mettre afin d'éviter la surchauffe de mon contrôleur ; dois je utiliser le fait que (f=1/T et T =2pi/wo) ou wo qui est ma pulsation propre sera aussi la vitesse minimum que je souhaite?Et pour finir j'ai trouver ceci qui parlais d'ajuster le pwm:https://arduino103.blogspot.com/2013...n-arduino.html

  17. #17
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Avant toute chose il faut se dire que c'est normal que ça chauffe. Le LMD182000T est prévu pour pouvoir fonctionner sans problème. à 125°C, émet une alarme à 145°C et s'éteint tout seul à 170°C (La température maxi de jonction pour le silicium est d'environ 175°C. Au delà, le semi-conducteur dopé retrouve quasiment un comportement de semi-conducteur intrinsèque, car l'élévation de température augmente beaucoup le nombre de porteurs minoritaires (création de paires électrons-trous par agitation thermique)).

    --> le radiateur est fait pour conserver la température sous ces 145° mais pas forcément pour refroidir drastiquement le composant puisque sous 125° il a un fonctionnement quasi nominal.

    Concernant la chaleur dégagée:

    L'hypothèse de votre professeur est une possibilité. lorsqu'un MOSFET est éteint, il ne dissipe aucune puissance donc ne chauffe pas. Lorsqu'il est complètement passant, il ne dissipe qu'une faible puissance (qui est dépendante de la résistance RDS ON, on en parle ensuite). Cependant, lorsque vous l'activez ou désactivez, ce que vous faites par le PWM, il passe par une région linéaire où il dissipe une puissance beaucoup plus élevée. Donc plus la fréquence du PWM est élevée, plus on va passer souvent dans ces régions linéaires intermédiaires et donc plus on va dissiper du courant, ce qui se traduit par de la génération de chaleur. En diminuant donc la fréquence PWM, on diminue le nombre de fois où on passe dans ces régions intermédiaires et donc le dégagement de chaleur.

    Il ne faut pas confondre fréquence PWM (Pulse Width Modulation) et le rapport cyclique. La fréquence PWM définit le nombre de cycles par secondes et le rapport cyclique définit quelle pourcentage du cycle est passé en position HIGH versus LOW (cf la doc de PWM)

    Nom : pwm.gif
Affichages : 1059
Taille : 12,2 Ko
    pour une fréquence donnée, on peut avoir un rapport cyclique de 0% (le signal est toujours LOW), ou de 100% (le signal est toujours HIGH) et toutes les valeurs intermédiaires. Sur votre arduino la fonction analogWrite() sur une pin PWM va régler ce rapport cyclique avec une valeur entre 0 (pour 0%) et 255 (pour 100%) mais la fréquence n'est pas modifiable simplement par analogWrite(). il faut aller jouer avec les timers (cf l'article "Secrets of Arduino PWM")

    Dans votre code, quand vous voulez piloter la vitesse vous faites un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      analogWrite(moteurVitessePin,moteurVitesse);
    et donc vous ne définissez que ce rapport cyclique et vous êtes dépendant de la fréquence associée à la pin utilisée. Sur un UNO les pins capables de faire du PWM sont : 3, 5, 6, 9, 10, 11. Elles sont à 490 Hz sauf les pins 5 et 6 qui sont à 980 Hz. Comme la pin que vous utilisez pour moteurVitessePin est la 11, vous êtes déjà sur une pin à "basse fréquence".

    Le composant que vous utilisez (avec une capacité externe) peut monter à des fréquence de 500KHz, donc je ne pense pas qu'à 490Hz on soit mal.

    L'autre point à prendre en compte est cette fameuse résistance RDS ON qui signifie "Résistance (Drain-à-Source)", le Drain étant l'endroit où le courant va et la Source d'où il vient.

    Le "ON" dit simplement que le c'est une résistance quand le MOSFET est passant (à l'état 'on'). Quand il est éteint, le MOSFET ne conduira pas, vous ne vous souciez donc pas de la résistance.

    En raison de la construction du MOSFET, il y a toujours une résistance entre la source et le drain, même lorsqu'il est complètement activé (saturé)

    Nom : RDS.png
Affichages : 1100
Taille : 49,5 Ko

    Cette résistance provoque un gaspillage d'une partie du courant traversant l'appareil et produit ainsi de la chaleur. en simplifiant un peu, selon la loi d'Ohms, U = RI et P = UI --> P = RI2 on voit que la puissance dissipée est directement proportionnelle à la résistance et augmente avec le carré de l'intensité circulant --> si vous tirez bcp ça va chauffer plus.

    Pour résumer, plus le RDS est faible et moins de puissance va être perdue à travers le MOSFET mais il y en aura toujours.

    En plus, si vous regardez dans la spécification on voit un petit graphique qui montre que cette résistance RDS dépend de la température
    Nom : RDS_T.png
Affichages : 1097
Taille : 43,6 Ko
    Donc plus vous chauffez plus la résistance augmente et plus on va chauffer... C'est un cercle vicieux d'où l'importance de réguler la température.

    et enfin un dernier point à prendre en compte et que tout ce qui est dit au dessus est vrai si votre MOSFET est complètement passant (saturé).

    La doc ci dessus mentionne aussi que cette résistance RDS dépend de la tension d'alimentation.

    Nom : RDS_V.png
Affichages : 1102
Taille : 58,3 Ko

    On voit qu'il vaut mieux être entre 20 et 25 volts pour un RDS faible et que si on est près de 10V on est dans une courbe à forte pente, descendante, donc plus on sera prêt de 10V, plus on peut s'attendre à une 'explosion" de la valeur de la résistance. (et en dessous de 10V environ le le LM18200 ne marche pas, il se coupe).

    --> Quelle source de tension avez vous pour votre moteur ? de mémoire vous mettiez des batteries mais vous n'aviez pas répondu clairement à ma question. si vous avez un pack de LiPo 3S (3 en série) donc à 11.1V (3 x 3.7V de charge nominale) mais en réalité quand vous avez votre LiPo complètement chargée elle sera à 3x4.2v = 12,6V mais quand vous l'utilisez la tension baisse et on considère qu'il ne faut pas les emmener sous 3V... mais à 3V x 3 cellules = 9V --> vous êtes tombé sous le seuil de fonctionnement de votre LMD182000T et être temps vous êtes passé par des tensions proche de 10V où le RDS augmente fortement donc la T°....

    bref vous avez 3 éléments sur lesquels vous pouvez jouer

    - la fréquence:
    il faudra dans ce cas ne plus utiliser un analogWrite() et passer par des bibliothèques de gestion PWM et faire attention aux timers utilisés pour s'assurer que vous n'en dépendez pas pour d'autres usages dans votre application.

    Sur un UNO vous avez un ATMEGA 328 qui 3 timers, chaque timer à 2 registres pour le comparateur donc peut gérer le PWM de 2 pins
    - les pins 5 et 6 sont contrôlées par la timer 0
    - les pins 9 et 10 sont contrôlées par le timer 1
    - les pins 11 et 3 sont contrôlées par le timer 2

    le timer0 est réservé à millis(), micros() etc donc ne pas prendre les pins 5 et 6.
    le timer2 est utilisé par la fonction tone() et donc si vous faites des sons vous ne pouvez pas prendre les pins 11 ou 3
    le timer1 est utilisé par la bibliothèque Servo (si vous avez besoin d'en rajouter un)

    --> donc attention à vos besoins. (une MEGA aura plus de timers).

    - la tension d'alimentation

    Si vous alimentez avec une meilleure tension, genre 24V, vous serez sans doute dans une zone plus sympa pour le composant, vous serez sûr qu'il est complètement passant et que la résistance n'est pas élevée.

    - le refroidissement
    bien sûr, il reste l'option du petit ventilateur en plus ou un plus gros radiateur (le refroidissement liquide est pour les cas plus extrêmes)


    --> perso je commencerais par faire des test sur l'impact de la tension.

  18. #18
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    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
    Merci , pour cette réponse si bien expliqué mais je crois avoir trouvé une autre solution j'ai tout simplement réduit la vitesse de mon moteur et le contrôleur chauffe beaucoup moins . Donc avoir sur la longue durée. E J'ai essayé votre premier programme et un message d'erreur s'affiche mais je ne comprend pas l'erreur.

    voici le message affiché:
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    In file included from /Users/seb/Documents/Arduino/dernier_test/dernier_test.ino:4:0:
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050_6Axis_MotionApps20.h: In member function 'uint8_t MPU6050::dmpGetGravity(int16_t*, const uint8_t*)':
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050_6Axis_MotionApps20.h:689:65: warning: integer overflow in expression [-Woverflow]
             - (int32_t)qI[2] * qI[2] + (int32_t)qI[3] * qI[3]) / (2 * 16384);
                                                                   ~~^~~~~~~
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: warning: type 'struct MPU6050' violates the C++ One Definition Rule [-Wodr]
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: a different type is defined in another translation unit
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:1026:18: note: the first difference of corresponding definitions is field 'dmpPacketBuffer'
             uint8_t *dmpPacketBuffer;
                      ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: a type with different number of fields is defined in another translation unit
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:440:14: warning: 'initialize' violates the C++ One Definition Rule  [-Wodr]
             void initialize();
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:55:6: note: implicit this pointer type mismatch
     void MPU6050::initialize() {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:55:6: note: 'initialize' was previously declared here
     void MPU6050::initialize() {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:55:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:441:14: warning: 'testConnection' violates the C++ One Definition Rule  [-Wodr]
             bool testConnection();
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:66:6: note: implicit this pointer type mismatch
     bool MPU6050::testConnection() {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:66:6: note: 'testConnection' was previously declared here
     bool MPU6050::testConnection() {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:66:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:686:14: warning: 'reset' violates the C++ One Definition Rule  [-Wodr]
             void reset();
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2417:6: note: implicit this pointer type mismatch
     void MPU6050::reset() {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2417:6: note: 'reset' was previously declared here
     void MPU6050::reset() {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2417:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:688:14: warning: 'setSleepEnabled' violates the C++ One Definition Rule  [-Wodr]
             void setSleepEnabled(bool enabled);
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2441:6: note: implicit this pointer type mismatch
     void MPU6050::setSleepEnabled(bool enabled) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2441:6: note: 'setSleepEnabled' was previously declared here
     void MPU6050::setSleepEnabled(bool enabled) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2441:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:803:14: warning: 'setMemoryStartAddress' violates the C++ One Definition Rule  [-Wodr]
             void setMemoryStartAddress(uint8_t address);
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2984:6: note: implicit this pointer type mismatch
     void MPU6050::setMemoryStartAddress(uint8_t address) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2984:6: note: 'setMemoryStartAddress' was previously declared here
     void MPU6050::setMemoryStartAddress(uint8_t address) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2984:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:800:14: warning: 'setMemoryBank' violates the C++ One Definition Rule  [-Wodr]
             void setMemoryBank(uint8_t bank, bool prefetchEnabled=false, bool userBank=false);
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2975:6: note: implicit this pointer type mismatch
     void MPU6050::setMemoryBank(uint8_t bank, bool prefetchEnabled, bool userBank) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2975:6: note: 'setMemoryBank' was previously declared here
     void MPU6050::setMemoryBank(uint8_t bank, bool prefetchEnabled, bool userBank) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2975:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:729:16: warning: 'getXGyroOffsetTC' violates the C++ One Definition Rule  [-Wodr]
             int8_t getXGyroOffsetTC();
                    ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2787:8: note: implicit this pointer type mismatch
     int8_t MPU6050::getXGyroOffsetTC() {
            ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2787:8: note: 'getXGyroOffsetTC' was previously declared here
     int8_t MPU6050::getXGyroOffsetTC() {
            ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2787:8: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:733:16: warning: 'getYGyroOffsetTC' violates the C++ One Definition Rule  [-Wodr]
             int8_t getYGyroOffsetTC();
                    ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2797:8: note: implicit this pointer type mismatch
     int8_t MPU6050::getYGyroOffsetTC() {
            ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2797:8: note: 'getYGyroOffsetTC' was previously declared here
     int8_t MPU6050::getYGyroOffsetTC() {
            ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2797:8: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:737:16: warning: 'getZGyroOffsetTC' violates the C++ One Definition Rule  [-Wodr]
             int8_t getZGyroOffsetTC();
                    ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2807:8: note: implicit this pointer type mismatch
     int8_t MPU6050::getZGyroOffsetTC() {
            ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2807:8: note: 'getZGyroOffsetTC' was previously declared here
     int8_t MPU6050::getZGyroOffsetTC() {
            ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2807:8: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:679:14: warning: 'setI2CMasterModeEnabled' violates the C++ One Definition Rule  [-Wodr]
             void setI2CMasterModeEnabled(bool enabled);
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2366:6: note: implicit this pointer type mismatch
     void MPU6050::setI2CMasterModeEnabled(bool enabled) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2366:6: note: 'setI2CMasterModeEnabled' was previously declared here
     void MPU6050::setI2CMasterModeEnabled(bool enabled) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2366:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:538:14: warning: 'setSlaveAddress' violates the C++ One Definition Rule  [-Wodr]
             void setSlaveAddress(uint8_t num, uint8_t address);
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:962:6: note: implicit this pointer type mismatch
     void MPU6050::setSlaveAddress(uint8_t num, uint8_t address) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:962:6: note: 'setSlaveAddress' was previously declared here
     void MPU6050::setSlaveAddress(uint8_t num, uint8_t address) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:962:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:682:14: warning: 'resetI2CMaster' violates the C++ One Definition Rule  [-Wodr]
             void resetI2CMaster();
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2391:6: note: implicit this pointer type mismatch
     void MPU6050::resetI2CMaster() {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2391:6: note: 'resetI2CMaster' was previously declared here
     void MPU6050::resetI2CMaster() {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2391:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:810:14: warning: 'writeProgMemoryBlock' violates the C++ One Definition Rule  [-Wodr]
             bool writeProgMemoryBlock(const uint8_t *data, uint16_t dataSize, uint8_t bank=0, uint8_t address=0, bool verify=true);
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:3104:6: note: implicit this pointer type mismatch
     bool MPU6050::writeProgMemoryBlock(const uint8_t *data, uint16_t dataSize, uint8_t bank, uint8_t address, bool verify) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:3104:6: note: 'writeProgMemoryBlock' was previously declared here
     bool MPU6050::writeProgMemoryBlock(const uint8_t *data, uint16_t dataSize, uint8_t bank, uint8_t address, bool verify) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:3104:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:813:14: warning: 'writeProgDMPConfigurationSet' violates the C++ One Definition Rule  [-Wodr]
             bool writeProgDMPConfigurationSet(const uint8_t *data, uint16_t dataSize);
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:3183:6: note: implicit this pointer type mismatch
     bool MPU6050::writeProgDMPConfigurationSet(const uint8_t *data, uint16_t dataSize) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:3183:6: note: 'writeProgDMPConfigurationSet' was previously declared here
     bool MPU6050::writeProgDMPConfigurationSet(const uint8_t *data, uint16_t dataSize) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:3183:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:694:14: warning: 'setClockSource' violates the C++ One Definition Rule  [-Wodr]
             void setClockSource(uint8_t source);
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2534:6: note: implicit this pointer type mismatch
     void MPU6050::setClockSource(uint8_t source) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2534:6: note: 'setClockSource' was previously declared here
     void MPU6050::setClockSource(uint8_t source) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2534:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:598:14: warning: 'setIntEnabled' violates the C++ One Definition Rule  [-Wodr]
             void setIntEnabled(uint8_t enabled);
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:1549:6: note: implicit this pointer type mismatch
     void MPU6050::setIntEnabled(uint8_t enabled) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:1549:6: note: 'setIntEnabled' was previously declared here
     void MPU6050::setIntEnabled(uint8_t enabled) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:1549:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:449:14: warning: 'setRate' violates the C++ One Definition Rule  [-Wodr]
             void setRate(uint8_t rate);
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:124:6: note: implicit this pointer type mismatch
     void MPU6050::setRate(uint8_t rate) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:124:6: note: 'setRate' was previously declared here
     void MPU6050::setRate(uint8_t rate) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:124:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:453:14: warning: 'setExternalFrameSync' violates the C++ One Definition Rule  [-Wodr]
             void setExternalFrameSync(uint8_t sync);
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:166:6: note: implicit this pointer type mismatch
     void MPU6050::setExternalFrameSync(uint8_t sync) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:166:6: note: 'setExternalFrameSync' was previously declared here
     void MPU6050::setExternalFrameSync(uint8_t sync) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:166:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:455:14: warning: 'setDLPFMode' violates the C++ One Definition Rule  [-Wodr]
             void setDLPFMode(uint8_t bandwidth);
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:209:6: note: implicit this pointer type mismatch
     void MPU6050::setDLPFMode(uint8_t mode) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:209:6: note: 'setDLPFMode' was previously declared here
     void MPU6050::setDLPFMode(uint8_t mode) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:209:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:459:14: warning: 'setFullScaleGyroRange' violates the C++ One Definition Rule  [-Wodr]
             void setFullScaleGyroRange(uint8_t range);
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:244:6: note: implicit this pointer type mismatch
     void MPU6050::setFullScaleGyroRange(uint8_t range) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:244:6: note: 'setFullScaleGyroRange' was previously declared here
     void MPU6050::setFullScaleGyroRange(uint8_t range) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:244:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:817:14: warning: 'setDMPConfig1' violates the C++ One Definition Rule  [-Wodr]
             void setDMPConfig1(uint8_t config);
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:3193:6: note: implicit this pointer type mismatch
     void MPU6050::setDMPConfig1(uint8_t config) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:3193:6: note: 'setDMPConfig1' was previously declared here
     void MPU6050::setDMPConfig1(uint8_t config) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:3193:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:821:14: warning: 'setDMPConfig2' violates the C++ One Definition Rule  [-Wodr]
             void setDMPConfig2(uint8_t config);
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:3203:6: note: implicit this pointer type mismatch
     void MPU6050::setDMPConfig2(uint8_t config) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:3203:6: note: 'setDMPConfig2' was previously declared here
     void MPU6050::setDMPConfig2(uint8_t config) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:3203:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:728:14: warning: 'setOTPBankValid' violates the C++ One Definition Rule  [-Wodr]
             void setOTPBankValid(bool enabled);
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2784:6: note: implicit this pointer type mismatch
     void MPU6050::setOTPBankValid(bool enabled) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2784:6: note: 'setOTPBankValid' was previously declared here
     void MPU6050::setOTPBankValid(bool enabled) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2784:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:730:14: warning: 'setXGyroOffsetTC' violates the C++ One Definition Rule  [-Wodr]
             void setXGyroOffsetTC(int8_t offset);
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2791:6: note: implicit this pointer type mismatch
     void MPU6050::setXGyroOffsetTC(int8_t offset) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2791:6: note: 'setXGyroOffsetTC' was previously declared here
     void MPU6050::setXGyroOffsetTC(int8_t offset) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2791:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:734:14: warning: 'setYGyroOffsetTC' violates the C++ One Definition Rule  [-Wodr]
             void setYGyroOffsetTC(int8_t offset);
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2801:6: note: implicit this pointer type mismatch
     void MPU6050::setYGyroOffsetTC(int8_t offset) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2801:6: note: 'setYGyroOffsetTC' was previously declared here
     void MPU6050::setYGyroOffsetTC(int8_t offset) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2801:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:738:14: warning: 'setZGyroOffsetTC' violates the C++ One Definition Rule  [-Wodr]
             void setZGyroOffsetTC(int8_t offset);
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2811:6: note: implicit this pointer type mismatch
     void MPU6050::setZGyroOffsetTC(int8_t offset) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2811:6: note: 'setZGyroOffsetTC' was previously declared here
     void MPU6050::setZGyroOffsetTC(int8_t offset) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2811:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:492:14: warning: 'setMotionDetectionThreshold' violates the C++ One Definition Rule  [-Wodr]
             void setMotionDetectionThreshold(uint8_t threshold);
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:522:6: note: implicit this pointer type mismatch
     void MPU6050::setMotionDetectionThreshold(uint8_t threshold) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:522:6: note: 'setMotionDetectionThreshold' was previously declared here
     void MPU6050::setMotionDetectionThreshold(uint8_t threshold) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:522:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:500:14: warning: 'setZeroMotionDetectionThreshold' violates the C++ One Definition Rule  [-Wodr]
             void setZeroMotionDetectionThreshold(uint8_t threshold);
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:592:6: note: implicit this pointer type mismatch
     void MPU6050::setZeroMotionDetectionThreshold(uint8_t threshold) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:592:6: note: 'setZeroMotionDetectionThreshold' was previously declared here
     void MPU6050::setZeroMotionDetectionThreshold(uint8_t threshold) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:592:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:496:14: warning: 'setMotionDetectionDuration' violates the C++ One Definition Rule  [-Wodr]
             void setMotionDetectionDuration(uint8_t duration);
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:552:6: note: implicit this pointer type mismatch
     void MPU6050::setMotionDetectionDuration(uint8_t duration) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:552:6: note: 'setMotionDetectionDuration' was previously declared here
     void MPU6050::setMotionDetectionDuration(uint8_t duration) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:552:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:504:14: warning: 'setZeroMotionDetectionDuration' violates the C++ One Definition Rule  [-Wodr]
             void setZeroMotionDetectionDuration(uint8_t duration);
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:623:6: note: implicit this pointer type mismatch
     void MPU6050::setZeroMotionDetectionDuration(uint8_t duration) {
          ^
    Le croquis utilise 14150 octets (43%) de l'espace de stockage de programmes. Le maximum est de 32256 octets.
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    Les variables globales utilisent 567 octets (27%) de mémoire dynamique, ce qui laisse 1481 octets pour les variables locales. Le maximum est de 2048 octets.
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:623:6: note: 'setZeroMotionDetectionDuration' was previously declared here
     void MPU6050::setZeroMotionDetectionDuration(uint8_t duration) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:623:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:677:14: warning: 'setFIFOEnabled' violates the C++ One Definition Rule  [-Wodr]
             void setFIFOEnabled(bool enabled);
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2342:6: note: implicit this pointer type mismatch
     void MPU6050::setFIFOEnabled(bool enabled) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2342:6: note: 'setFIFOEnabled' was previously declared here
     void MPU6050::setFIFOEnabled(bool enabled) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2342:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:797:14: warning: 'resetDMP' violates the C++ One Definition Rule  [-Wodr]
             void resetDMP();
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2969:6: note: implicit this pointer type mismatch
     void MPU6050::resetDMP() {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2969:6: note: 'resetDMP' was previously declared here
     void MPU6050::resetDMP() {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2969:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:808:14: warning: 'readMemoryBlock' violates the C++ One Definition Rule  [-Wodr]
             void readMemoryBlock(uint8_t *data, uint16_t dataSize, uint8_t bank=0, uint8_t address=0);
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2997:6: note: implicit this pointer type mismatch
     void MPU6050::readMemoryBlock(uint8_t *data, uint16_t dataSize, uint8_t bank, uint8_t address) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2997:6: note: 'readMemoryBlock' was previously declared here
     void MPU6050::readMemoryBlock(uint8_t *data, uint16_t dataSize, uint8_t bank, uint8_t address) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2997:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:713:18: warning: 'getFIFOCount' violates the C++ One Definition Rule  [-Wodr]
             uint16_t getFIFOCount();
                      ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2699:10: note: implicit this pointer type mismatch
     uint16_t MPU6050::getFIFOCount() {
              ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2699:10: note: 'getFIFOCount' was previously declared here
     uint16_t MPU6050::getFIFOCount() {
              ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2699:10: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:718:14: warning: 'getFIFOBytes' violates the C++ One Definition Rule  [-Wodr]
             void getFIFOBytes(uint8_t *data, uint8_t length);
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2735:6: note: implicit this pointer type mismatch
     void MPU6050::getFIFOBytes(uint8_t *data, uint8_t length) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2735:6: note: 'getFIFOBytes' was previously declared here
     void MPU6050::getFIFOBytes(uint8_t *data, uint8_t length) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2735:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:809:14: warning: 'writeMemoryBlock' violates the C++ One Definition Rule  [-Wodr]
             bool writeMemoryBlock(const uint8_t *data, uint16_t dataSize, uint8_t bank=0, uint8_t address=0, bool verify=true, bool useProgMem=false);
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:3028:6: note: implicit this pointer type mismatch
     bool MPU6050::writeMemoryBlock(const uint8_t *data, uint16_t dataSize, uint8_t bank, uint8_t address, bool verify, bool useProgMem) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:3028:6: note: 'writeMemoryBlock' was previously declared here
     bool MPU6050::writeMemoryBlock(const uint8_t *data, uint16_t dataSize, uint8_t bank, uint8_t address, bool verify, bool useProgMem) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:3028:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:681:14: warning: 'resetFIFO' violates the C++ One Definition Rule  [-Wodr]
             void resetFIFO();
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2382:6: note: implicit this pointer type mismatch
     void MPU6050::resetFIFO() {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2382:6: note: 'resetFIFO' was previously declared here
     void MPU6050::resetFIFO() {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2382:6: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:438:9: warning: '__comp_ctor ' violates the C++ One Definition Rule  [-Wodr]
             MPU6050(uint8_t address=MPU6050_DEFAULT_ADDRESS);
             ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:45:1: note: implicit this pointer type mismatch
     MPU6050::MPU6050(uint8_t address):devAddr(address) {
     ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:45:1: note: '__comp_ctor ' was previously declared here
     MPU6050::MPU6050(uint8_t address):devAddr(address) {
     ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:45:1: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:613:17: warning: 'getIntStatus' violates the C++ One Definition Rule  [-Wodr]
             uint8_t getIntStatus();
                     ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:1678:9: note: implicit this pointer type mismatch
     uint8_t MPU6050::getIntStatus() {
             ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:1678:9: note: 'getIntStatus' was previously declared here
     uint8_t MPU6050::getIntStatus() {
             ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:1678:9: note: code may be misoptimized unless -fno-strict-aliasing is used
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:796:14: warning: 'setDMPEnabled' violates the C++ One Definition Rule  [-Wodr]
             void setDMPEnabled(bool enabled);
                  ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2966:6: note: implicit this pointer type mismatch
     void MPU6050::setDMPEnabled(bool enabled) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.h:436:7: note: type 'struct MPU6050' itself violates the C++ One Definition Rule
     class MPU6050 {
           ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2966:6: note: 'setDMPEnabled' was previously declared here
     void MPU6050::setDMPEnabled(bool enabled) {
          ^
    /Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050.cpp:2966:6: note: code may be misoptimized unless -fno-strict-aliasing is used

  19. #19
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Ce sont les warnings dont je vous parlais

    Celui que vous pouvez corriger est celui ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Users/seb/Documents/Arduino/libraries/MPU6050/MPU6050_6Axis_MotionApps20.h:689:65: warning: integer overflow in expression [-Woverflow]
             - (int32_t)qI[2] * qI[2] + (int32_t)qI[3] * qI[3]) / (2 * 16384);
    Éditez le ficher et changez (2 * 16384) en (2 * 16384L)

    Si je me souviens bien ça y est deux fois

  20. #20
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    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
    Citation Envoyé par Jay M Voir le message
    Salut


    essayez déjà ce bout de code avec la console ouverte à 115200 bauds:
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    // remerciement à Jeff Rowberg pour sa bibliothèque i2cdevlib
    #include "Wire.h"
    #include "I2Cdev.h" //copier https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/I2Cdev  dans le répertoire des librairies
    #include "MPU6050_6Axis_MotionApps20.h" //copier https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050 dans le répertoire des librairies
     
    MPU6050 mpu;
     
    #define EULER_ANGLES // à commenter pour ne pas afficher les angles d'Euler
    //#define YPR_ANGLES // à commenter pour ne pas afficher les angles de roulis, tangage, lacet
     
     
    const float RADIANS_TO_DEGREES = 180.0 / M_PI;
     
    // MPU control/status vars
    uint8_t mpuIntStatus;   // holds actual interrupt status byte from MPU
    uint16_t packetSize;    // expected DMP packet size (default is 42 bytes)
    uint16_t fifoCount;     // count of all bytes currently in FIFO
    uint8_t fifoBuffer[64]; // FIFO storage buffer, doit être plus grand que packetSize
     
    // variables d'orientation/mouvement
    Quaternion q;
    VectorFloat gravity;
    float ypr[3];
    float euler[3];
     
    uint32_t lastChrono;
     
    #ifdef EULER_ANGLES
    float lastPsi ;
    float lastTheta ;
    float lastPhi;
    #endif
     
     
     
    #ifdef YPR_ANGLES
    float lastYaw;
    float lastPitch;
    float lastRoll;
    #endif
     
     
    volatile bool mpuInterrupt = false;     // indicates whether MPU interrupt pin has gone high
    void dmpDataReady() {
      mpuInterrupt = true;
    }
     
     
    void setup() {
      uint8_t dmpStatus;
     
      Wire.begin();
      Serial.begin(115200);
     
      mpu.initialize();
      if (!mpu.testConnection()) {
        Serial.println(F("pas de MPU"));
        while (true);
      }
     
      if (dmpStatus = mpu.dmpInitialize()) {
        Serial.print(F("Erreur DMP #"));
        Serial.println(dmpStatus);
        while (true);
      }
     
      mpu.setDMPEnabled(true);
      attachInterrupt(0, dmpDataReady, RISING);
      mpuIntStatus = mpu.getIntStatus();
      packetSize = mpu.dmpGetFIFOPacketSize(); // 42
    }
     
    void loop()
    {
      if (mpuInterrupt || fifoCount >= packetSize) { // on a des données
        mpuInterrupt = false;
        mpuIntStatus = mpu.getIntStatus();
        fifoCount = mpu.getFIFOCount();
        if ((mpuIntStatus & 0x10) || fifoCount == 1024) {     // test si overflow (ne devrait pas arriver si on dépile vite la FIFO)
          mpu.resetFIFO();       // reset
        } else if (mpuIntStatus & 0x02) {       // verifie si on a le "DMP data ready interrupt" (this should happen frequently)
          while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount(); // on s'assure que le buffer est suffisant, ça devrait être le cas
          mpu.getFIFOBytes(fifoBuffer, packetSize); // read a packet from FIFO fifoBuffer
          fifoCount -= packetSize;
     
          mpu.dmpGetQuaternion(&q, fifoBuffer);
          uint32_t currentChrono = micros();
     
    #ifdef EULER_ANGLES
          // Obtain Euler angles from buffer
          mpu.dmpGetEuler(euler, &q);
     
          float currentPsi = -euler[0] * RADIANS_TO_DEGREES;
          float currentTheta = euler[1] * RADIANS_TO_DEGREES;
          float currentPhi = -euler[2] * RADIANS_TO_DEGREES;
     
          if ((abs(currentPsi - lastPsi) > 1) || (abs(currentTheta - lastTheta) > 1) || (abs(currentPhi - lastPhi) > 1)) {
            Serial.print(F("Euler\t"));
            Serial.print(currentPsi, 0);
            Serial.write("\t");
            Serial.print(currentTheta, 0);
            Serial.write("\t");
            Serial.println(currentPhi, 0);
            lastPsi = currentPsi;
            lastTheta = currentTheta;
            lastPhi = currentPhi;
          }
    #endif
     
    #ifdef YPR_ANGLES
          // Obtain YPR angles from buffer
          mpu.dmpGetGravity(&gravity, &q);
          mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
     
          float currentYaw = ypr[0] * RADIANS_TO_DEGREES;       // yaw: (about Z axis)
          float currentPitch = -ypr[1] * RADIANS_TO_DEGREES;    // pitch: (nose up/down, about Y axis)
          float currentRoll = ypr[2] * RADIANS_TO_DEGREES;      // roll: (tilt left/right, about X axis)
     
          if ((abs(currentYaw - lastYaw) > 1) || (abs(currentPitch - lastPitch) > 1) || (abs(currentRoll - lastRoll) > 1)) {
            Serial.print(F("YPR\t"));
            Serial.print(currentYaw, 0);
            Serial.write("\t");
            Serial.print(currentPitch, 0);
            Serial.write("\t");
            Serial.println(currentRoll, 0);
            lastYaw = currentYaw;
            lastPitch = currentPitch;
            lastRoll = currentRoll;
          }
    #endif
     
     
     
          lastChrono = currentChrono;
        }
      }
    }
    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
    void loop()
    {
      if (mpuInterrupt || fifoCount >= packetSize) { // on a des données
        mpuInterrupt = false;
        mpuIntStatus = mpu.getIntStatus();
        fifoCount = mpu.getFIFOCount();
        if ((mpuIntStatus & 0x10) || fifoCount == 1024) {     // test si overflow (ne devrait pas arriver si on dépile vite la FIFO)
          mpu.resetFIFO();       // reset
        } else if (mpuIntStatus & 0x02) {       // verifie si on a le "DMP data ready interrupt" (this should happen frequently)
          while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount(); // on s'assure que le buffer est suffisant, ça devrait être le cas
          mpu.getFIFOBytes(fifoBuffer, packetSize); // read a packet from FIFO fifoBuffer
          fifoCount -= packetSize;
    
          mpu.dmpGetQuaternion(&q, fifoBuffer);
          uint32_t currentChrono = micros();
    
    
          // Obtain Euler angles from buffer
          mpu.dmpGetEuler(euler, &q);
          float currentPsi = -euler[0] * RADIANS_TO_DEGREES;
          float currentTheta = euler[1] * RADIANS_TO_DEGREES;
          float currentPhi = -euler[2] * RADIANS_TO_DEGREES;
    
    
         // ici on a dans lastTheta et lastChrono les anciennes valeurs
         // et dans currentTheta et currentChrono les valeurs du moment (temps en micro-secondes)
         // c'est ce que vous pouvez utiliser dans votre PID (si vous tournez autour de Theta, sinon prenez Phi)
    
    
    
          lastPsi = currentPsi;
          lastTheta = currentTheta;
          lastPhi = currentPhi;
          lastChrono = currentChrono;
        }
      }
    }
    Bonsoir Jay je me replonge enfin dans la programmation après un petit bout de temps vue l'emploie du temps surchargé que j'avais . J'ai de même fait un modele de mon ancien chariot sur fusion 360 que j'ai fait imprimer sur imprimante 3D et demain je vais m'attaquer a mettre une tige en plein milieu de ma planche afin de la faire osciller ma planche et je fixerai les capteurs de fin de course . Mais je dois vous avouer que j'ai un peu de male a comprendre les deux derniers codes que vous m'avez envoyer et je ne sais pas si le correcteur que j'ai fait et que j'ai envoyer conviens .De la même manière je ne vois pas ou est ce que cette liche apparait dans le code pour pouvoir l'a corrigé: " - (int32_t)qI[2] * qI[2] + (int32_t)qI[3] * qI[3]) / (2 * 16384);".

Discussions similaires

  1. Regulateur PID avec step7
    Par autoin dans le forum Automation
    Réponses: 5
    Dernier message: 12/04/2014, 01h05
  2. Difference rendu XLS avec le Viewer et le moteur
    Par share78 dans le forum BIRT
    Réponses: 3
    Dernier message: 12/06/2012, 17h07
  3. Réponses: 0
    Dernier message: 24/11/2011, 09h47
  4. [MySQL] recherche avec plusieurs mots dans mon moteur
    Par hadjiphp dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 25/05/2009, 08h53
  5. Utiliser les fichiers de syntaxe pour le correcteur orthographique avec vim
    Par karmaki dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 11/08/2006, 06h01

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