Partage
  • Partager sur Facebook
  • Partager sur Twitter

aide pour un programme arduino

    28 octobre 2023 à 3:07:30

    j'ai ecrit un programme ,mais il ne fontionne pas comme je veux.

    materiel : arduino uno ,cnc shield v3,un moteurY nema17 connecté au driver A4988,un moteurX nema 23 connecté a un driver TB6600,un bouton poussoir pull down,un batteri 20V 2A.

    ce que je veux : 

    1ére phase : appuis sur le bouton poussoir , le moteur X pour un parcours X ,une fois le parcours effectué , le moteur Y demarre pour un parcour Y ,le deux moteur sonrt a l'arret.

    2 éme phase : appuis sur le bouton poussoir , le moteur Y fait un homing quand celui-ci a atteint la position X alors le moteur Y fait son homing et les moteurs s'arretent (homing = position de départ de la 1 ére phase).

    un autre appuis sur le bouton poussoir dmarrerai la 1ére phase .

    ci apres mon programme.

    (position de départ de la 1 ére phase)

    #include <AccelStepper.h>

    // Créez des objets pour les moteurs X et Y

    AccelStepper stepperX(2, 5, 2);  // driver 2, broche direction = 5, broche pas = 2

    AccelStepper stepperY(2, 6, 3);  // driver 2, broche direction = 6, broche pas = 3

    // Broche pour le bouton

    const int boutonPin = 12;

    // Définir les valeurs de vitesse et d'accélération

    const float vitesseX = 1000.0;

    const float accelerationX = 500.0;

    const float vitesseY = 2000.0;

    const float accelerationY = 2000.0;

    bool homingYDone = false;

    bool homingXDone = false;

    bool boutonRelache = true;

    void setup() {

      // Définir les broches comme sorties pour les moteurs

      stepperX.setMaxSpeed(vitesseX);

      stepperX.setAcceleration(accelerationX);

      stepperY.setMaxSpeed(vitesseY);

      stepperY.setAcceleration(accelerationY);

      stepperX.setCurrentPosition(0);

      stepperY.setCurrentPosition(0);

      // Définir la broche du bouton comme entrée

      pinMode(boutonPin, INPUT_PULLUP);

    }

    void loop() {

    // Lire l'état du bouton

      bool boutonPresse = (digitalRead(boutonPin) == LOW);

      // Attendez que le bouton soit enfoncé

      while (digitalRead(boutonPin) == LOW);

      // Déclenchez le moteur Y pour 10000 pas

      stepperY.move(10000);

      // Tant que le moteur Y n'a pas atteint sa position cible, continuez à le faire avancer

      while (stepperY.distanceToGo() != 0) {

        stepperY.run();

      }

      // Attendez un court instant

      delay(1000);

      // Déclenchez le moteur X pour 14863 pas

      stepperX.move(14863);

      // Tant que le moteur X n'a pas atteint sa position cible, continuez à le faire avancer

      while (stepperX.distanceToGo() != 0) {

        stepperX.run();

      }

     // Arrêtez les moteurs

      stepperX.stop();

      stepperY.stop();

     if (boutonPresse && boutonRelache) {

        // Homing pour le moteur X

        while (!homingXDone) {

          stepperX.moveTo(0);

          stepperX.run();

          if (stepperX.distanceToGo() == 0) {

            homingXDone = true;

          }

        }

        // Homing pour le moteur Y après que le moteur X a terminé

        while (!homingYDone) {

          stepperY.moveTo(0);

          stepperY.run();

          if (stepperY.distanceToGo() == 0) {

            homingYDone = true;

          }

        }

        // Réinitialisation pour préparer un nouveau cycle

        homingXDone = false;

        homingYDone = false;

        stepperX.setCurrentPosition(0);

        stepperY.setCurrentPosition(0);

        boutonRelache = false;

      } else if (!boutonPresse) {

        boutonRelache = true;

      }

    }

    • Partager sur Facebook
    • Partager sur Twitter
      28 octobre 2023 à 15:40:31

      Bonjour, Merci d'indiquer un titre en rapport avec votre problématique.

      Le message qui suit est une réponse automatique activée par un membre de l'équipe de modération. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention.
      Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

      Pour plus d'informations, nous vous invitons à lire les règles générales du forum

      Merci de colorer votre code à l'aide du bouton Code

      Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton Code de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: xml;">Votre code ici</pre>.

      Merci de modifier votre message d'origine en fonction.

      Manque de Politesse

      Votre message ne comporte pas ou peu de formules de politesse (« Bonjour », « Merci », « Au revoir », etc.). Les règles du site exigent que chaque nouveau message comporte un minimum de politesse. Après tout, les gens qui répondent le font gratuitement, sur leur temps libre. Ils méritent bien un minimum de considération, n'est-ce pas ?

      Mauvais titre

      Le titre est un élément important qui ne doit pas être négligé. N'oubliez pas cette règle simple : le titre idéal résume la question que vous allez poser en une petite phrase. Il doit permettre aux visiteurs de se repérer facilement dans le forum visité et d'identifier le sujet à sa seule lecture.

      Vous pouvez utiliser divers préfixes comme [Erreur], [MySQL], [Compatibilité], etc... Aussi, pensez à consulter les règles propres à chaque forum (visibles dans les topics épinglés en haut des sections).

      De plus, choisir un bon titre permet de rendre plus faciles les recherches des autres membres.

      Les titres de type "besoin d'aide" ou "problème" ne sont pas tolérés.

      Merci de modifier votre titre. Pour cela, éditez le premier message de votre sujet.

      (titre originel : aide pour un programme arduino )

      Liens conseillés

      • Partager sur Facebook
      • Partager sur Twitter
        29 octobre 2023 à 21:43:55

        Désolé ,effectivement j'ai completement oublié les bases de politesse.

        bonjour,et vous remerciant d'avance pour me sortir du probléme de programmation qui bloque comletement mon projet.

        Ci aprés le materiel que j'utlise et ce que le programme doit effectuer.

        materiel : arduino uno ,cnc shield v3,un moteurY nema17 connecté au driver A4988,un moteurX nema 23 connecté a un driver TB6600,un bouton poussoir pull down,un batteri 20V 2A.

        ce que  le programme doit executer :

        1ére phase : appuis sur le bouton poussoir , le moteur X pour un parcours X ,une fois le parcours effectué , le moteur Y demarre pour un parcour Y ,le deux moteur sonrt a l'arret.

        2 éme phase : appuis sur le bouton poussoir , le moteur Y fait un homing quand celui-ci a atteint la position X alors le moteur Y fait son homing et les moteurs s'arretent (homing = position de départ de la 1 ére phase).

        un autre appuis sur le bouton poussoir démarrerai la 1ére phase .et aisi de suite.

        Sauf que la premiére phase s'execute puis quand j'appuis a nouveau sur le bouton il reprend la premiére phase et je n'arrive pas a comprendre et donc solutionner le probléme.

        Si une ame charitable pouvait m'aider , par avance , mes remerciements les plus vifs.

        Bonne reception

        #include <AccelStepper.h>
        
        // Créez des objets pour les moteurs X et Y
        
        AccelStepper stepperX(2, 5, 2);  // driver 2, broche direction = 5, broche pas = 2
        
        AccelStepper stepperY(2, 6, 3);  // driver 2, broche direction = 6, broche pas = 3
        
        // Broche pour le bouton
        
        const int boutonPin = 12;
        
        // Définir les valeurs de vitesse et d'accélération
        
        const float vitesseX = 1000.0;
        
        const float accelerationX = 500.0;
        
        const float vitesseY = 2000.0;
        
        const float accelerationY = 2000.0;
        
        bool homingYDone = false;
        
        bool homingXDone = false;
        
        bool boutonRelache = true;
        
        void setup() {
        
          // Définir les broches comme sorties pour les moteurs
        
          stepperX.setMaxSpeed(vitesseX);
        
          stepperX.setAcceleration(accelerationX);
        
          stepperY.setMaxSpeed(vitesseY);
        
          stepperY.setAcceleration(accelerationY);
        
          stepperX.setCurrentPosition(0);
        
          stepperY.setCurrentPosition(0);
        
          // Définir la broche du bouton comme entrée
        
          pinMode(boutonPin, INPUT_PULLUP);
        
        }
        
        void loop() {
        
        // Lire l'état du bouton
        
          bool boutonPresse = (digitalRead(boutonPin) == LOW);
        
          // Attendez que le bouton soit enfoncé
        
          while (digitalRead(boutonPin) == LOW);
        
          // Déclenchez le moteur Y pour 10000 pas
        
          stepperY.move(10000);
        
          // Tant que le moteur Y n'a pas atteint sa position cible, continuez à le faire avancer
        
          while (stepperY.distanceToGo() != 0) {
        
            stepperY.run();
        
          }
        
          // Attendez un court instant
        
          delay(1000);
        
          // Déclenchez le moteur X pour 14863 pas
        
          stepperX.move(14863);
        
          // Tant que le moteur X n'a pas atteint sa position cible, continuez à le faire avancer
        
          while (stepperX.distanceToGo() != 0) {
        
            stepperX.run();
        
          }
        
         // Arrêtez les moteurs
        
          stepperX.stop();
        
          stepperY.stop();
        
         if (boutonPresse && boutonRelache) {
        
            // Homing pour le moteur X
        
            while (!homingXDone) {
        
              stepperX.moveTo(0);
        
              stepperX.run();
        
              if (stepperX.distanceToGo() == 0) {
        
                homingXDone = true;
        
              }
        
            }
        
            // Homing pour le moteur Y après que le moteur X a terminé
        
            while (!homingYDone) {
        
              stepperY.moveTo(0);
        
              stepperY.run();
        
              if (stepperY.distanceToGo() == 0) {
        
                homingYDone = true;
        
              }
        
            }
        
            // Réinitialisation pour préparer un nouveau cycle
        
            homingXDone = false;
        
            homingYDone = false;
        
            stepperX.setCurrentPosition(0);
        
            stepperY.setCurrentPosition(0);
        
            boutonRelache = false;
        
          } else if (!boutonPresse) {
        
            boutonRelache = true;
        
          }
        
        }
        
        


        • Partager sur Facebook
        • Partager sur Twitter
          30 octobre 2023 à 13:26:18

          La méthode loop() de l'arduino, comme son nom l'indique, est une méthode qui se boucle sur elle-même (elle est réappelée à chaque fois qu'elle se termine.


          Ta ligne 55 n'est exécuté qu'à ce moment, quand tu appelles plus tard boutonPresse, il a la valeur résultante de cette ligne.

          A la 1ère boucle, boutonPresse sera à true (si l'entrée est à 0 (bouton non appuyé d'après les commentaires) alors true), et boutonRelache à false; à l'appui, tu sors de ta boucle ligne 59, donc tu poursuis en bougeant ton moteur Y puis ton moteur X.

          On arrive ligne ligne 95, on passe alors en ligne 141, car l'une des 2 variables est false, et comme boutonPresse est à true, on laisse boutonRelache à false.
          On repart au début de loop, sans avoir modifier boutonRelache.
          A aucun moment, au début, tu ne diriges soit sur la 1ere phase, soit sur le homing.

          Pense le programme comme tu l'indiques

          Au début, je suis en phase 0 dans le setup.

          Ensuite dans le loop, j'attends l'appui du bouton. Si j'étais en phase 0, alors je passe à la phase 1; si j'étais en phase 1, alors je passe à la phase 2, si j'étais en phase2, je passe à la phase 1. Chacune des phases devient alors un fonction. 

          • Partager sur Facebook
          • Partager sur Twitter
            30 octobre 2023 à 15:51:01

            Merci beaucoup pour ces commentaires et pour la rapidité de votre réponse.

            Ce que je n'ai pas precisé c'est que je suis novice en programmation et que j'ai ecrit ce programme avec chatgpt et les connaissance que j'ai acquise sur internet.

            Si je comprends bien vos commentaires je dois en ligne 94 indiquer : "boutonPress = true" et BoutonRelache = false"

            je vais essayer ça.

            Merci encore , en esperant avoir compris.

            Re boujour et merci encore pour votre intervention.

            J'ai donc rajouté a la ligne 94 les lignes suivantes :

            boutonRelache = true;

            boutonPresse = false;

            // Attendez que le bouton soit enfoncé

               while (digitalRead(boutonPin) == LOW);

            Et effectivement le homing du moteur X s'effectue,par contre ,en ce qui concerne le homing du moteur Y, je pense qu'il ne fontionne pas car il  tourne dans le meme sens.

            Et evidement , vu mon niveau de connaissance je n'arrive pas a solutionner ce probléme.

            Je suis desole de soliciter a nouveau votre aide.

            je vous joint le programme ainsi modifié en esperant que vous puissiez m'aider a nouveau.

            #include <AccelStepper.h>
            
            // Créez des objets pour les moteurs X et Y
            AccelStepper stepperX(2, 5, 2);  // driver 2, broche direction = 5, broche pas = 2
            AccelStepper stepperY(2, 6, 3);  // driver 2, broche direction = 6, broche pas = 3
            
            // Broche pour le bouton
            const int boutonPin = 12;
            
            // Définir les valeurs de vitesse et d'accélération
            const float vitesseX = 1000.0;
            const float accelerationX = 500.0;
            const float vitesseY = 3000.0;
            const float accelerationY = 3000.0;
            
            bool homingYDone = false;
            bool homingXDone = false;
            bool boutonRelache = true;
            
            void setup() {
              // Définir les broches comme sorties pour les moteurs
              stepperX.setMaxSpeed(vitesseX);
              stepperX.setAcceleration(accelerationX);
              stepperY.setMaxSpeed(vitesseY);
              stepperY.setAcceleration(accelerationY);
              stepperX.setCurrentPosition(0);
              stepperY.setCurrentPosition(0);
              // Définir la broche du bouton comme entrée
              pinMode(boutonPin, INPUT_PULLUP);
            }
            
            void loop() {
            // Lire l'état du bouton
              bool boutonPresse = (digitalRead(boutonPin) == LOW);
            
              // Attendez que le bouton soit enfoncé
              while (digitalRead(boutonPin) == LOW);
            
              // Déclenchez le moteur Y pour 10000 pas
              stepperY.move(10000);
            
              // Tant que le moteur Y n'a pas atteint sa position cible, continuez à le faire avancer
              while (stepperY.distanceToGo() != 0) {
                stepperY.run();
              }
            
              // Attendez un court instant
              delay(1000);
            
              // Déclenchez le moteur X pour 10863 pas
              stepperX.move(10863);
            
              // Tant que le moteur X n'a pas atteint sa position cible, continuez à le faire avancer
              while (stepperX.distanceToGo() != 0) {
                stepperX.run();
              }
            
             // Arrêtez les moteurs
              stepperX.stop();
              stepperY.stop();
              
            boutonRelache = true;
            boutonPresse = false;
            
            // Attendez que le bouton soit enfoncé
               while (digitalRead(boutonPin) == LOW);
             
             if (boutonPresse == false && boutonRelache == true) {
                // Homing pour le moteur X
                while (!homingXDone) {
                  stepperX.moveTo(0);
                  stepperX.run();
                  if (stepperX.distanceToGo() == 0) {
                    homingXDone = true;
                  }
                }
            
                // Homing pour le moteur Y après que le moteur X a terminé
                while (!homingYDone) {
                  stepperY.moveTo(0);
                  stepperY.run();
                  if (stepperY.distanceToGo() == 0) {
                    homingYDone = true;
                  }
                }
              
              
                // Réinitialisation pour préparer un nouveau cycle
                homingXDone = false;
                homingYDone = false;
                stepperX.setCurrentPosition(0);
                stepperY.setCurrentPosition(0);
            
                boutonRelache = false;
              } else if (!boutonPresse) {
                boutonRelache = true;
              }
            }


            -
            Edité par LucLavanant 31 octobre 2023 à 10:10:59

            • Partager sur Facebook
            • Partager sur Twitter
              31 octobre 2023 à 11:21:00

              non, l'idée c'est plutôt de refaire l'algo de la boucle comme ma proposition finale, soit quelque chose comme ça

              ...
              int next_phase=0;
              ...
              void setup(){
              ...
                 next_phase=1;
              ...
              }
              
              void loop(){
                 while(digitalRead(boutonPin)==LOW);
                 switch(phase){
                      case 1:
                             //actions de la phase1
                             phase1(); // par exemple appel d'une fonction qui réalise ces actions
                             next_phase=2
                             break;
                      case 2:
                             // action de la phase 2
                             phase2(); // par exemple
                             next_phase=1;
                             break;
                      }
              }
              ...
              // code des fonctions de phase

              Edit:Pour ta question,  je demanderai pourquoi tu n'utilises pas le même principe que dans la phase 1 ?

              tepperX.moveTo(0);
               
                // Tant que le moteur X n'a pas atteint sa position cible, continuez à le faire avancer
                while (stepperX.distanceToGo() != 0) {
                  stepperX.run();
                }




              -
              Edité par umfred 31 octobre 2023 à 14:11:27

              • Partager sur Facebook
              • Partager sur Twitter

              aide pour un programme arduino

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              • Editeur
              • Markdown