Schrittmotor, Accelstepper und ein Taster-Mistvieh

Hallo zusammen,
seit 3 Tagen hänge ich an dem Programm:
Nach dem Einschalten wird die Position auf Null gesetzt. Funzt.
beim Tastendruck soll der Motor auf Position (hier: oben) drehen, beim zweiten Tastendruck wieder zurück.
Eigentlich nichts schweres.

Stand:
homing funktioniert; kein Problem.

drücke ich jetzt den Taster dreht der Motor zur Position, aber 2 mal. und das ist das Problem.

ich finde nicht den Fehler.

weiß jemand Rat?

#include <AccelStepper.h>
#include <Bounce2.h>

AccelStepper Xaxis(1, 5, 2); // pin 5 = step, pin 2 = direction
Bounce entpreller = Bounce();
int drehzahl = 800;
int oben = 400; //umdrehungen des motors bis Position
const byte enablePin = 8;
const int stepsPerRevolution = 3200;
long initial_homing = -1; // Used to Home Stepper at startup
boolean iststatus; //Statusabfrage

#define home_switch 12 //hometaster pion 12
#define starttaster 10  //Taster für Drehbewegung

//////////////////////////////////////////////////////////

void setup()
{
  pinMode(enablePin, OUTPUT);
  pinMode(home_switch, INPUT_PULLUP);
  pinMode(starttaster, INPUT_PULLUP);
  digitalWrite(enablePin, LOW); //mit HGIH wird ausgeschaltet
  iststatus = 1; // wird für if Bedingung benötigt

  // ab hier homing,  funktioniert
  entpreller.attach(home_switch);
  entpreller.interval(5);
  delay(10); //wait to wakeup
  Xaxis.setMaxSpeed(50);
  Xaxis.setAcceleration(50);

  while (digitalRead(home_switch)) {  // Make the Stepper move CCW until the switch is activated
    Xaxis.moveTo(initial_homing);  // Set the position to move to
    Xaxis.run();  // Start moving the stepper
    initial_homing--;  // Decrease by 1 for next move if needed
    delay(5);
  }
  Xaxis.setCurrentPosition(0);
  Xaxis.setMaxSpeed(100);
  Xaxis.setAcceleration(100);
  initial_homing = 1;

  while (!digitalRead(home_switch)) {  // Make the Stepper move CCW until the switch is activated
    Xaxis.moveTo(initial_homing);  // Set the position to move to
    Xaxis.run();  // Start moving the stepper
    initial_homing++;  // Decrease by 1 for next move if needed
    delay(5);
  }
  Xaxis.setCurrentPosition(0);
  Xaxis.setMaxSpeed(600);
  Xaxis.setAcceleration(600);
  entpreller.attach(starttaster);
  entpreller.interval(5);
}

// bis hier ist alles wie es soll

// in Loop: nach dem Drücken des Tasters dreht der Motor hin und her, genau 2 mal
void loop()
{
  entpreller.update();
  int wert = entpreller.read();
  // wenn Taster gedrückt und iststatus 1 und nicht oben soll bis oben fahren
  if (wert == LOW && iststatus == 1 && Xaxis.currentPosition() != oben)
  {
    while (Xaxis.currentPosition() != oben)    {
      Xaxis.setSpeed(drehzahl);
      Xaxis.runSpeed();
    }
    iststatus = 0;  //status wird auf 0 gesetzt
    delay(5);
  }
  if (wert == LOW && iststatus == 0 && Xaxis.currentPosition() == oben)
  {
    while (Xaxis.currentPosition() != 0)  {
      Xaxis.setSpeed(-drehzahl);
      Xaxis.runSpeed();
    }
    iststatus = 1;
  }
}

Hi

Wer ist homing und welche der Positionen wäre Das?
Erkläre den Ablauf bitte mit den Worten, Die Du auch bei der Fehlerbeschreibung verwendest.
Uns ist nicht Alles klar, was Du Dir die letzten 3 Tage überlegt hast - für uns ist das Problem komplett neu.

MfG

sorry,:

  1. homing:
    nach dem Einschalten dreht der Schrittmotor zurück bis zum Endtaster "home_switch", pin 12, und setzt dann die Position auf 0. Das funktioniert ohne Probleme.

Wunsch:
2. Drücke ich jetzt den starttaster, pin10, soll der Motor von Pos. 0 bis "oben" drehen und stehen bleiben.
3. Drücke ich den Taster wieder, soll der Motor von "oben" zurück zu 0 drehen.

IST:
Motor dreht bis oben aber dann wieder zurückc auf 0, das ganze zwei mal.

lasse ich die zweite if Bedingung weg, dreht der Motor bis oben und bleibt stehen.

ich komme nicht weiter.

Bitte nicht falsch verstehen, aber in den letzten Tagen tauchen hier immer wieder Programme zur Schrittmotorsteuerung auf, die eine Bewegung innerhalb einer while-Schleife bewerkstelligen wollen.

