-         

Ergebnis 1 bis 2 von 2

Thema: 2 Stepper laufen nicht gleichzeitig

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    235

    2 Stepper laufen nicht gleichzeitig

    Anzeige

    Hallo,

    ich versuche 2 Stepper nacheinander anzusteuern und wenn ich M2 durch ein LOW an PIN 2 stoppe, soll M3 laufen bis erneut ein LOW an PIN 2 erschient. Das ist der Code dazu

    Code:
    #include <CustomStepper.h>   //Libraryaufruf
    
    CustomStepper stepperM2(4, 5, 6, 7);   // Wahl der Ausgänge für den Schrittmotor
    CustomStepper stepperM3(8, 9, 10, 11);   // Wahl der Ausgänge für den Schrittmotor
    
    boolean M2solldrehen = false;       // Variable, die bei true den Motor stoppt; kann beliebig heißen
    boolean M3solldrehen = false;
    boolean JustPin;       // Variable für STOP , wenn LOW
    float lzahn2_alt;            // Ausfahrlänge von Zahnstange 2 nach Justierung   98
    float lzahn3_alt;            // Ausfahrlänge von Zahnstange 3 nach Justierung     68
    
    
    int Motorwahl = 2;         // Festlegung welcher Motor justiert werden soll
    
    
    void setup()
    {
      Serial.begin (250000);
      while (!Serial);
    
      pinMode (2, INPUT);
      digitalWrite(2, HIGH);   //schaltet den PullUp-Widerstand ein
    
      stepperM2.setRPM(6);    //  Wahl der Umdrehungen pro Minute
      stepperM3.setRPM(12);
    
      stepperM2.setSPR(4096);      //Original =  4075.7728395;   Wahl der Schritte pro Wellenumdrehung
      stepperM3.setSPR(4096);
    
    }
    
    void loop() {
    
      JustPin = digitalRead(2);   // übernimmt den Status von PIN 2
    
    
      //******************** Motor 2 ************************************************************
    
      if (stepperM2.isDone() && M2solldrehen == false && Motorwahl == 2 ) {    // einleiten des Vorgangs an die Library  && Motorwahl == 2
    
        stepperM2.setDirection(CW);          // Zahnstange2  einfahren
    
        stepperM2.rotateDegrees(5);         //ergibt eine kurze Lauflänge der Zahnstange
    
        if ( JustPin == LOW) {  //  bei LOW Motor STOP;    LOW wegen internem PullUp-Widerstand
          M2solldrehen = true;    // stoppt den Motor
          Motorwahl = 3;       //  wählt nun Motor 3
     
        }
    
      }
    
    
      //******************** Motor 3 ************************************************************
    
      Serial.print ("Motorwahl = ");
      Serial.println (Motorwahl);
    
      if (stepperM3.isDone() && M3solldrehen == false && Motorwahl == 3) {    // einleiten des Vorgangs an die Library
    
        Serial.println ("hier");
    
        stepperM3.setDirection(CCW);          // Zahnstange2  einfahren
    
        stepperM3.rotateDegrees(5);        //ergibt eine kurze Lauflänge der Zahnstange
    
        if ( JustPin == LOW) {  //  bei LOW Motor STOP;     LOW wegen internem PullUp-Widerstand
          M3solldrehen = false;    // stoppt den Motor
          //     Motorwahl = 3;       //  wählt nun Motor 3
    
        }
      }  
    
      stepperM2.run();          // muss unbedingt sein
      stepperM3.run();          // muss unbedingt sein
    }
    Wenn ich den Teil für M3 unwirksam mache, läuft M2 und umgekehrt. Aber das volle Programm nicht.
    Dann wird nur 1 x Pin 4 auf HIGH gesetzt, die Konsole druckt "Motorwahl = 2" , aber nur 1 x und das war's.
    d.h. doch, dass das Programm nicht mehr läuft!?


    Wieso klappt das in dem folgenden Beispiel mit 2 Motoren und im Original ja sogar mit 4en?

    Code:
    #include <CustomStepper.h>
    
    
    CustomStepper stepper_VL(4, 5, 6, 7);
    //CustomStepper stepper_HL(8,9,10,11);
    CustomStepper stepper_HR(8, 9, 10, 11);
    //CustomStepper stepper_VR(46, 48, 50, 52);
    
    
    boolean rotate_li;
    boolean rotate_deg_li;
    boolean rotate_re;
    boolean rotate_deg_re;
    boolean vorwaerts;
    boolean rueckwaerts;
    
    void setup()
    {
    
      rotate_li = false;
      rotate_deg_li = false;
      rotate_re = false;
      rotate_deg_re = false;
      vorwaerts = false;
      rueckwaerts = false;
    
    
    }
    
    void loop()
    {
    
      if (stepper_VL.isDone() &&  rueckwaerts == false)
      {
        alle_stepper_rueckwaerts();
    
      }
    
      if (stepper_VL.isDone() &&  rueckwaerts == true && rotate_li == false)
      {
        rotieren_links();
      }
    
      if (stepper_VL.isDone() &&  rotate_li == true && vorwaerts == false)
      {
        alle_stepper_vorwaerts();
    
      }
    
      if (stepper_VL.isDone() &&  vorwaerts == true && rotate_re == false)
      {
        rotieren_rechts();
      }
    
      if (stepper_VL.isDone() &&  rotate_re == true && vorwaerts == true)
      {
        alle_stepper_vorwaerts();
      }
    
      stepper_VL.run();
      //  stepper_HL.run();
      stepper_HR.run();
      //  stepper_VR.run();
    
    }
    
    /***********************************************************/
    
    void alle_stepper_vorwaerts()
    {
      stepper_VL.setRPM(12);
      //  stepper_HL.setRPM(12);
      stepper_HR.setRPM(12);
      //  stepper_VR.setRPM(12);
    
      stepper_VL.setSPR(4075.7728395);
      //  stepper_HL.setSPR(4075.7728395);
      stepper_HR.setSPR(4075.7728395);
      //  stepper_VR.setSPR(4075.7728395);
    
      stepper_VL.setDirection(CW);
      stepper_VL.rotate(2);
      //  stepper_HL.setDirection(CW);
      //  stepper_HL.rotate(2);
      stepper_HR.setDirection(CW);
      stepper_HR.rotate(2);
      //   stepper_VR.setDirection(CW);
      //   stepper_VR.rotate(2);
      vorwaerts = true;
    }
    
    void alle_stepper_rueckwaerts()
    {
      stepper_VL.setRPM(12);
      //  stepper_HL.setRPM(12);
      stepper_HR.setRPM(12);
      //  stepper_VR.setRPM(12);
    
      stepper_VL.setSPR(4075.7728395);
      //  stepper_HL.setSPR(4075.7728395);
      stepper_HR.setSPR(4075.7728395);
      //  stepper_VR.setSPR(4075.7728395);
    
      stepper_VL.setDirection(CCW);
      stepper_VL.rotate(2);
      //  stepper_HL.setDirection(CCW);
      //  stepper_HL.rotate(2);
      stepper_HR.setDirection(CCW);
      stepper_HR.rotate(2);
      //    stepper_VR.setDirection(CCW);
      //    stepper_VR.rotate(2);
      rueckwaerts = true;
    }
    
    void rotieren_links()
    {
      stepper_VL.setRPM(12);
      //  stepper_HL.setRPM(12);
      stepper_HR.setRPM(12);
      //  stepper_VR.setRPM(12);
    
      stepper_VL.setSPR(4075.7728395);
      //  stepper_HL.setSPR(4075.7728395);
      stepper_HR.setSPR(4075.7728395);
      //  stepper_VR.setSPR(4075.7728395);
    
      stepper_VL.setDirection(CCW);
      stepper_VL.rotate(2);
      //  stepper_HL.setDirection(CCW);
      //  stepper_HL.rotate(2);
      stepper_HR.setDirection(CW);
      stepper_HR.rotate(2);
      //    stepper_VR.setDirection(CW);
      //    stepper_VR.rotate(2);
      rotate_li = true;
    }
    
    
    void rotieren_rechts()
    {
      stepper_VL.setRPM(12);
      //  stepper_HL.setRPM(12);
      stepper_HR.setRPM(12);
      //  stepper_VR.setRPM(12);
    
      stepper_VL.setSPR(4075.7728395);
      //  stepper_HL.setSPR(4075.7728395);
      stepper_HR.setSPR(4075.7728395);
      //  stepper_VR.setSPR(4075.7728395);
    Gruß fredyxx

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    235
    Hallo,

    ich habe 2 Lösungen gefunden, vermag aber nicht zu sagen, ob die einigermaßen elegant sind.
    Ich kann auch nicht erklären, wieso die obige Version nicht funktioniert.

    Eine wesentliche Änderung ist, dass der Befehl " stepperM3.run();" erst dann durchlaufen werden darf, wenn die Aktion von Motor 2 beendet ist !!

    Gruß

    fredyxx

Ähnliche Themen

  1. Code läuft nicht feherfrei, bitte um Hilfe! Input Capture und UART nicht gleichzeitig
    Von Accenter im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 14
    Letzter Beitrag: 04.06.2013, 21:00
  2. Zwei Schleifen gleichzeitig laufen lassen
    Von hendrik87 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 13.10.2007, 01:19
  3. Programme laufen nicht
    Von dominik66 im Forum Asuro
    Antworten: 9
    Letzter Beitrag: 08.10.2006, 21:21
  4. Bekomme ISP nicht zum laufen.
    Von FoCus im Forum AVR Hardwarethemen
    Antworten: 11
    Letzter Beitrag: 02.02.2006, 08:27
  5. Mehrere Programme gleichzeitig laufen lassen geht nicht.
    Von mesli-andres im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 23
    Letzter Beitrag: 11.06.2005, 22:29

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •