Schleifenunterbrechung funktioniert nicht

Hallo zusammen,

ich bin Arduino-Anfänger und sitze gerade an folgendem Problem. Es geht um die Ansteuerung eines Schrittmotors. Dieser soll nach dem betätigen eines Tasters (PIN 7) seine 2000 Schritte fahren und danach stehen bleiben. Ebenso soll ein weiteres Taster Signal (PIN 5) den Motor in seinem Lauf jederzeit stoppen können.

Nach dem Betätigen des Tasters an Pin 5 startet der Motor wie gewollt, jedoch lässt er sich nicht durch den zweiten Taster stoppen, sondern läuft immer seine volle Schrittzahl ab.

Das Programm soll noch um einen zweiten Motor und weitere Taster und Sensoren ergänzt werden, daher ist einiges auskommentiert. Aber erst einmal sollte diese Abfrage funktionieren, auf der ich dann aufbauen möchte.

#include <Stepper.h>



int SchritteProUmdrehung = 200;
Stepper StepperM1 = Stepper(SchritteProUmdrehung, 10, 11);  // M1 ist der Motor unten rechts
//Stepper = StepperM2(200,12,13); // M2 ist der Motor links oben


void setup() 
{
  StepperM1.setSpeed(100);
  Serial.begin(9600);
  pinMode(5,INPUT_PULLUP); // Stoptaster
  pinMode(7,INPUT_PULLUP);  // Starttaster
  //pinMode(6,INPUT); // Endlage "Nullstellung M2"
  //pinMode(8,INPUT_PULLUP); // Taster für das Anfahren der ArbeitsstellungM1
  //pinMode(9,INPUT_PULLUP); // Taster für das Anfahren der ArbeitsstellungM2
  pinMode(4, OUTPUT);  // Sleep&Reset
  pinMode(3, OUTPUT);  // Enable
 
  digitalWrite(4, HIGH);  // Sleep&Reset deaktiviert
  digitalWrite(3, LOW);   // Enable auf low -> Chip aktiv
}

void loop()

{
  //bool NullstellungM1Erreicht = digitalRead(5);
  //bool NullstellungM2Erreicht = digitalRead(6);
  //int ArbeitstellungM1Erreicht = analogRead(54);
  //int ArbeitstellungM2Erreicht = analogRead(55);

  //bool TasterNullstellung = digitalRead(7);
  //bool TasterArbeitsStellungM1 = digitalRead(5);
  //bool TasterArbeitsstellungM2 = digitalRead(9);
  bool MotorStop = LOW;

  




   
    
    
      while ((digitalRead(7) == LOW) && MotorStop == LOW)
      {
        Serial.println("Motorlauf gestartet");
        StepperM1.step(-2000);
        if (digitalRead(5) == LOW)
          {
            MotorStop = HIGH;
            Serial.println("Motorlauf unterbrochen");
          }

        Serial.println("Motorlauf beendet");

        

          

      }
 
   
}

Mein letzter Ansatz war, einen Merker als zusätzliche Schleifenbedingung abzufragen, der in der Schleife gesetzt wird, sobald der zweite Taster betätigt wird.
Leider war auch das ohne Erfolg.

Ich bin für eure Tipps und Ratschläge dankbar.

Viele Grüße

blockiert, lässt sich nicht unterbrechen.

Was stimmt jetzt?

Du fragst den Stop-Taster nur ab, während Du den Start-Taster drückst (und MotorStop == low ist).

Ob man den Lauf in der Stepper.h unterbrechen kann, weiß ich nicht.
Du könntest die die Moba Tools ansehen, die können viel.

Ich würde das für den Anfang auf 2 if Zweige aufteilen.
Taster entprellen.
Den Start-if-Zweig nach dem ersten Druck verriegeln.

Und dann über eine Statemashine / Schrittkette nachdenken :slight_smile:

Wie @jremington schon schrieb, geht das nicht, da die Funktion blockiert, bis alle Schritte ausgeführt sind.

Ja, mit den MobaTools ist das kein Problem, die blockieren während der Motorbewegung nicht.

Können die MobaTools auch :wink:

Ein Beispiel auf WOKWI:

#include <Stepper.h>



const unsigned int SchritteProUmdrehung = 200;
Stepper StepperM1 = Stepper(SchritteProUmdrehung, 10, 11);  // M1 ist der Motor unten rechts
//Stepper = StepperM2(200,12,13); // M2 ist der Motor links oben

const byte enablePin = 3;
const byte startPin = 7;
const byte stopPin = 5;

unsigned int aktuelleSchritte;

void setup()
{
  StepperM1.setSpeed(100);
  Serial.begin(9600);
  pinMode(startPin, INPUT_PULLUP); // Stoptaster
  pinMode(stopPin, INPUT_PULLUP); // Starttaster
  //pinMode(6,INPUT); // Endlage "Nullstellung M2"
  //pinMode(8,INPUT_PULLUP); // Taster für das Anfahren der ArbeitsstellungM1
  //pinMode(9,INPUT_PULLUP); // Taster für das Anfahren der ArbeitsstellungM2
  pinMode(4, OUTPUT);  // Sleep&Reset
  pinMode(3, OUTPUT);  // Enable
  digitalWrite(4, HIGH);  // Sleep&Reset deaktiviert
  digitalWrite(enablePin, LOW);   // Enable auf low -> Chip aktiv
}

void loop()

{
  //bool NullstellungM1Erreicht = digitalRead(5);
  //bool NullstellungM2Erreicht = digitalRead(6);
  //int ArbeitstellungM1Erreicht = analogRead(54);
  //int ArbeitstellungM2Erreicht = analogRead(55);
  //bool TasterNullstellung = digitalRead(7);
  //bool TasterArbeitsStellungM1 = digitalRead(5);
  //bool TasterArbeitsstellungM2 = digitalRead(9);
  if (!digitalRead(startPin) && aktuelleSchritte == 0)  //
  {
    aktuelleSchritte = SchritteProUmdrehung;
    digitalWrite(enablePin, LOW);
    Serial.println(F("Motorlauf gestartet"));
  }
  if (!digitalRead(stopPin) && aktuelleSchritte != 0)  //
  {
    aktuelleSchritte = 0;
    Serial.println(F("Motorlauf unterbrochen"));
  }
  if (aktuelleSchritte != 0)
  {
    StepperM1.step(1);
    aktuelleSchritte - 1;
    if (aktuelleSchritte == 0)
    { Serial.println(F("Motorlauf wird beendet")); }
  }
  else
  {
    digitalWrite(enablePin, HIGH);
  }
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.