"Ich habe das doch aus einem Beispiel!" dann finde ich das Beispiel schlecht!

Ich finde diesen Ansatz schlecht und möchte ihn nicht unterstützen!

Bitte verwende loop als die Schleife, verbunden mit einer Schrittkette.

Eine Hilfe könnten die Stepper-Beispiele Stepper_02 und Stepper_Slider der MobaTools sein.

danke für die Rückmeldung. werde mir die MobaTools mal anschauen.
Was mich halt ärgert, ist, dass ich so kurz davor bin....... glaube ich :confused:

Habe es halt nicht gelernt.
Schönen Abend noch.

ardu2020:
Was mich halt ärgert, ist, dass ich so kurz davor bin....... glaube ich :confused:

Irgendwie ja, aber irgendwie auch nicht.

Im Thema Anfänger sucht Hilfe bei Motorenauswahl kannst Du Dir ein Beispiel mit AccelStepper von mir ansehen.

ardu2020:
Habe es halt nicht gelernt.

Ich auch nicht, kann man aber ändern ;D

Hallo zusammen,

folgend, nur zur Info, der gleiche Code jedoch umgemodelt auf eine IR-Fernbedienung. Auch mit der while-Schleife.
Mit der IR-Fernbedienung funktioniert das ohne Probleme, mit den Tastern will es nicht.
Hauptsache mit dem Projekt geht es weiter.
Danke für den Tipp mit der MobaTools Bibliothek, werde die mir mal bei Gelegenheit anschauen.

Gruß aus Gießen

Code:

#include <AccelStepper.h>
#include <Bounce2.h>
#include <IRremote.h>

AccelStepper Xaxis(1, 5, 2); // pin 5 = step, pin 2 = direction
Bounce entpreller = Bounce();
int drehzahl = 800;
int oben = 400; //umdrehungen des motors bis Position

const byte enablePin = 8;
const int stepsPerRevolution = 200;
long initial_homing = -1; // Used to Home Stepper at startup


decode_results results;  // Dieser Befehl sorgt dafür, dass die Daten, die per Infrarot eingelesen werden unter „results“ abgespeichert werden.

#define home_switch 12 //hometaster pion 12
int RECV_PIN = 11;  // Infrarotsensor die Daten ausgibt
IRrecv irrecv(RECV_PIN);

//////////////////////////////////////////////////////////

void setup()
{
  pinMode(enablePin, OUTPUT);
  pinMode(home_switch, INPUT_PULLUP);

  digitalWrite(enablePin, LOW); //mit HGIH wird ausgeschaltet
  irrecv.enableIRIn();   //Dieser Befehl initialisiert den Infrarotempfänger.

  /////////////////// ab hier homing,  funktioniert
  entpreller.attach(home_switch);
  entpreller.interval(5);
  delay(10); //wait to wakeup
  Xaxis.setMaxSpeed(50);
  Xaxis.setAcceleration(50);

  while (digitalRead(home_switch)) {  // Make the Stepper move CCW until the switch is activated
    Xaxis.moveTo(initial_homing);  // Set the position to move to
    Xaxis.run();  // Start moving the stepper
    initial_homing--;  // Decrease by 1 for next move if needed
    delay(5);
  }
  Xaxis.setCurrentPosition(0);
  Xaxis.setMaxSpeed(100);
  Xaxis.setAcceleration(100);

  while (!digitalRead(home_switch)) {  // Make the Stepper move CCW until the switch is activated
    Xaxis.moveTo(initial_homing);  // Set the position to move to
    Xaxis.run();  // Start moving the stepper
    initial_homing++;  // Decrease by 1 for next move if needed
    delay(5);
  }
  Xaxis.setCurrentPosition(0);
  Xaxis.setMaxSpeed(600);
  Xaxis.setAcceleration(600);
///////homig abgeschlossen, keine Probleme
}

void loop()
{
  if (irrecv.decode(&results)) {

    if (results.value == 16738455)   //Wenn der Infrarotempfänger die Zahl
      //„16738455“ ausgelesen hat (Entsprechend der Taste“1“ der Fernbedienung) fährt bis oben
    {
      while (Xaxis.currentPosition() != oben)    {
        Xaxis.setSpeed(drehzahl);
        Xaxis.runSpeed();
      }
      delay(5);
    }

    if (results.value == 16750695 && Xaxis.currentPosition() == oben)   //Wenn der Infrarotempfänger die Zahl
      //„16750695“ ausgelesen hat (Entsprechend der Taste“2“ der Fernbedienung), fährt von oben nach 0
    {
      while (Xaxis.currentPosition() != 0)  {
        Xaxis.setSpeed(-drehzahl);
        Xaxis.runSpeed();
      }
      delay(5);
    }
    irrecv.resume();
  }

}