Positionnement moteur pas à pas avec des contact

Portrait de lamy971

Bonjour,

  Voilà je voudrai pouvoir positionner un moteur pas à pas nema17 sur un nombre de pas précis après avoir appuyer sur un contact. J'ai déjà câblé ma plaque d'essais avec un EasyDriver et un NANO. J'ai déjà une partie de mon code qui fonctionne mais quand je rajoute mes 4 contacts pour 4 positions différente cela ne fonctionne plus. Merci pour votre aide. 

Portrait de lamy971

bon j'y suis presque

Portrait de lamy971

j'y suis presque

Portrait de Anonyme

Je n'ai pas le temps ce WE je verrais cela plus tard désolé !

Portrait de lamy971

Il n’y a pas de soucis... passes un bon WEEK-END 

Portrait de lamy971

#include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x27, 16, 2); // Si l'adresse 0x27 par celle trouvé par le scan !
                                        // Raccorder SCL sur A5 et SDA sur A4 entre le module LCD et l'Arduino
    int Vitesse ;//nombre de pas par seconde
    unsigned long InterStep;
    int Step = 2, Dir = 3, Ena = 4, Zero = 9, BP1 = 14, BP2 = 15, BP3 = 16, BP4 = 17, Pas, X, XPos;
    bool Etat;
    String Distance;

    void setup() {
      Serial.begin(9600);
      pinMode(Dir,  OUTPUT);
      pinMode(Step, OUTPUT);
      pinMode(Ena,  OUTPUT);
      pinMode(Zero, INPUT_PULLUP);
      pinMode(BP1,  INPUT_PULLUP);
      pinMode(BP2,  INPUT_PULLUP);
      pinMode(BP3,  INPUT_PULLUP);
      pinMode(BP4,  INPUT_PULLUP);
      pinMode(Ena,  OUTPUT);
      digitalWrite(Dir, LOW);
      lcd.init();
      lcd.backlight();
      lcd.setCursor(2, 0);
      lcd.print("Recherche du ");
      lcd.setCursor(3, 1);
      lcd.print("point Zero ");
      Serial.println("Recherche du point Zero");
      PointZero();
      Serial.println();
      Serial.println();
      lcd.clear();
      lcd.setCursor(1, 0);

      lcd.print("Le point zero");
      lcd.setCursor(1, 1);

      lcd.print("est initialise");
      delay(3000);
      
      Serial.println("Le point zero est initialisé");
      Messages();
    }

    void loop() {

      if (Serial.available() > 0) {
        int CibleX = Serial.parseInt();
        Serial.readString();
        if ( CibleX < 0 || CibleX > 100000) {
          lcd.clear();
          lcd.setCursor(0, 0);

          lcd.print("La valeur est");
          lcd.print(CibleX);
          lcd.setCursor(1, 1);

          lcd.print("non autorisee");
          Serial.println("La valeur " + String(CibleX) + " n'est pas autorisée");
          Messages();
        }
        else
          PositionX(CibleX, 3000,"200");//VALEUR DE LA VITESSE DANS LE MONITEUR SERIE 

      }
      if (digitalRead(BP1) == LOW)
        PositionX(800, 3000,"50 cm");// PositionX( POSTION, VITESSE en pas par seconde)1cm pour 400pas
      if (digitalRead(BP2) == LOW)
        PositionX(4800, 3000,"60 cm");
      if (digitalRead(BP3) == LOW)
        PositionX(20800, 3000,"100 cm");
      if (digitalRead(BP4) == LOW)
        PositionX(32000, 3000,"150 cm");

    }

    void Messages() {
      Serial.println();
      Serial.println();

      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Valeur 0<>100000");
      lcd.setCursor(2, 1);
      lcd.print("  Ou Bp 1 a 4");

      Serial.println("Entrez une Valeur entre 0 et 100000");
      Serial.println();
      Serial.println("Ou appuyez sur un Bouton Poussoir");
    }

    void PositionX( int CibleX, int vitesse, String Distance) {
      Etat = 1;

      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Position "+Distance);
      //lcd.print(CibleX);
      lcd.setCursor(0, 1);
      lcd.print( "aller a " + Distance  );

      Serial.println("Le point " +Distance + " est demande");
      digitalWrite(Ena, LOW);
      InterStep = 1000000 / vitesse;
      if (CibleX - XPos < 0) {
        digitalWrite(Dir, LOW);
        Pas = -1;
      }
      else {
        digitalWrite(Dir, HIGH);
        Pas = 1;
      }

      while (XPos != CibleX) {
        XPos += Pas;
        digitalWrite(Step, Etat);
        Etat = !Etat;
        delayMicroseconds(InterStep );
        digitalWrite(Step, Etat);
        Etat = !Etat;
        delayMicroseconds(InterStep );
      }
      // digitalWrite(Ena, HIGH);
     
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Position "+Distance);
      lcd.print(XPos);
      lcd.setCursor(0, 1);
      lcd.print("  est ok");//atteinte
     
      Serial.println();
      Serial.println("Le point " +Distance + " est atteint");
      for (int n = 0; n < 4; n++)
        Serial.println();
      delay(4000);
      Messages();
    }

    void PointZero() {

      digitalWrite(Ena, LOW);
      Vitesse = 3000; 
      InterStep = 1000000 / Vitesse;
      digitalWrite(Dir, LOW);
      while (digitalRead(Zero) == HIGH) {
        digitalWrite(Step, Etat);
        Etat = !Etat;
        delayMicroseconds(InterStep);
        digitalWrite(Step, Etat);
        Etat = !Etat;
        delayMicroseconds(InterStep);
      }
      XPos = 0;
    }

Portrait de lamy971

Bonjour,

J'aurai besoin encore un peu de ton aide quand tu auras le temps. J'ai mis en forme mon "slider" sur un rail de 2m de long et quand j'ai voulu calibrer mes longueurs je me suis aperçu que je n'arrivais pas à dépasser les 32000 pas même avec le moniteur série. Je n'arrive donc pas à ma position 150 cm. je compte environ 400 pas par centimètre. je t'ai mis le dernier code. 

Merci d'avance

Portrait de Anonyme

Remplace :

void PositionX( int CibleX, int vitesse, String Distance) {

par

void PositionX( unsigned long CibleX, int vitesse, String Distance) {

Portrait de lamy971

Merci à toi

Portrait de Anonyme

De rien c'est par ce que tu avais limité à 10000 dans ton premier code et comme j'ignorais la destination de ton projet ...

Portrait de lamy971

Bonjour, Désolé j'étais en déplacement... je reviens vers toi parceque je n'arrive toujours pas à dépasser 32000 pas moteur avec mon code, j'ai remplacé la ligne de code que tu m'as donné. Cela ne fonctionne pas non plus avec le moniteur série. Voilà ce qu'il m'affiche:  img_3846.jpg

Portrait de lamy971

Merci d'avance

Portrait de Anonyme

Voilà le code testé jusqu'à 1 000 000 !

if ( CibleX < 0 || CibleX > 100000) {

C'est toi qui impose une limite entre 0 et 100000 !!!! C'est corrigé !

    #include <Wire.h>
        #include <LiquidCrystal_I2C.h>
        LiquidCrystal_I2C lcd(0x27, 16, 2); // Si l'adresse 0x27 par celle trouvé par le scan !
                                            // Raccorder SCL sur A5 et SDA sur A4 entre le module LCD et l'Arduino
        int Vitesse ;//nombre de pas par seconde
        unsigned long InterStep;
        int Step = 2, Dir = 3, Ena = 4, Zero = 9, BP1 = 14, BP2 = 15, BP3 = 16, BP4 = 17, Pas, X, XPos;
        bool Etat;
        String Distance;

        void setup() {
          Serial.begin(9600);
          pinMode(Dir,  OUTPUT);
          pinMode(Step, OUTPUT);
          pinMode(Ena,  OUTPUT);
          pinMode(Zero, INPUT_PULLUP);
          pinMode(BP1,  INPUT_PULLUP);
          pinMode(BP2,  INPUT_PULLUP);
          pinMode(BP3,  INPUT_PULLUP);
          pinMode(BP4,  INPUT_PULLUP);
          pinMode(Ena,  OUTPUT);
          digitalWrite(Dir, LOW);
          lcd.init();
          lcd.backlight();
          lcd.setCursor(2, 0);
          lcd.print("Recherche du ");
          lcd.setCursor(3, 1);
          lcd.print("point Zero ");
          Serial.println("Recherche du point Zero");
          PointZero();
          Serial.println();
          Serial.println();
          lcd.clear();
          lcd.setCursor(1, 0);

          lcd.print("Le point zero");
          lcd.setCursor(1, 1);

          lcd.print("est initialise");
          delay(300);
          
          Serial.println("Le point zero est initialisé");
          Messages();
        }

        void loop() {

          if (Serial.available() > 0) {
            unsigned long CibleX = Serial.parseInt();
            Serial.readString();
            if ( CibleX < 0 || CibleX > 1000000) {
              lcd.clear();
              lcd.setCursor(0, 0);

              lcd.print("La valeur est");
              lcd.print(CibleX);
              lcd.setCursor(1, 1);

              lcd.print("non autorisee");
              Serial.println("La valeur " + String(CibleX) + " n'est pas autorisée");
              Messages();
            }
            else
              PositionX(CibleX, 3000,String(CibleX));//VALEUR DE LA VITESSE DANS LE MONITEUR SERIE

          }
          if (digitalRead(BP1) == LOW)
            PositionX(800, 3000,"50 cm");// PositionX( POSTION, VITESSE en pas par seconde)1cm pour 400pas
          if (digitalRead(BP2) == LOW)
            PositionX(4800, 3000,"60 cm");
          if (digitalRead(BP3) == LOW)
            PositionX(20800, 3000,"100 cm");
          if (digitalRead(BP4) == LOW)
            PositionX(32000, 3000,"150 cm");

        }

        void Messages() {
          Serial.println();
          Serial.println();

          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Valeur 0<>1000000");
          lcd.setCursor(2, 1);
          lcd.print("  Ou Bp 1 a 4");

          Serial.println("Entrez une Valeur entre 0 et 1000000");
          Serial.println();
          Serial.println("Ou appuyez sur un Bouton Poussoir");
        }

        void PositionX( int CibleX, int vitesse, String Distance) {
          Etat = 1;

          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Position "+Distance);
          //lcd.print(CibleX);
          lcd.setCursor(0, 1);
          lcd.print( "aller a " + Distance  );

          Serial.println("Le point " +Distance + " est demande");
          digitalWrite(Ena, LOW);
          InterStep = 1000000 / vitesse;
          if (CibleX - XPos < 0) {
            digitalWrite(Dir, LOW);
            Pas = -1;
          }
          else {
            digitalWrite(Dir, HIGH);
            Pas = 1;
          }

          while (XPos != CibleX) {
            XPos += Pas;
            digitalWrite(Step, Etat);
            Etat = !Etat;
            delayMicroseconds(InterStep );
            digitalWrite(Step, Etat);
            Etat = !Etat;
            delayMicroseconds(InterStep );
          }
          // digitalWrite(Ena, HIGH);
         
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Position "+Distance);
          lcd.print(XPos);
          lcd.setCursor(0, 1);
          lcd.print("  est ok");//atteinte
         
          Serial.println();
          Serial.println("Le point " +Distance + " est atteint");
          for (int n = 0; n < 4; n++)
            Serial.println();
          delay(300);
          Messages();
        }

        void PointZero() {

          digitalWrite(Ena, LOW);
          Vitesse = 3000;
          InterStep = 1000000 / Vitesse;
          digitalWrite(Dir, LOW);
          while (digitalRead(Zero) == HIGH) {
            digitalWrite(Step, Etat);
            Etat = !Etat;
            delayMicroseconds(InterStep);
            digitalWrite(Step, Etat);
            Etat = !Etat;
            delayMicroseconds(InterStep);
          }
          XPos = 0;
        }

Portrait de lamy971

Super ça marche. 

  Merci 

Pages