[Programmation] Moteur DC et joystick : problème vitesse mini - Page 2
Répondre à la discussion
Page 2 sur 3 PremièrePremière 2 DernièreDernière
Affichage des résultats 31 à 60 sur 84

Moteur DC et joystick : problème vitesse mini



  1. #31
    davidkings

    Re : Moteur DC et joystick : problème vitesse mini


    ------

    Merci, je vais essayer demain.

    Pour ton post #29

    Oui, c'est logique et si tu utilisais une alim de 24 V, tu pourrais baisser encore motorSpeedMin.
    En fait non, le moteur démarre certes à une valeur plus faible mais comme il est alimenté en 24v, il va tourner plus vite.
    En 6v, il démarre à une valeur plus élevée (210 dans mon cas) mais il tourne moins vite. Le pb c'est que le joystick variateur ne sert à rien car on a un écart quasi imperceptible entre 210 et 255 et vu que mon moteur fonctionne sans souci en 3v direct, je ne peux pas en profiter avec l'arduino.

    Je vais essayer ton script et te tiens au courant.

    -----
    Dernière modification par davidkings ; 29/10/2016 à 21h08.

  2. #32
    davidkings

    Re : Moteur DC et joystick : problème vitesse mini

    Yvan, j'ai essayé et ça marche. J'ai dû monter à 4ms. On entend des claquements au démarrage.
    merci beaucoup !!!

    Par contre ça ne marche pas pour le sens de rotation inverse, ça ne tourne pas du tout. Je ne comprends pas pourquoi.
    Une idée ?

  3. #33
    davidkings

    Re : Moteur DC et joystick : problème vitesse mini

    J'ai trouvé pourquoi ça ne marche pas : j'avais permuté deux pins (les 6 et 9) et curieusement, dans cet ordre ça marche. Si je remets comme c'était avant, ton script ne fonctionne pas : les moteurs tournent à fond.

    Avec les pins erroné, le script ressemble à ça, et curieusement ça marche. Par contre, j'espère qu'électroniquement, y a pas de risque de faire griller un composant.

    Code:
    const byte joyStickPin = A1;
    const byte motorSpeedPin = 6;
    const byte motorDirPin1 = 9; 
    const byte motorDirPin2 = 5;
    
    
    
    void MotorForward( byte Spd)
    {
        digitalWrite (motorSpeedPin, 1);
        digitalWrite (motorDirPin1, 0);
        digitalWrite(motorDirPin2, 1);
        delay(4);
        digitalWrite(motorDirPin2, 0);
        int periodeRefr= 1000/Spd;
        delay(periodeRefr);
    }
     
    void MotorBackward( byte Spd)
    {
        digitalWrite (motorSpeedPin, 1);
        digitalWrite (motorDirPin1, 1);
        digitalWrite(motorDirPin2, 0);
        delay(4);
        digitalWrite(motorDirPin2, 1);
        int periodeRefr= 1000/Spd;
        delay(periodeRefr);
    }
     
    void MotorStop()
    {
        digitalWrite(motorSpeedPin, 0);  
    }

  4. #34
    davidkings

    Re : Moteur DC et joystick : problème vitesse mini

    Encore moi. Désolé.

    J'ai essayé de brancher le 2ème moteur d'abord sur les pins ~3,~10,~11 : ça ne marche pas, puis sur les pins 4, 7 et 8 et là ça marche.

    Par contre, quand je fais fonctionner les deux moteurs en même temps, ils tournent moins vite. Pourquoi ?

  5. #35
    davidkings

    Re : Moteur DC et joystick : problème vitesse mini

    Voici le code. Désolé d'avoir tout doublé, c'est pour être certain que les variables du moteur A n'interfèrent avec le moteur B.

    Code:
    //Set pin numbers:
    const byte joyStickPinA = A1;
    const byte joyStickPinB = A2;
    
    const byte motorDirPin1A = 2; 
    const byte motorSpeedPinA = 6;
    const byte motorDirPin2A = 5;
    
    const byte motorDirPin1B = 4; 
    const byte motorSpeedPinB = 7;
    const byte motorDirPin2B = 8;
    
    
    
    
    //variables
    //Joystick input variables
    int joyValueA = 0;
    int joyValueB = 0;
    int joyValueMaxA = 1023;
    int joyValueMaxB = 1023;
    int joyValueMinA = 0;
    int joyValueMinB = 0;
    int joyValueMidA = 512;
    int joyValueMidB = 512;
    int joyValueMidUpperA = joyValueMidA + 20;
    int joyValueMidLowerA = joyValueMidA - 20;
    int joyValueMidUpperB = joyValueMidB + 20;
    int joyValueMidLowerB = joyValueMidB - 20;
     
    //DC motor variables
    byte motorSpeedA = 0;
    byte motorSpeedB = 0;
    byte motorSpeedMaxA = 255;
    byte motorSpeedMaxB = 255;
    byte motorSpeedMinA = 10;
    byte motorSpeedMinB = 10; 
     
    void setup()
    {
        pinMode(joyStickPinA, INPUT);
        pinMode(joyStickPinB, INPUT);
        
        pinMode(motorSpeedPinA, OUTPUT);
        pinMode(motorDirPin1A, OUTPUT);
        pinMode(motorDirPin2A, OUTPUT);
    
        pinMode(motorSpeedPinB, OUTPUT);
        pinMode(motorDirPin1B, OUTPUT);
        pinMode(motorDirPin2B, OUTPUT);
        
    }
     
    void loop()
    {
        joyValueA = analogRead(joyStickPinA);
         
        if(joyValueA > joyValueMidUpperA) //Forward
        {
            motorSpeedA = map(joyValueA, joyValueMidUpperA, joyValueMaxA, motorSpeedMinA, motorSpeedMaxA);
            MotorForwardA(motorSpeedA);
        }
        else if(joyValueA < joyValueMidLowerA) //Backward
        {
            motorSpeedA = map(joyValueA, joyValueMidLowerA, joyValueMinA, motorSpeedMinA, motorSpeedMaxA);
            MotorBackwardA(motorSpeedA);
        }
    
        else
        {
           MotorStop();
        }
    
    
        joyValueB = analogRead(joyStickPinB);
         
        if(joyValueB > joyValueMidUpperB) //Forward
        {
            motorSpeedB = map(joyValueB, joyValueMidUpperB, joyValueMaxB, motorSpeedMinB, motorSpeedMaxB);
            MotorForwardB(motorSpeedB);
        }
        else if(joyValueB < joyValueMidLowerB) //Backward
        {
            motorSpeedB = map(joyValueB, joyValueMidLowerB, joyValueMinB, motorSpeedMinB, motorSpeedMaxB);
            MotorBackwardB(motorSpeedB);
        }
    
        else
        {
           MotorStop();
        }
         
     
    }
    void MotorForwardA( byte SpdA)
    {
        digitalWrite (motorSpeedPinA, 1);
        digitalWrite (motorDirPin1A, 0);
        digitalWrite(motorDirPin2A, 1);
        delay(5);
        digitalWrite(motorDirPin2A, 0);
        int periodeRefrA= 1000/SpdA;
        delay(periodeRefrA);
    }
     
    void MotorBackwardA( byte SpdA)
    {
        digitalWrite (motorSpeedPinA, 1);
        digitalWrite (motorDirPin1A, 1);
        digitalWrite(motorDirPin2A, 0);
        delay(5);
        digitalWrite(motorDirPin2A, 1);
        int periodeRefrA= 1000/SpdA;
        delay(periodeRefrA);
    }
    
    
    
    
    void MotorForwardB( byte SpdB)
    {
        digitalWrite (motorSpeedPinB, 1);
        digitalWrite (motorDirPin1B, 0);
        digitalWrite(motorDirPin2B, 1);
        delay(5);
        digitalWrite(motorDirPin2B, 0);
        int periodeRefrB= 1000/SpdB;
        delay(periodeRefrB);
    }
     
    void MotorBackwardB( byte SpdB)
    {
        digitalWrite (motorSpeedPinB, 1);
        digitalWrite (motorDirPin1B, 1);
        digitalWrite(motorDirPin2B, 0);
        delay(5);
        digitalWrite(motorDirPin2B, 1);
        int periodeRefrB= 1000/SpdB;
        delay(periodeRefrB);
    }
    
    
    
    
    
    
    void MotorStop()
    {
        digitalWrite(motorSpeedPinA, 0);
        digitalWrite(motorSpeedPinB, 0);  
    }

  6. #36
    Yvan_Delaserge

    Re : Moteur DC et joystick : problème vitesse mini

    Poste un schéma des branchements entre l'Arduino le shield, le joystick et les moteurs.

    Si tu ajoutes un second moteur c'est normal que ça tourne deux fois moins vite. C'est parce que pendant les périodes réfractaire, l'Arduino ne fait rien. Il faut compenser la présence d'un deuxième moteur en réduisant les deux périodes réfractaires de moitié. En mettant 500 au lieu de 1000.
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

  7. #37
    davidkings

    Re : Moteur DC et joystick : problème vitesse mini

    Voici le schema.
    J'ai essayé de mettre 500 au lieu de 1000 et ça fait exactement pareil.


    plan cablage.jpg
    Images attachées Images attachées  
    Dernière modification par davidkings ; 31/10/2016 à 09h34.

  8. #38
    Yvan_Delaserge

    Re : Moteur DC et joystick : problème vitesse mini

    Tu as oublié la connexion entre le GND de l'Arduino et le shield.
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

  9. #39
    davidkings

    Re : Moteur DC et joystick : problème vitesse mini

    si je l'ai mise, regarde la petite vignette. Quand j'ai voulu télécharger le bon schéma, je n'ai pas pu effacer l'ancien.

  10. #40
    Yvan_Delaserge

    Re : Moteur DC et joystick : problème vitesse mini

    Pourquoi n'as-tu pas plutôt connecté le GND de l'Arduino avec la broche GND du shield comme les autres fils?
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

  11. #41
    Yvan_Delaserge

    Re : Moteur DC et joystick : problème vitesse mini

    Au début de ce fil, tu nous as dit que ton shield était comme ça:Nom : SHIELD.gif
