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 :

Stabilisation d'un bateau avec Arduino Uno


Sujet :

Arduino

  1. #61
    Membre confirmé
    Homme Profil pro
    savant fou
    Inscrit en
    septembre 2019
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : savant fou

    Informations forums :
    Inscription : septembre 2019
    Messages : 208
    Points : 480
    Points
    480
    Par défaut
    Wow jpbricole - c’est très propre !! Bravo
    On voit que l’imprimante a chauffé en effet

    Le CY-85 avec 9 degrés de liberté c’est sans doute beaucoup pour ce problème mais qui peut le plus peut le moins (Vous aurez les données de l’accéléromètre 3 axes (ADXL345) pour la mesure de la pesanteur, des mouvements d'accélération et un gyroscope 3 axes (TG3205) pour la mesure de la vitesse de rotation angulaire qui pourront être utilisés, et en prime le capteur de champ magnétique 3 axes (HMC5883L) et un capteur de pression atmosphérique BMP085 sans utilité particulière pour ce projet mais si c’est ce que vous avez sous la main, ça convient).

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2019
    Messages : 65
    Points : 13
    Points
    13
    Par défaut
    [QUOTE=jpbbricole;11343792]
    Je me suis "lancé" dans l'exercice et ai fait un petit montage en faisant chauffer, un petit peu, mon imprimante 3D.

    Wouaww super boulot .Moi de mon coté je n'est pas eu le temps d'avancer sur la partie codage pour insérer le pid à mon code mais je vais m'y remmetre jeudi.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2019
    Messages : 65
    Points : 13
    Points
    13
    Par défaut
    Bonjour , savez vous quel ouvrage je pourrais utiliser pour concevoir mon programme avec correcteur pid??

  4. #64
    Membre éclairé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    mai 2013
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : mai 2013
    Messages : 131
    Points : 660
    Points
    660
    Par défaut
    Bonjour seb201,

    Citation Envoyé par seb201 Voir le message
    J'aurais de même besoin d'aide a propos du correcteur , je dois utiliser un correcteur pid (proportionnel intégrateur derivateur) néanmoins je ne sais pas du tout comment cela s'insère dans le code et comment dois je choisir les valeurs des différentes constantes .
    Sauf erreur de ma part, la transformée inverse ne correspond pas à l'équation en p (il y a un problème de puissance en p).

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2019
    Messages : 65
    Points : 13
    Points
    13
    Par défaut
    Je ne compte pas utiliser les équations dans le domaine de Laplace mais bien dans le domaine temporelle , et pour rappel un correcteur pid(=proportionnel, intégrateur,derivateur).

  6. #66
    Membre confirmé
    Homme Profil pro
    savant fou
    Inscrit en
    septembre 2019
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : savant fou

    Informations forums :
    Inscription : septembre 2019
    Messages : 208
    Points : 480
    Points
    480
    Par défaut
    il y aura un humain sur le bateau ou c'est une (grande) maquette?

  7. #67
    Membre éclairé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    mai 2013
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : mai 2013
    Messages : 131
    Points : 660
    Points
    660
    Par défaut Deux vues
    Bonjour seb201,

    Citation Envoyé par seb201 Voir le message
    Je ne compte pas utiliser les équations dans le domaine de Laplace mais bien dans le domaine temporelle ...
    Pourtant, le domaine fréquentiel (ou l'espace de Laplace pour faire plus complexe ) serait très utile pour comprendre les risques d'oscillation.

    Si mes souvenirs sont exacts, il faut que deux états stables soient atteints non seulement bien sûr avec une vitesse nulle mais avec une accélération nulle (sinon il y a accentuation du déséquilibre au démarrage et dépassement de l'équilibre d'arrivée par décélération donc oscillations). Cette double maîtrise accélération et vitesse pour maîtriser un changement de positions correspond bien au domaine d'action d'un PID.

    Bon courage.
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2019
    Messages : 65
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par Jay M Voir le message
    il y aura un humain sur le bateau ou c'est une (grande) maquette?
    Cette maquette ne fait que 50 cm😉 . Une video est disponible plus haut dans la conversation.

  9. #69
    Membre confirmé
    Homme Profil pro
    savant fou
    Inscrit en
    septembre 2019
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : savant fou

    Informations forums :
    Inscription : septembre 2019
    Messages : 208
    Points : 480
    Points
    480
    Par défaut
    Citation Envoyé par seb201 Voir le message
    Cette maquette ne fait que 50 cm😉 . Une video est disponible plus haut dans la conversation.
    Une planche de surf évolutive hybride va faire 48 à 50cm de large aussi... je ne pouvais pas dire au vu de la vidéo si la planche avait pour but d’être installée dans la coque, d’où ma question.

    La masse totale (inertie) de l’embarcation va jouer pour déterminer la masse à déplacer et donc le moteur nécessaire

  10. #70
    Membre éclairé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    mai 2013
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : mai 2013
    Messages : 131
    Points : 660
    Points
    660
    Par défaut Paramètres etc.
    Bonjour Jay M,

    Citation Envoyé par Jay M Voir le message
    La masse totale (inertie) de l’embarcation va jouer pour déterminer la masse à déplacer et donc le moteur nécessaire
    Oui, et la position du centre de gravité de l'embarcation par rapport à la ligne de flottaison (masse mobile incluse en position 0), la position en hauteur relative de la masse mobile par rapport au centre de gravité (pour bien faire elle devrait être en dessous en tant que quille dynamique) et le facteur de forme (un catamaran et un cylindre de même masse ne se comportent pas du tout de la même manière).

    Et j'en oublie certainement .

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2019
    Messages : 65
    Points : 13
    Points
    13
    Par défaut
    Ma maquette n'a pas pour but d'être fixé sur quoi que se soit . J'instalerai seulement une tige rigide en largeur de ma planche au milieu afin de simuler le roulis. Et j'ai une question puis je mettre un transistor en sortie de motor shield afin d'avoir un courant plus important et ainsi que mon moteur est plus de couple?? Oubien je pars directement sur ça ??https://www.sparkfun.com/products/9107

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2019
    Messages : 65
    Points : 13
    Points
    13
    Par défaut
    Nom : WhatsApp Image 2020-02-10 at 20.35.50.jpeg
Affichages : 47
Taille : 154,1 Ko

    Bonjour, j'ai effectué de nouvelles modifications a ma maquette afin de réduire les frottements des courroies et j'ai de même fait un code me permettant de connaître l'état de mes capteurs de fin de course :Nom : Capture d’écran 2020-02-14 à 13.59.55.png
Affichages : 46
Taille : 62,2 Ko

    Néanmoins quand je l'ajoute à mon code principal ,celui-ci cesse de fonctionné des lors que j'ajoute INPUT_PULLUP dans mon void setup et je ne comprend pas pourquoi.
    Mon code global en ajoutant celui des capteurs de fin de course est celui-ci:
    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
    ##include "Wire.h"  // Arduino Wire library
    #include "I2Cdev.h"  //Installer ces 2 librairies
    #include "MPU6050.h"
    #include "math.h"
    #include <AFMotor.h>
    AF_DCMotor motor(2);
    // AD0 low = 0x68 (default for InvenSense evaluation board)
    // AD0 high = 0x69
    MPU6050 accelgyro;
    int inputPin =2;
    int inputPin1 =7;
    int16_t ax, ay, az;  //mesures brutes
    int16_t gx, gy, gz;
    uint8_t Accel_range;
    uint8_t Gyro_range;
    float angle=0;
     
     
     
    void setup() {
     
      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
      Serial.println("Motor test!");
     
      // turn on motor
      motor.setSpeed(200);   //definie la vitesse du moterur 
     
      motor.run(RELEASE);
     
      pinMode(inputPin,INPUT_PULLUP);
      pinMode(inputPin1,INPUT_PULLUP);
      Serial.begin(9600);
     
    }
     
    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 (int (alpha < -10)){
       motor.run(FORWARD); //fait avancer le chariot vers la droite
    }
    else if (int (alpha > 10)){
      motor.run(BACKWARD); //fait avancer le chariot vers la gauche
    }
    else
     motor.run(RELEASE);
     }

  13. #73
    Membre éprouvé
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    février 2013
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : février 2013
    Messages : 422
    Points : 1 064
    Points
    1 064
    Par défaut
    Bonjour Sebastien
    Citation Envoyé par seb201 Voir le message
    Néanmoins quand je l'ajoute à mon code principal ,celui-ci cesse de fonctionné des lors que j'ajoute INPUT_PULLUP dans mon void setup et je ne comprend pas pourquoi.
    D'après le mode d'emploi de la carte, page 16, seules les pin digitales 2 et 13 et les pin analogiques de A0 à A5 (15 à 19) sont libres.
    Tu peux très bien utiliser les pin analogiques en logique.

    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2019
    Messages : 65
    Points : 13
    Points
    13
    Par défaut
    [QUOTE=jpbbricole;11376357]Bonjour Sebastien
    Tu peux très bien utiliser les pin analogiques en logique.

    Donc au lieu d'utiliser la 2 et la 7 plutôt utiliser la A5 et A4 par exemple??Et est ce que la restistance pull-up est active sur ces pins??

  15. #75
    Membre éprouvé
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    février 2013
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : février 2013
    Messages : 422
    Points : 1 064
    Points
    1 064
    Par défaut
    Bonjour Sebastien
    Citation Envoyé par seb201 Voir le message
    Donc au lieu d'utiliser la 2 et la 7 plutôt utiliser la A5 et A4 par exemple??Et est ce que la restistance pull-up est active sur ces pins??
    Oui, il y a des PULL_UP sur ces entrées.Pour les entrées A4 et A5, si tu ne veut jamais utiliser le bus i2C, oui, sinon, utilises de A0-A4.

    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2019
    Messages : 65
    Points : 13
    Points
    13
    Par défaut
    Très bien merci , je vais faire le teste se soir je posterai le résultat de mes expériences se soir vers 22h.J'ai de même crée une nouvelle discussion concernant la partie motorisation si des curieux voudrait allez y jeter un coup d'oeuil , pour me donner un coup de pouce😉.

    https://www.developpez.net/forums/d2...-sous-arduino/

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2019
    Messages : 65
    Points : 13
    Points
    13
    Par défaut
    [QUOTE=jpbbricole;11376461]Bonjour Sebastien

    Oui, il y a des PULL_UP sur ces entrées.Pour les entrées A4 et A5, si tu ne veut jamais utiliser le bus i2C, oui, sinon, utilises de A0-A4.

    Merci énormément le résultat est impéquable tout fonctionne comme prévue . Il ne me reste plus qu'a coder un correcteur pid afin d'adapter la vitesse du moteur en fonction de l'inclinaison , et a vrai dire je ne sais pas trop comment m'y prendre. Voici mon code actuel , sans aucun correcteur :

    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
    #include "Wire.h"  // Arduino Wire library
    #include "I2Cdev.h"  //Installer ces 2 librairies
    #include "MPU6050.h"
    #include "math.h"
    #include <AFMotor.h>
    AF_DCMotor motor(2);
    // 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;
     
     
     
    void setup() {
     
      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
      Serial.println("Motor test!");
     
      // turn on motor
      motor.setSpeed(200);   //definie la vitesse du moterur 
     
      motor.run(RELEASE);
     
      pinMode(inputPin,INPUT_PULLUP);
      pinMode(inputPin1,INPUT_PULLUP);
      Serial.begin(9600);
     
    }
     
    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){
      motor.run(BACKWARD);
     
    }
    else if ( Val2==0){
      motor.run(FORWARD);
     
    }
    else if (int (alpha < -10)){
       motor.run(FORWARD); //fait avancer le chariot vers la droite
    }
    else if (int (alpha > 10)){
      motor.run(BACKWARD); //fait avancer le chariot vers la gauche
    }
    else
     motor.run(RELEASE);
     }

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2019
    Messages : 65
    Points : 13
    Points
    13
    Par défaut
    Bonsoir, j'ai essayé d'avancer un peu depuis la dernière fois mais bon je ne sais pas trop si je suis sur le bon chemin . Et à vrai dire je suis un peu perdue et ne sais pas trop comment continué.
    Voici mon code et mon idée:

    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
    float eps;
    float eps_D;
    float eps_P;
    float eps_I;
    float eps_Av;
    float eps_Ap;
    float kp = 300;           // Coefficient proportionnel
    float ki = 5.5;           // Coefficient intégrateur
    float kd = 100;            // Coefficient dérivateur
     
    void asservissement() {
     
    if (eps==0){
      code normal 
    }
    else if 
      eps = eps_oldn                     
      eps = epsAv - epsAp
      eps_P= kp*eps
      eps_D = kd*(eps - eps_old)/dt
      eps_I = eps_I + ki*(eps*dt)
      eps_Ap = eps_D + eps_I + eps_P      
     
    }
     
     
     
     
     
    Ce que je veuc faire!!!
     
    int i = 200
     
    if (abs (int alpha(t) - int alpha(t+1)) < 2 ){    //si la planche continue de de se pencher de plus en plus
      i+=1
      moteur.setSpeed(i)         //faire accélérer le moteur pour déplacer plus vite le chariot
    }
    else if (abs (int alpha(t) - alpha(t+1)) > 2 ){   //si la planche se redresse
      i-=1
      moteur.setSpeed(i).        //faire décélérer le moteur pour déplacer moins vite le chariot
    }

    Nom : tipe.jpg
