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 :

Moteur pas-à-pas avec boutons-poussoirs


Sujet :

Arduino

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 84
    Points : 25
    Points
    25
    Par défaut Moteur pas-à-pas avec boutons-poussoirs
    Bonjour cher amis, je suis débutant en programmation et je travail sur une petite maquette qui m'impose a programmée un moteur pas a pas uni polaire (28BYJ-48).
    J'aimerai commandé mon moteur pas a pas avec 2 boutons poussoir(BP1 & BP2).
    Quand on appuis sur BP1 le moteur vas dans le sens horaire d'une montre et quand on relâche BP1 le moteur s'arrête.
    Quand on appuis sur BP2 le moteur vas dans le sens antihoraire d'une montre et quand on relâche BP2 le moteur s'arrête.
    J'ai appris à allumé une LED quant on appuis avec un bouton poussoir et l'éteindre quant on le relâche. Pour programmer mon moteur j'ai essayé de remplacer la LED par le moteur mais mon programme ne fonction pas.
    Voilà pourquoi je viens vers vous à fin que résoudre se problème.

    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
     
    #include <Stepper.h>
     
    // change this to the number of steps on your motor
    #define STEPS 100
     
    Stepper Mon_moteur(STEPS, 8, 10, 9, 11);
     
     
    int nb_pas = 0;
    const int BP1=2;
    const int BP2=3;
    const int led=4;
     
    int buttonState1 = 0; 
    int buttonState2 = 0;
    void setup() {
      pinMode(led,OUTPUT);
      pinMode(BP1,INPUT);
      pinMode(BP2,INPUT);
    }
     
    void loop() {
      buttonState1=digitalRead(BP1);
      buttonState2=digitalRead(BP2);
     
      Mon_moteur.setSpeed(300);
      nb_pas = 2048;
      if(buttonState1==HIGH){
        digitalWrite(led,HIGH);
         Mon_moteur.step(nb_pas);
        }else 
        {
          digitalWrite(led,LOW);
     
        }
      if(buttonState2==HIGH){
        digitalWrite(led,HIGH);
        Mon_moteur.step(-nb_pas);
        }else 
        {
          digitalWrite(led,LOW);
     
        }
    }

  2. #2
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    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 : 1 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Bonjour Mohamed

    Citation Envoyé par Fadiga Mohamed fode Voir le message
    Je veux bien mètre mon programme mais je n'arrive pas a le copier dans las pièces jointes et je sais pas pourquoi et sa m'affiche ERREUR
    Pour mettre ton programme en ligne, dans ton éditeur, ctrl A pour tout sélectionner, ctrl C pour copier dans le presse papier.
    Dans l'article, cliquer sur l'icône # et, où clignote le curseur entre les deux ][, ctrl V pour coller le presse-pappier.

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

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 84
    Points : 25
    Points
    25
    Par défaut
    voila le programme
    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
     
    #include <Stepper.h>
     
    // change this to the number of steps on your motor
    #define STEPS 100
     
    Stepper Mon_moteur(STEPS, 8, 10, 9, 11);
     
     
    int nb_pas = 0;
    const int BP1=2;
    const int BP2=3;
    const int led=4;
     
    int buttonState1 = 0; 
    int buttonState2 = 0;
    void setup() {
      pinMode(led,OUTPUT);
      pinMode(BP1,INPUT);
      pinMode(BP2,INPUT);
    }
     
    void loop() {
      buttonState1=digitalRead(BP1);
      buttonState2=digitalRead(BP2);
     
      Mon_moteur.setSpeed(300);
      nb_pas = 2048;
      if(buttonState1==HIGH){
        digitalWrite(led,HIGH);
         Mon_moteur.step(nb_pas);
        }else 
        {
          digitalWrite(led,LOW);
     
        }
      if(buttonState2==HIGH){
        digitalWrite(led,HIGH);
        Mon_moteur.step(-nb_pas);
        }else 
        {
          digitalWrite(led,LOW);
     
        }
    }

  4. #4
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    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 : 1 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Bonjour Mohamed

    Ta correction fonctionne, mais pour être plus près de la réalité, ton moteur pas à pas a 32 pas/tour (11.25°) et un réducteur de 64:1 = 2048 (63.68395:1 2038 pas/tour réel)
    donc, dans ton programme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
     #define STEPS 2038
    ...
    ...
    	 Mon_moteur.setSpeed(10);
    ...
    ...
    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 84
    Points : 25
    Points
    25
    Par défaut
    Bon le moteur fonction mais il ne s’arrête pas tant qu'il ne finit son nombre de tour.
    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
     
    #include <Stepper.h>
     
    // change this to the number of steps on your motor
    #define STEPS 2038
     
    Stepper Mon_moteur(STEPS, 8, 10, 9, 11);
     
     
    int nb_pas = 0;
    const int BP1=2;
    const int BP2=3;
    const int led=4;
     
    int buttonState1 = 0; 
    int buttonState2 = 0;
    void setup() {
      pinMode(led,OUTPUT);
      pinMode(BP1,INPUT);
      pinMode(BP2,INPUT);
    }
     
    void loop() {
      buttonState1=digitalRead(BP1);
      buttonState2=digitalRead(BP2);
     
      Mon_moteur.setSpeed(10);
      nb_pas = 2038;
      if(buttonState1==HIGH){
        digitalWrite(led,HIGH);
         Mon_moteur.step(nb_pas);
        }else 
        {
          digitalWrite(led,LOW);
     
        }
      if(buttonState2==HIGH){
        digitalWrite(led,HIGH);
        Mon_moteur.step(-nb_pas);
        }else 
        {
          digitalWrite(led,LOW);
     
        }
    }
    Alors que moi j'aimerai que le moteur fonction quand le BP est pressé et maintenu et qu'il s’arrête quand le BP n'est plus pressé ou appuyé comme dans se programme de LED
    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
    /*
      Button
      const int buttonPin = 2;     // the number of the pushbutton pin
    const int ledPin =  13;      // the number of the LED pin
     
    // variables will change:
    int buttonState = 0;         // variable for reading the pushbutton status
     
    void setup() {
      // initialize the LED pin as an output:
      pinMode(ledPin, OUTPUT);
      // initialize the pushbutton pin as an input:
      pinMode(buttonPin, INPUT);
    }
     
    void loop() {
      // read the state of the pushbutton value:
      buttonState = digitalRead(buttonPin);
     
      // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
      if (buttonState == HIGH) {
        // turn LED on:
        digitalWrite(ledPin, HIGH);
      } else {
        // turn LED off:
        digitalWrite(ledPin, LOW);
      }
    }

  6. #6
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    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 : 1 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Bonjour Mohamed

    Le problème est que la fonction de Stepper.h Mon_moteur.step(nb_pas) est dite bloquante (comme delay(mmmm);), c'est à dire que pendant son exécution, l'Arduino ne peut rien faire d'autre, donc ne peut pas lire l'état de BP1 ou de BP2.
    Il te faut une bibliothèque qui t'offre la possibilité de gérer ton moteur et de lire tes boutons, avec une fonction non-bloquante.
    Ceci se fait avec AccelStepper.h, ainsi:
    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
     
     #include <AccelStepper.h>
     AccelStepper Mon_moteur(4, 8, 10, 9, 11);     // https://www.arduino.cc/reference/en/libraries/accelstepper/ 
                                                   // https://www.pjrc.com/teensy/td_libs_AccelStepper.html
     int monMotVitesse = 0;
     
     const int BP1=2;
     const int BP2=3;
     const int led=4;
     
     void setup() 
     {
    	pinMode(led,OUTPUT);
    	pinMode(BP1,INPUT);
    	pinMode(BP2,INPUT);
     
    	Mon_moteur.setMaxSpeed(600);
     }
     
     void loop() 
     {
    	 if (digitalRead(BP1) == HIGH)
    	 {
    		 monMotVitesse = 600;          // Marche CW (sens des aiguilles d'une montre)
    	 } 
    	 else if (digitalRead(BP2) == HIGH)
    	 {
    		 monMotVitesse = -300;          // Marche CCW (sens contraire des aiguilles d'une montre)
    	 }
    	 else
    	 {
    		 monMotVitesse = 0;             // Arrêt
    	 }
     
    	if (monMotVitesse != 0)             // Si un bouton est pressé
    	{
    		digitalWrite(led,HIGH);
    		Mon_moteur.setSpeed(monMotVitesse);
    		Mon_moteur.runSpeed();		
    	}
    	else
    	{
    		digitalWrite(led,LOW);
    	}
     }
    Tu remarquera que AccelStepper est actualisé en permanence dans loop() (Mon_moteur.runSpeed();), afin de réagir à tout changement des boutons BP1 et BP2.
    Do bons renseignements sur AccelStepper, ici.

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

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 84
    Points : 25
    Points
    25
    Par défaut
    Affaire résolu, comme vous l'avez si bien dit<<l'expérience est seule chose qu'il ne faut achèter que d'occasion !>> et merci de me montré cette bibliothèque<<AccelStepper.h>>

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 84
    Points : 25
    Points
    25
    Par défaut Commande d'un servomoteur moteur avec 2 boutons poussoirs
    Bonjour JPBBRICOLE, je c'est pas si j'ai bien fait de passer par la petite fenêtre de venir directement à toi mais, je rencontre un problèmes sur se programme de commande d'un servomoteur.
    Je veux faire bouger le servomoteur dans le sens horaire et antihoraire avec deux boutons poussoirs. Sens horaire quand le bouton1 est appuyé et maintenu et quand on le relâche il s'arrête et pareille pour le bouton2 dans le sens antihoraire.

    Quand j'ai test mon code pour la première fois mon servomoteur a bouger dans les deux sens mais difficilement et quand j'ai débranché et rebrancher a nouveau mon servo ne répond plus même quand j'appuie sur les boutons.

    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
    #include <Servo.h>
    Servo Servo1;
    int etat1 = 0;
    int angle = 0;
    int etat2 = 0;
    int const bouton1 = 3;
    int const bouton2 = 4;
    int const pinServo = 9;  
    void setup() {
      Serial.begin(9600);
      pinMode(bouton1,INPUT);
      pinMode(bouton2,INPUT);
      Servo1.attach(pinServo);
      // put your setup code here, to run once:
     
    }
     
    void loop() {
      //digitalWrite(8,HIGH);
      etat1 = digitalRead(bouton1);
      etat2 = digitalRead(bouton2);
      if(etat1==1 && etat2==0)
      {
       Servo1.write(angle);
       angle = angle+1;
      }
        if(etat1==0 && etat2==1)
      {
       Servo1.write(angle);
       angle = angle-1;
      }
        if(etat1==0 && etat2==0)
      {
       Servo1.write(angle);
      }
      delay(5);
      // put your main code here, to run repeatedly:
    }
    void constraint()
    {
      if(angle < 1)
      {
        angle = 0;
      }
      if(angle > 179)
      {
        angle = 180;
      }
    }

  9. #9
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    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 : 1 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Bonjour Mohamed

    Citation Envoyé par Fadiga Mohamed fode Voir le message
    je c'est pas si j'ai bien fait de passer par la petite fenêtre de venir directement à toi mais...
    Pas de soucis, je regarde et te redis.

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

  10. #10
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    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 : 1 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Bonjour Mohamed

    Voilà, j'ai un peu, "chamboulé" ton programme et j'y ai ajouté 3 variables pour le rendre plus pratique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int angleAvance = 5;                // De combien de degrés on avance chaque fois
    int angleChangeTempo = 100;         // Donne le rythme de changement
    const int anglePositionDepart = 90;
    Je n'ai, malheureusement, pas le temps de détailler le pourquoi de ta version ne fonctionne pas bien. Je te laisse, par contre, jouer au jeux des 7 différence entre ta version et la mienne, c'est, aussi, un façon d'apprendre.

    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
    #include <Servo.h>
    Servo Servo1;
     
    int etat1 = 0;
    int angle = 0;
    int etat2 = 0;
    int const bouton1 = 3;
    int const bouton2 = 4;
    int const pinServo = 9;
     
    int angleAvance = 5;                // De combien de degrés on avance chaque fois
    int angleChangeTempo = 100;         // Donne le rythme de changement
    const int anglePositionDepart = 90;
     
    void setup() {
    	Serial.begin(9600);
    	pinMode(bouton1,INPUT);
    	pinMode(bouton2,INPUT);
    	Servo1.attach(pinServo);
     
    	angle = anglePositionDepart;
    	Servo1.write(angle);
    	// put your setup code here, to run once:
     
    }
     
    void loop() {
    	//digitalWrite(8,HIGH);
    	etat1 = digitalRead(bouton1);
    	etat2 = digitalRead(bouton2);
     
    	if(etat1 == HIGH)     // Si bouton1 pressé
    	{
    		angle -= angleAvance;   // Sens horaire (CW)
    		angle = constrain(angle, 0, 180);  //https://www.arduino.cc/reference/en/language/functions/math/constrain/
    		Servo1.write(angle);
    	}
    	if(etat2 == HIGH)
    	{
    		angle += angleAvance;   // Sens anti-horaire (CCW)
    		angle = constrain(angle, 0, 180);
    		Servo1.write(angle);
    	}
    	if(etat1 == HIGH && etat2 == HIGH)     // Retour à la position de départ (anglePositionDepart)
    	{
    		angle = anglePositionDepart;
    		angle = constrain(angle, 0, 180);
    		Servo1.write(angle);
    	}
    	delay(angleChangeTempo);
    	// put your main code here, to run repeatedly:
     
    	// Pour debugger
    	//Serial.print("Bouton1 :\t"); Serial.println(etat1);
    	//Serial.print("Bouton2 :\t"); Serial.println(etat2);
    	//Serial.print("Angle :\t"); Serial.println(angle);
    }
    On pourrait le structurer un peu plus, mais ce sera une prochaine étape, si tu le veux bien.

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

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 84
    Points : 25
    Points
    25
    Par défaut
    il y'avait une partie que j'avais pas pris en compte dans mon programme qui faisait le dysfonctionnement de mes boutons
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      pinMode(bouton1,INPUT_PULLUP);
      pinMode(bouton2,INPUT_PULLUP);
    Ton programme aussi fonctionne mais par contre quand j'appuie un BP le Servo bouge dans un sens, dès que je relâche le BP le Servo revient encore a sa position initiale.

    Si je veux utiliser 3 Servo dans le meme programme (Servo1,Servo2 et Servo3) et qui doivent fonctionné indépendamment comment je vais pouvoir combiner les 3 Servo ?
    sachant que chaque Servo a 2 BP. ex: Servo1 BP1-BP2; Servo2 BP3-BP4 et Servo3 BP5-BP6

  12. #12
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    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 : 1 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Bonsoir Momahed

    J'avais bien pensé que tu avais oublié les PULL_UP , J'en avais déduit que tu avais mis des résistances en PULL_DOWN.
    Donc, avec des PULL_UP, tu dois lire les boutons ainsi, vu que tes boutons ont leur commun à GND:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if(etat1 == LOW)
    if(etat2 == LOW)
    if(etat1 == LOW && etat2 == LOW)
    J'ai oublié de te dire, dans ma version, si tu presses les 2 boutons en même temps le servo retourne à anglePositionDepart.

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

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 84
    Points : 25
    Points
    25
    Par défaut
    OK j'ai compris.
    Si je veux utiliser 3 Servo dans le meme programme (Servo1,Servo2 et Servo3) et qui doivent fonctionné indépendamment comment je vais pouvoir combiner les 3 Servo ?
    sachant que chaque Servo a 2 BP. ex: Servo1 BP1-BP2; Servo2 BP3-BP4 et Servo3 BP5-BP6

  14. #14
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    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 : 1 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Bonjour Mohamed

    Avec 3 servos ou plus, c'est dans ce cas qu'il faut restructurer ton programme, je te fais un exemple dans le courant de la journée.

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

  15. #15
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    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 : 1 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Bonjour Bonjour Mohamed

    J'ai un peu remanié ton programme afin qu'il soit plus facilement extensible. Actuellement il y a 3 servos donc 6 boutons.
    Pour aller plus loin, il te faudra une extension de ports, comme le MCP23017 pour les boutons ainsi qu'une extension de ports PWM, comme le PCA9685 pour les servos.

    Ce "remaniement" est basé sur la mise en tableaux des pin des servo et des pin des boutons. Le programme est plus "simple" à lire, mais un peu plus difficile à appréhender, si tu n'a pas beaucoup pratiqué les tableaux. Pour ajouter un servo, il suffit d'ajouter quelques chiffres dans les tableaux et le tour est joué. . Un petit coup d'oeil ici peut t'éclairer.
    Tu verras qu'il n'y a plus qu'une fonction avec paramètres (void servoPositionChange(int servoIndex, int positionIncrement)) pour commander les servos.
    Mets ta console à 9600, il y a des indications qui s'affichent.

    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
    #include <Servo.h>
     
    //------------------------------------- Numérotation des servo
    #define servoNombre 3
    //enum servosIndex {servo1, servo2, servo3, btnHome, btnGo, btnNombre};
    const int servosPin[]	= {9, 10, 11};  // Pin PWM
    Servo Servo[servoNombre];     // Création des servo, en tableau
    int servosAngle[servoNombre];  // Mémoire des angles
     
    //------------------------------------- Numérotation des boutons
    #define boutonsNombre servoNombre * 2     // 2 boutons par servo
    // Mise en tableau les pin des boutons
    int const boutonsPin[]	= {3, 4, 5, 6, 7, 8};
     
    const int boutonEtatPresse = LOW;   // Etat lu d'un bouton pressé
    int angleAvance = 5;                // De combien de degrés on avance chaque fois
    int angleChangeTempo = 100;         // Donne le rythme de changement
    const int anglePositionDepart = 90;
     
    void setup() {
    	Serial.begin(9600);
    	delay(500);
    	//--------------------------------- Initialisation des servos
    	Serial.println("\nInitialisation des servos");
    	for (int s = 0; s < servoNombre; s ++)
    	{
    		Servo[s].attach(servosPin[s]);
    		servosAngle[s] = anglePositionDepart;     // Tout les servos en position de départ
    		servoPositionChange(s, 0);
    	}
    	Serial.println("");
     
    	//--------------------------------- Initialisation des boutons
    	for (int b = 0; b < boutonsNombre; b ++)
    	{
    		pinMode(boutonsPin[b], INPUT_PULLUP);    // Résistances interne donc boutons "contre" GND
    	}
    }
     
    void loop() {
     
    	for (int s = 0; s < servoNombre; s ++)     // Lecture de tout les boutons
    	{
    		if(digitalRead(boutonsPin[s*2]) == boutonEtatPresse)     // Si bouton sens CW est pressé
    		{
    			servoPositionChange(s, -angleAvance);
    		}
    		if(digitalRead(boutonsPin[(s*2) +1]) == boutonEtatPresse)     // Si bouton sens CCW est pressé
    		{
    			servoPositionChange(s, angleAvance);
    		}
    	}
     
    	delay(angleChangeTempo);
    }
     
     
    /*---------------------------------------------------------------------------------------
    	Calcule et contrôle de la nouvelle position
        déplacement du servo
    '*---------------------------------------------------------------------------------------
    */
    void servoPositionChange(int servoIndex, int positionIncrement)
    {
    	servosAngle[servoIndex] += positionIncrement;
    	servosAngle[servoIndex] = constrain(servosAngle[servoIndex], 0, 180);  //https://www.arduino.cc/reference/en/language/functions/math/constrain/
    	Servo[servoIndex].write(servosAngle[servoIndex]);
     
    	Serial.println("Servo " + String(servoIndex +1) + "\tangle\t" + String(servosAngle[servoIndex]));
    }
    Si ce programme peut t'inspirer pour la suite, j'en serai très heureux.
    Je reste à ta disposition.

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

  16. #16
    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
    Attention à ne pas alimenter 3 servos directement depuis la pin 5V de l'Arduino (ils peuvent tirer beaucoup de courant, trop pour la carte)

    (il semble manquer un point virgule à la fin d'une ligne et au lieu de +1 ou -1 il faudrait sans doute utiliser angleAvance - c'est bien de laisser un peu de boulot à Mohamed )

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 84
    Points : 25
    Points
    25
    Par défaut
    OK JAY M je prend note de sa et JPBBRICOLE en attendant que je trouve ces modules je vais essayé d'apprendre un peu sur eux

  18. #18
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    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 : 1 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Salut Jay M
    Citation Envoyé par Jay M Voir le message
    (il semble manquer un point virgule à la fin d'une ligne et au lieu de +1 ou -1 il faudrait sans doute utiliser angleAvance)
    J'admire ta sagacité, maudites modifications faites dans la précipitation

    Citation Envoyé par Jay M Voir le message
    c'est bien de laisser un peu de boulot à Mohamed
    Par la livraison du "tout fait", j'espère surtout titiller l'imagination de Mohamed .

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

  19. #19
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 84
    Points : 25
    Points
    25
    Par défaut
    J'admire votre complot mais, je vais m'en sortir😰😰😰.

  20. #20
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 84
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par Jay M Voir le message
    (il semble manquer un point virgule à la fin d'une ligne )
    j'ai pas encore trouver ou mettre ce point virgule(!!!

    Citation Envoyé par Jay M Voir le message
    ( et au lieu de +1 ou -1 il faudrait sans doute utiliser angleAvance - * )
    *

    quand je téléverse le programme sur la carte, la LED Rx ne cesse pas de clignoter et tous les servos se positionnent. quand j'appuis sur n'importe quel boutons les servos ne bougent pas, alors que mais boutons sont contre le GND.
    Quand j'insiste en faisant plus de manipulation sur les boutons un seul servo se met a bouger mais difficilement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if(digitalRead(boutonsPin[(s*2) -angleAvance]) == boutonEtatPresse)     // Si bouton sens CW est press
        {
          servoPositionChange(s, -angleAvance);
        }
        if(digitalRead(boutonsPin[(s*2) +angleAvance]) == boutonEtatPresse)     // Si bouton sens CCW est pressé
        {
          servoPositionChange(s, angleAvance);
        }

Discussions similaires

  1. Réponses: 0
    Dernier message: 17/07/2018, 11h42
  2. Basculer l'état d'une Led avec boutons poussoirs
    Par Silk7499 dans le forum Arduino
    Réponses: 8
    Dernier message: 25/05/2016, 23h25
  3. Problème d'animation avec ActionBar, mais pas avec bouton
    Par Heavy Metal Hero dans le forum Composants graphiques
    Réponses: 2
    Dernier message: 31/10/2013, 12h00
  4. $_GET marche pas avec bouton image
    Par bob633 dans le forum Langage
    Réponses: 5
    Dernier message: 04/03/2010, 16h09
  5. [xhtml][css] bouton du form ne marche pas avec IE6
    Par chinouk dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 14/06/2005, 14h00

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