Affichages : 97
Taille : 369,7 Ko
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

  12. #42
    davidkings

    Re : Moteur DC et joystick : problème vitesse mini

    Sur mon shield, il n'y a qu'une seule broche ground.

    Est-ce que ceci a une influence sur mon problème ?

  13. #43
    davidkings

    Re : Moteur DC et joystick : problème vitesse mini

    c'est celui de la photo du site ou j'ai acheté mais celui que j'ai reçu est légèrement différent
    Dernière modification par davidkings ; 31/10/2016 à 14h28.

  14. #44
    Yvan_Delaserge

    Re : Moteur DC et joystick : problème vitesse mini

    Peux-tu poster une photo du connecteur d'entrée de ton shield?
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

  15. #45
    davidkings

    Re : Moteur DC et joystick : problème vitesse mini

    mon shield.jpg

    détail.jpg

    Voilà. Note que le ENB n'est pas imprimé sur le circuit. Bizarre.

  16. #46
    Yvan_Delaserge

    Re : Moteur DC et joystick : problème vitesse mini

    avec

    une connection de masse entre l'Arduino et le shield,

    motorDirPin1A = 2; vers In 1
    motorSpeedPinA = 6;ENA
    motorDirPin2A = 5; vers In 2

    motorDirPin1B = 4; vers In 3
    motorSpeedPinB = 7;ENB
    motorDirPin2B = 8;vers In 4

    les branchements sont corrects.

    Il faut donc maintenant vérifier quels signaux sont présents sur ces broches. Pour ENA et ENB, ce sera des impulsions de 4 ms. Il va te falloir un oscilloscope.
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

  17. #47
    Yvan_Delaserge

    Re : Moteur DC et joystick : problème vitesse mini

    avec

    une connection de masse entre l'Arduino et le shield,

    motorDirPin1A = 2; vers In 1
    motorSpeedPinA = 6;ENA
    motorDirPin2A = 5; vers In 2

    motorDirPin1B = 4; vers In 3
    motorSpeedPinB = 7;ENB
    motorDirPin2B = 8;vers In 4

    les branchements sont corrects.

    Il faut donc maintenant vérifier quels signaux sont présents sur ces broches. Pour ENA et ENB, ce sera des impulsions de 4 ms. Il va te falloir un oscilloscope.
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

  18. #48
    davidkings

    Re : Moteur DC et joystick : problème vitesse mini

    bah j'ai pas d'oscilloscope

    Y a un truc de bizarre quand même. Pourquoi en intervertissant les pins de l'arduino ça marche ou pas. Exemple : si je mets le ENA sur le pin 2 ça va marcher et sur le 4 ça ne marche plus. (c'est un exemple, les numéros des pins sont donnés au hasard).

    C'est bien dommage car avec ton code et le branchement actuel, ça marchait impeccable, mais un seul moteur à la fois.
    Y a pas moyen de programmer pour avoir les deux moteurs en parallèle dans le déroulé du script ?

  19. #49
    Yvan_Delaserge

    Re : Moteur DC et joystick : problème vitesse mini

    Il y a des erreurs dans ton code. Le code correct est le suivant:
    Code:
    void MotorForwardA( byte SpdA)
    {
        
        digitalWrite (motorDirPin1A, 1);
        digitalWrite (motorDirPin2A, 0);
        digitalWrite (motorSpeedPinA, 1);
        delay(5);
        digitalWrite (motorSpeedPinA, 0);
        int periodeRefrA= 1000/SpdA;
        delay(periodeRefrA);
    }
     
    void MotorBackwardA( byte SpdA)
    {
        
        digitalWrite (motorDirPin1A, 0);
        digitalWrite (motorDirPin2A, 1);
        digitalWrite (motorSpeedPinA, 1);
        delay(5);
        digitalWrite(motorSpeedPinA, 0);
        int periodeRefrA= 1000/SpdA;
        delay(periodeRefrA);
    }
    
    
    void MotorForwardB( byte SpdB)
    {
        digitalWrite (motorDirPin1B, 1);
        digitalWrite (motorDirPin2B, 0);
        digitalWrite (motorSpeedPinB, 1);
        delay(5);
        digitalWrite (motorSpeedPinB, 0);
        int periodeRefrB= 1000/SpdB;
        delay(periodeRefrB);
    }
     
    void MotorBackwardB( byte SpdB)
    {
        digitalWrite (motorDirPin1B, 0);
        digitalWrite (motorDirPin2B, 1);
        digitalWrite (motorSpeedPinB, 1);
        delay(5);
        digitalWrite (motorSpeedPinB, 0);
        int periodeRefrB= 1000/SpdB;
        delay(periodeRefrB);
    }
    Dernière modification par Yvan_Delaserge ; 01/11/2016 à 05h29.
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

  20. #50
    davidkings

    Re : Moteur DC et joystick : problème vitesse mini

    j'avais changé le code car avec le tien (qui était le mien original et le plus logique), ça ne marchait pas.

  21. #51
    Yvan_Delaserge

    Re : Moteur DC et joystick : problème vitesse mini

    Avec un seul moteur le programme fonctionne, mais le problème avec deux moteurs, c'est que la commande de l'un interagit avec la commande de l'autre, parce que les délais d'attente s'additionnent.
    Une autre façon de faire, assez pratique parce qu'elle permet de simplifier le code, serait d'utiliser la fonction TONE. Le programme devient alors:
    Code:
    //Set pin numbers:
    const byte joyStickPinA = A1;
    const byte joyStickPinB = A2;
    
    const byte motorDirPin1A = 2; 
    const byte motorSpeedPinA = 6;
    const byte motorDirPin2A = 5;
    
    const byte motorDirPin1B = 4; 
    const byte motorSpeedPinB = 7;
    const byte motorDirPin2B = 8;
    
    
    
    
    //variables
    //Joystick input variables
    int joyValueA = 0;
    int joyValueB = 0;
    int joyValueMaxA = 1023;
    int joyValueMaxB = 1023;
    int joyValueMinA = 0;
    int joyValueMinB = 0;
    int joyValueMidA = 512;
    int joyValueMidB = 512;
    int joyValueMidUpperA = joyValueMidA + 20;
    int joyValueMidLowerA = joyValueMidA - 20;
    int joyValueMidUpperB = joyValueMidB + 20;
    int joyValueMidLowerB = joyValueMidB - 20;
     
    //DC motor variables
    byte motorSpeedA = 0;
    byte motorSpeedB = 0;
    byte motorSpeedMaxA = 255;
    byte motorSpeedMaxB = 255;
    byte motorSpeedMinA = 10;
    byte motorSpeedMinB = 10; 
     
    void setup()
    {
        pinMode(joyStickPinA, INPUT);
        pinMode(joyStickPinB, INPUT);
        
        pinMode(motorSpeedPinA, OUTPUT);
        pinMode(motorDirPin1A, OUTPUT);
        pinMode(motorDirPin2A, OUTPUT);
    
        pinMode(motorSpeedPinB, OUTPUT);
        pinMode(motorDirPin1B, OUTPUT);
        pinMode(motorDirPin2B, OUTPUT);
        
    }
     
    void loop()
    {
        joyValueA = analogRead(joyStickPinA);
         
        if(joyValueA > joyValueMidUpperA) //Forward
        {
            motorSpeedA = map(joyValueA, joyValueMidUpperA, joyValueMaxA, motorSpeedMinA, motorSpeedMaxA);
            MotorForwardA(motorSpeedA);
        }
        else if(joyValueA < joyValueMidLowerA) //Backward
        {
            motorSpeedA = map(joyValueA, joyValueMidLowerA, joyValueMinA, motorSpeedMinA, motorSpeedMaxA);
            MotorBackwardA(motorSpeedA);
        }
    
        else
        {
           MotorStop();
        }
    
    
        joyValueB = analogRead(joyStickPinB);
         
        if(joyValueB > joyValueMidUpperB) //Forward
        {
            motorSpeedB = map(joyValueB, joyValueMidUpperB, joyValueMaxB, motorSpeedMinB, motorSpeedMaxB);
            MotorForwardB(motorSpeedB);
        }
        else if(joyValueB < joyValueMidLowerB) //Backward
        {
            motorSpeedB = map(joyValueB, joyValueMidLowerB, joyValueMinB, motorSpeedMinB, motorSpeedMaxB);
            MotorBackwardB(motorSpeedB);
        }
    
        else
        {
           MotorStop();
        }
         
     
    }
    void MotorForwardA( byte SpdA)
    {
        digitalWrite (motorDirPin1A, 1);
        digitalWrite (motorDirPin2A, 0);
        tone (motorSpeedPinA, SpdA);
    }
     
    void MotorBackwardA( byte SpdA)
    {
        digitalWrite (motorDirPin1A, 0);
        digitalWrite (motorDirPin2A, 1);
        tone (motorSpeedPinA, SpdA);
    }
    
    void MotorForwardB( byte SpdB)
    {
        digitalWrite (motorDirPin1B, 1);
        digitalWrite (motorDirPin2B, 0);
        tone (motorSpeedPinB, SpdB);
    }
     
    void MotorBackwardB( byte SpdB)
    {
        digitalWrite (motorDirPin1B, 0);
        digitalWrite (motorDirPin2B, 1);
        tone (motorSpeedPinB, SpdB);
    }
    
    
    void MotorStop()
    {
        digitalWrite(motorSpeedPinA, 0);
        digitalWrite(motorSpeedPinB, 0);  
    }
    Ce programme envoie un créneau de rapport cyclique 50% à la broche ENABLE du circuit avec le L 298. Pour que cette broche ne "voie" que des impulsions de courte durée, il faut la connecter à l'Arduino non pas par un fil, mais par un condensateur. Il faut choisir la capacité la plus faible possible, qui fait que le moteur commence à tourner lorsque le joystick est légèrement déplacé de son point milieu.
    Dernière modification par Yvan_Delaserge ; 09/11/2016 à 10h28.
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

  22. #52
    Yvan_Delaserge

    Re : Moteur DC et joystick : problème vitesse mini

    Il y a aussi une solution "tout software":
    Code:
    //Set pin numbers:
    const byte joyStickPinA = A1;
    const byte joyStickPinB = A2;
    
    const byte motorDirPin1A = 2; 
    const byte motorSpeedPinA = 6;
    const byte motorDirPin2A = 5;
    
    const byte motorDirPin1B = 4; 
    const byte motorSpeedPinB = 7;
    const byte motorDirPin2B = 8;
    
    
    
    //variables
    //Joystick input variables
    int joyValueA = 0;
    int joyValueB = 0;
    int joyValueMaxA = 1023;
    int joyValueMaxB = 1023;
    int joyValueMinA = 0;
    int joyValueMinB = 0;
    int joyValueMidA = 512;
    int joyValueMidB = 512;
    int joyValueMidUpperA = joyValueMidA + 20;
    int joyValueMidLowerA = joyValueMidA - 20;
    int joyValueMidUpperB = joyValueMidB + 20;
    int joyValueMidLowerB = joyValueMidB - 20;
     
    //DC motor variables
    byte motorSpeedA = 0;
    byte motorSpeedB = 0;
    byte motorSpeedMaxA = 255;
    byte motorSpeedMaxB = 255;
    byte motorSpeedMinA = 10;
    byte motorSpeedMinB = 10;
    unsigned long startDelayA;
    unsigned long startDelayB;
     
    void setup()
    {
        pinMode(joyStickPinA, INPUT);
        pinMode(joyStickPinB, INPUT);
        
        pinMode(motorSpeedPinA, OUTPUT);
        pinMode(motorDirPin1A, OUTPUT);
        pinMode(motorDirPin2A, OUTPUT);
    
        pinMode(motorSpeedPinB, OUTPUT);
        pinMode(motorDirPin1B, OUTPUT);
        pinMode(motorDirPin2B, OUTPUT);
        
        startDelayA = millis();
        startDelayB = millis();
        
    }
     
    void loop()
    {
        joyValueA = analogRead(joyStickPinA);
         
        if(joyValueA > joyValueMidUpperA) //Forward
        {
            motorSpeedA = map(joyValueA, joyValueMidUpperA, joyValueMaxA, motorSpeedMinA, motorSpeedMaxA);
            MotorForwardA(motorSpeedA);
        }
        else if(joyValueA < joyValueMidLowerA) //Backward
        {
            motorSpeedA = map(joyValueA, joyValueMidLowerA, joyValueMinA, motorSpeedMinA, motorSpeedMaxA);
            MotorBackwardA(motorSpeedA);
        }
    
        else
        {
           MotorStop();
        }
    
    
        joyValueB = analogRead(joyStickPinB);
         
        if(joyValueB > joyValueMidUpperB) //Forward
        {
            motorSpeedB = map(joyValueB, joyValueMidUpperB, joyValueMaxB, motorSpeedMinB, motorSpeedMaxB);
            MotorForwardB(motorSpeedB);
        }
        else if(joyValueB < joyValueMidLowerB) //Backward
        {
            motorSpeedB = map(joyValueB, joyValueMidLowerB, joyValueMinB, motorSpeedMinB, motorSpeedMaxB);
            MotorBackwardB(motorSpeedB);
        }
    
        else
        {
           MotorStop();
        }
         
     
    }
    void MotorForwardA( byte SpdA)
    {
        digitalWrite (motorDirPin1A, 1);
        digitalWrite (motorDirPin2A, 0);
        if (startDelayA >= millis() + SpdA)//on regarde s'il est l'heure d'envoyer l'impulsion
        {  digitalWrite (motorSpeedPinA, 1);//si oui, on envoie l'impulsion
           delay(5);
           digitalWrite (motorSpeedPinA, 0);
           startDelayA >= millis();//on remet le chrono à zéro
        }
    }
     
    void MotorBackwardA( byte SpdA)
    {
        digitalWrite (motorDirPin1A, 0);
        digitalWrite (motorDirPin2A, 1);
        if (startDelayA >= millis() + SpdA)//on regarde s'il est l'heure d'envoyer l'impulsion
        {  digitalWrite (motorSpeedPinA, 1);//si oui, on envoie l'impulsion
           delay(5);
           digitalWrite (motorSpeedPinA, 0);
           startDelayA >= millis();//on remet le chrono à zéro
        }
    }
    
    void MotorForwardB( byte SpdB)
    {
        digitalWrite (motorDirPin1B, 1);
        digitalWrite (motorDirPin2B, 0);
        if (startDelayB >= millis() + SpdB)//on regarde s'il est l'heure d'envoyer l'impulsion
        {  digitalWrite (motorSpeedPinB, 1);//si oui, on envoie l'impulsion
           delay(5);
           digitalWrite (motorSpeedPinB, 0);
           startDelayB >= millis();//on remet le chrono à zéro
        }
    }
     
    void MotorBackwardB( byte SpdB)
    {
        digitalWrite (motorDirPin1B, 0);
        digitalWrite (motorDirPin2B, 1);
        if (startDelayB >= millis() + SpdB)//on regarde s'il est l'heure d'envoyer l'impulsion
        {  digitalWrite (motorSpeedPinB, 1);//si oui, on envoie l'impulsion
           delay(5);
           digitalWrite (motorSpeedPinB, 0);
           startDelayB >= millis();//on remet le chrono à zéro
        }
    }
    
    
    void MotorStop()
    {
        digitalWrite(motorSpeedPinA, 0);
        digitalWrite(motorSpeedPinB, 0);  
    }
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

  23. #53
    davidkings

    Re : Moteur DC et joystick : problème vitesse mini

    Merci pour ton aide.
    Je vais essayer et te tiens informé.

  24. #54
    davidkings

    Re : Moteur DC et joystick : problème vitesse mini

    Dans ton exemple "tout software" pourquoi il n'y a plus la ligne
    Code:
    int periodeRefrA= 1000/SpdA;
    ?

  25. #55
    Yvan_Delaserge

    Re : Moteur DC et joystick : problème vitesse mini

    parce que l'on n'utilise plus une période réfractaire, on se sert de la fonction millis()
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

  26. #56
    davidkings

    Re : Moteur DC et joystick : problème vitesse mini

    Salut,

    J'ai essayé ton code "software". Il ne marche pas, il ne se passe rien, les moteurs ne démarrent pas.

    Comme j'ai modifié plusieurs fois mon soft, voici celui qui est chargé actuellement dans mon arduino et qui fonctionne.
    Evidemment, dans ton exemple "software" j'ai mis les bons numéro de pin.

    Code:
    //Set pin numbers:
    const byte joyStickPinA = A1;
    const byte motorSpeedPinA = 5;
    const byte motorDirPin1A = 2;
    const byte motorDirPin2A = 4;
    
    const byte joyStickPinB = A2;
    const byte motorSpeedPinB = 6;
    const byte motorDirPin1B = 7;
    const byte motorDirPin2B = 8;
    
    //variables
    //Joystick input variables
    int joyValueA = 0;
    int joyValueB = 0;
    int joyValueMax = 1023;
    int joyValueMin = 0;
    int joyValueMid = 512;
    int joyValueMidUpper = joyValueMid + 20;
    int joyValueMidLower = joyValueMid - 20;
     
    //DC motor variables
    byte motorSpeedA = 0;
    byte motorSpeedB = 0;
    byte motorSpeedMax = 255;
    byte motorSpeedMin = 210; //set to smallest value that make motor move (default 0)
    
    
    void MotorForwardA( byte SpdA)
    {
        digitalWrite (motorDirPin1A, 1);
        digitalWrite (motorDirPin2A, 0);
        analogWrite(motorSpeedPinA, SpdA);
    }
     
    void MotorBackwardA( byte SpdA)
    {
        digitalWrite (motorDirPin1A, 0);
        digitalWrite (motorDirPin2A, 1);
        analogWrite(motorSpeedPinA, SpdA);
    }
     
    void MotorStopA()
    {
        analogWrite(motorSpeedPinA, 0);  
    }
    
    void MotorForwardB( byte SpdB)
    {
        digitalWrite (motorDirPin1B, 1);
        digitalWrite (motorDirPin2B, 0);
        analogWrite(motorSpeedPinB, SpdB);
    }
     
    void MotorBackwardB( byte SpdB)
    {
        digitalWrite (motorDirPin1B, 0);
        digitalWrite (motorDirPin2B, 1);
        analogWrite(motorSpeedPinB, SpdB);
    }
     
    void MotorStopB()
    {
        analogWrite(motorSpeedPinB, 0);  
    }
    
    
    
    
    void setup()
    {
        pinMode(joyStickPinA, INPUT);
        pinMode(motorSpeedPinA, OUTPUT);
        pinMode(motorDirPin1A, OUTPUT);
        pinMode(motorDirPin2A, OUTPUT);
    
        pinMode(joyStickPinB, INPUT);
        pinMode(motorSpeedPinB, OUTPUT);
        pinMode(motorDirPin1B, OUTPUT);
        pinMode(motorDirPin2B, OUTPUT);
    }
     
    void loop()
    {
        joyValueA = analogRead(joyStickPinA);
             
        if(joyValueA > joyValueMidUpper) //Forward
        {
            motorSpeedA = map(joyValueA, joyValueMidUpper, joyValueMax, motorSpeedMin, motorSpeedMax);
            MotorForwardA(motorSpeedA);
        }
        else if(joyValueA < joyValueMidLower) //Backward
        {
            motorSpeedA = map(joyValueA, joyValueMidLower, joyValueMin, motorSpeedMin, motorSpeedMax);
            MotorBackwardA(motorSpeedA);
        }
        else
        {
           MotorStopA();
        }
        
        joyValueB = analogRead(joyStickPinB);
        
        if(joyValueB > joyValueMidUpper) //Forward
        {
            motorSpeedB = map(joyValueB, joyValueMidUpper, joyValueMax, motorSpeedMin, motorSpeedMax);
            MotorForwardB(motorSpeedB);
        }
        else if(joyValueB < joyValueMidLower) //Backward
        {
            motorSpeedB = map(joyValueB, joyValueMidLower, joyValueMin, motorSpeedMin, motorSpeedMax);
            MotorBackwardB(motorSpeedB);
        }
        else
        {
           MotorStopB();
        }
     
    }

  27. #57
    Yvan_Delaserge

    Re : Moteur DC et joystick : problème vitesse mini

    Il y a une faute de frappe dans mon code. Ou 4 fautes plus exactement.

    Au lieu de
    startDelayB >= millis()

    il faut
    startDelayB = millis()

    et pareil pour startDelay A.

    Je m'étonne que le compilateur ait laissé passer ça.
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

  28. #58
    davidkings

    Re : Moteur DC et joystick : problème vitesse mini

    J'avais déjà corrigé la coquille. Mais ça ne marche pas.

    Es-tu certain que ton idée fonctionne ?


    Code:
     if (startDelayB >= millis() + SpdB)
    millis(); affiche le temps depuis que le programme a démarré.

    Donc sur cette ligne startDelayB = millis () non ?
    Dans ce cas startDelayB ne pourra jamais être >= à millis() + SpdB)

    Me trompe-je ?

  29. #59
    Yvan_Delaserge

    Re : Moteur DC et joystick : problème vitesse mini

    En effet, tu as raison.
    Il faudrait envoyer le créneau lorsque millis() est >= startDelayB + SpdB
    Après avoir envoyé le créneau, on stocke la valeur actuelle de millis() dans StartDelayB et on recommence à attendre le moment d'envoyer le créneau suivant.
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

  30. #60
    davidkings

    Re : Moteur DC et joystick : problème vitesse mini

    Ce qui donnerait ceci ?

    Code:
    //variables
    startDelayA = millis() // on mémorise le temps courant du chrono
    
    void MotorForwardA( byte SpdA)
    {
        digitalWrite (motorDirPin1A, 1);
        digitalWrite (motorDirPin2A, 0);    
        if (millis() >= startDelayA + SpdA)
        {  digitalWrite (motorSpeedPinA, 1);
           delay(5);
           digitalWrite (motorSpeedPinA, 0);
           startDelayA = millis() // on mémorise le temps courant du chrono    
        }
    }
    Si c'est juste et si j'ai bien compris, plus la valeur de SpdA sera grande (joystick à fond), plus il faudra attendre pour donner l'impulsion au moteur, donc le moteur ralentira lorsqu'on pousse le joystick à fond, ce qui n'est pas logique.
    Dernière modification par davidkings ; 17/11/2016 à 20h16.

Page 2 sur 3 PremièrePremière 2 DernièreDernière

Discussions similaires

  1. Problème mini moteur 3v dc
    Par Sheyzu dans le forum Électronique
    Réponses: 22
    Dernier message: 24/05/2015, 11h28
  2. JOYSTICK de mini pelle
    Par invite1cc84685 dans le forum Électronique
    Réponses: 3
    Dernier message: 07/09/2011, 21h21
  3. controle moteur joystick
    Par invite2ec54172 dans le forum Électronique
    Réponses: 2
    Dernier message: 20/08/2011, 12h49
  4. Commandez un mini moteur par usb et par joystick?
    Par thomas5701 dans le forum Électronique
    Réponses: 6
    Dernier message: 03/09/2008, 20h15
  5. Moteur pas à pas commandé par un joystick
    Par invite4fbd11ae dans le forum Électronique
    Réponses: 19
    Dernier message: 05/05/2008, 16h39
Découvrez nos comparatifs produits sur l'informatique et les technologies.