Affichages : 30
Taille : 123,4 Ko

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2019
    Messages : 65
    Points : 13
    Points
    13
    Par défaut
    Bonsoir,
    J'ai du nouveau pour vous j'ai trouver un code de PID mais qui comporte deux moteur que j'ai déjà modifier un peu , pourriez vous m'aider pour l'adapter à mon systèmes possible.
    Voici le code :

    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
    #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<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;
    }
    Deplus j'ai recue un contrôleur mofset pour contrôler mon moteur celui-ci conviens super bien ,néanmoins je ne peux pas inverser la polarité de celui-si .Je me demandais donc si je peux en acheter un autre que je brancherai au meme moteur et au meme pwm mais en inversant les poles au niveau du moteur pour pouvoir faire tourner mon moteur dans les 2 sens.
    voici comment ça fonctionne :

  20. #80
    Membre confirmé
    Homme Profil pro
    savant fou
    Inscrit en
    septembre 2019
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : savant fou

    Informations forums :
    Inscription : septembre 2019
    Messages : 208
    Points : 480
    Points
    480
    Par défaut
    j'ai pas tout lu mais est-ce que cela fait partie de votre adaptation ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (-3<error<3){
      pid_i = pid_i +(ki*error);
    }
    --> en C++ on ne peut pas tester si une valeur est entre 2 bornes en l'écrivant comme cela. il faut dire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ((error > -3) && (error < 3)) {
      pid_i = pid_i +(ki*error);
    }
    Pour vous en convaincre essayez ce bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void setup() {
      Serial.begin(115200);
      int error = 21;
      if (-3 < error < 3) {
        Serial.println("bizarre..;");
      }
    }
     
    void loop() {}
    ce qu'il se passe c'est que le compilateur évalue cette expression comme cela if ((-3 < error) < 3) {...

    d'abord on teste -3 < error, comme error vaut 21 c'est vrai. vrai est représenté par la valeur 1 donc ensuite vous faites le second test (1 < 3) qui est vrai et donc c'est pour cela que bizarre est imprimé

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Lazarus] TLazSerial communique (mal) avec Arduino UNO
    Par Eric Beaumard dans le forum Lazarus
    Réponses: 6
    Dernier message: 08/09/2018, 17h34
  2. Réponses: 45
    Dernier message: 30/05/2017, 15h53
  3. Recyclage de clavier d'ordi portable avec Arduino Uno
    Par jeremygosset dans le forum Arduino
    Réponses: 3
    Dernier message: 25/06/2016, 00h58
  4. Bug communication serie avec arduino (busy)
    Par bizounours94 dans le forum MATLAB
    Réponses: 2
    Dernier message: 09/07/2012, 10h39
  5. Réponses: 4
    Dernier message: 15/05/2008, 18h28

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