Stepper bei Bewegung stoppen über Befehl/Eingabe

Hallo zusammen,

ich bin recht neu was das Programmieren mit Arduino angeht also bitte nicht direkt steinigen :slight_smile:

Geplant ist eine Schaltung bei der ein Stepper rechts und links dreht mit verschiedenen anwählbaren Geschwindigkeiten über ein IR Remote anwählbar. Das Ganze funktioniert auch soweit, nun möchte ich noch eine Taste mit einem Stopp befehl belegen. Allerdings reagiert meine ganze Schaltung nicht solange eine Bewegung ausgeführt wird.

Gibt es dafür eine gute Lösung ? Ich konnte leider dazu noch nichts finden, um das Problem zu umgehen.

Hardware:
Uno
A4988 Treiber
IR Remote
Nema17

Benutzt wird die StepperDriver Library von Laurb9

#include <Arduino.h>
#include "A4988.h"
#include <IRremote.h>

// using a 200-step motor (most common)
#define MOTOR_STEPS 200
// configure the pins connected
#define DIR 8
#define STEP 9
//define MS1 10
//define MS2 11
//define MS3 12
#define SLEEP 10
A4988 stepper(MOTOR_STEPS, DIR, STEP, SLEEP);

int RECV_PIN = 12;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup() {
  // Set target motor RPM to 1RPM and microstepping to 1 (full step mode)
  stepper.begin(10, 16);
  // if using enable/disable on ENABLE pin (active LOW) instead of SLEEP uncomment next line
  // stepper.setEnableActiveState(LOW);

  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);

  // initialize the serial port:
  Serial.begin(9600);
  irrecv.enableIRIn();

}

void loop() {

  //-----------------------------------rotation right-----------------------------------------------
  // Tell motor to rotate 360 degrees. That's it.
  //stepper.rotate(360);

  if (irrecv.decode(&results)) {

    Serial.println(results.value, DEC);

    if (results.value == 16761405)   //Wenn der Infrarotempfänger die Zahl
      //„16724175“ ausgelesen hat (Entsprechend der Taste“1“ der Fernbedienung)

      // energize coils - the motor will hold position
      // stepper.enable();

      /*
         Moving motor one full revolution using the degree notation right
      */
    {
      stepper.rotate(-360);
    }


    //-----------------------------------rotation left-----------------------------------------------
    // Tell motor to rotate 360 degrees. That's it.
    //stepper.rotate(360);


    if (results.value == 16720605)   //Wenn der Infrarotempfänger die Zahl
      //„16724175“ ausgelesen hat (Entsprechend der Taste“1“ der Fernbedienung)

      // energize coils - the motor will hold position
      // stepper.enable();

      /*
         Moving motor one full revolution using the degree notation right
      */
    {
      stepper.rotate(360);
    }


    //----------------------------------------------speed--------------------------------------------


    if (results.value == 16724175)   //Wenn der Infrarotempfänger die Zahl
      //„16724175“ ausgelesen hat (Entsprechend der Taste“1“ der Fernbedienung)

      // energize coils - the motor will hold position
      // stepper.enable();

      /*
         Moving motor one full revolution using the degree notation right
      */
    {
      stepper.setRPM(100);
    }


    //----------------------------------------------speed2-------------------------------------------


    if (results.value == 16718055)   //Wenn der Infrarotempfänger die Zahl
      //„16724175“ ausgelesen hat (Entsprechend der Taste“1“ der Fernbedienung)

      // energize coils - the motor will hold position
      // stepper.enable();

      /*
         Moving motor one full revolution using the degree notation right
      */
    {
      stepper.setRPM(5);
    }

  //----------------------------------------------stop-------------------------------------------????????????


    if (results.value == 16712445)   //Wenn der Infrarotempfänger die Zahl
      //„16724175“ ausgelesen hat (Entsprechend der Taste“1“ der Fernbedienung)

      // energize coils - the motor will hold position
      // stepper.enable();

      /*
         Moving motor one full revolution using the degree notation right
      */
    {
      stepper.rotate(0);
    }

    irrecv.resume();
  }

}

Vielen Dank für die Hilfe.

Gruß

Allerdings reagiert meine ganze Schaltung nicht solange eine Bewegung ausgeführt wird.
Gibt es dafür eine gute Lösung

Ja, du musst allerdings auf stepper.rotate(360); verzichten ( s. beispielsweise startRotate(360); )
Dann kannst du jederzeit abfragen, wie weit die Bewegung aktuell ist und sie bei Bedarf auch vorzeitig abbrechen.

Außerdem gibt es andere Stepper libraries.

Du mußt nach jedem Step kontrollieren ob ein Stop hereingekommen ist.
Also ist stepper.rotate(360); nicht möglich sondern Du drfst nur einen Schritt nach dem anderen machen bis die gesamtschrittzahl erreicht ist. Alson 360 mal stepper.rotate(1); (oder ein ganzzzahliges Vielfaches der Schrittweite des Motors).

Grüße Uwe

danke für euere Hilfe. Mir scheint es so, als ob der IR Empfänger während der Motor dreht überhaupt nichts verarbeitet. Der Serielle Monitor zeigt mir kein einkommendes Signal an.

@Uwe kannst du mir vielleicht kurz ein beispiel zeigen wie genau der Aufbau aussieht ?

Gruß

michael_x:
Außerdem gibt es andere Stepper libraries.

Du könntest zur Ansteuerung des Steppers meine MobaTools verwenden. Die steuern den Stepper im Hintergrund an, der Sketch läuft während der Bewegung des Steppers weiter. Du kannst also während der Bewegung IR-Signale empfangen und auswerten.