INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
FlexyStepper.h mit OneButton.h nutzen
09.02.2020, 14:51
Beitrag #1
FlexyStepper.h mit OneButton.h nutzen
Hallo,

unter Verwendung des BeispielSketch der FlexyStepper.h: Example7_MovingWhileDoingOtherThingsToo habe ich probiert diesen mit button.attachClick zu starten, und mit button.attachDoubleClick zu beenden, also den STOP_BUTTON_PIN auszulösen. Letzteres funktioniert nicht.
Die FlexyStepper.h soll ja weitestgehend nicht blockierende Funktionen beinhalten, so auch die im Example7.

Unten noch der Sketch ohne OneButton.h, der funktioniert.

Woran liegt das bitte, kann man das Problem beheben?

Code:
// https://github.com/Stan-Reifel/FlexyStepper

#include <OneButton.h>
#include <FlexyStepper.h>

OneButton Taster(2, true);

const int LED_PIN = 13;
const int STEP = 4;
const int DIR = 5;
bool buttonState;
const int STOP_BUTTON_PIN = 7;

FlexyStepper stepper;


void setup()
{
  Taster.attachClick(Anfang);
  Taster.attachDoubleClick(Ende);
  Taster.setClickTicks(50);
  Taster.setPressTicks(200);
  Taster.setDebounceTicks(30);
  pinMode(LED_PIN, OUTPUT);
  pinMode(STOP_BUTTON_PIN, INPUT_PULLUP);
  Serial.begin(9600);

  stepper.connectToPins(STEP, DIR);
}

void loop() {
  Taster.tick();
  if (buttonState == HIGH) {
    Serial.println ("Anfang");
    stepper.setSpeedInStepsPerSecond(1600);
    stepper.setAccelerationInStepsPerSecondPerSecond(1600);
    stepper.setCurrentPositionInSteps(0);
    digitalWrite(LED_PIN, LOW);
    bool stopFlag = false;
    stepper.setTargetPositionInSteps(20000);
    while (!stepper.motionComplete()) {
      if (stepper.getCurrentPositionInSteps() == 400)
        digitalWrite(LED_PIN, HIGH);
      stepper.processMovement();
      if ((buttonState == LOW) && (stopFlag == false)) {
        stepper.setTargetPositionToStop();
        stopFlag = true;
      }
    }
  }
}

void Anfang()
{
  buttonState = HIGH;
  Serial.println("Anfang");
}

void Ende()
{
  buttonState = LOW;
  Serial.println("E N D E");
}

Ohne Onebutton.h funktioniert es:

Code:
#include <FlexyStepper.h>

const int START = 2;
const int LED_PIN = 13;
const int STEP = 4;
const int DIR = 5;
bool ButtonState;
const int STOP_BUTTON_PIN = 7;

FlexyStepper stepper; // create the stepper motor object


void setup()
{
  pinMode(LED_PIN, OUTPUT);
  pinMode(START, INPUT_PULLUP);
  pinMode(STOP_BUTTON_PIN, INPUT_PULLUP);
  Serial.begin(9600);

  stepper.connectToPins(STEP, DIR);
}

void loop()
{
  ButtonState = digitalRead(START);
    if (ButtonState == LOW)
  {
    Serial.println ("Anfang");
    stepper.setSpeedInStepsPerSecond(6000);
    stepper.setAccelerationInStepsPerSecondPerSecond(6000);
    stepper.setCurrentPositionInSteps(0);
    digitalWrite(LED_PIN, LOW);
    bool stopFlag = false;   // ?
    stepper.setTargetPositionInSteps(120000);
    while (!stepper.motionComplete())
    {
      stepper.processMovement();
      if (stepper.getCurrentPositionInSteps() == 400)
        digitalWrite(LED_PIN, HIGH);
      ButtonState = digitalRead(STOP_BUTTON_PIN);
      if ((ButtonState == LOW) && (stopFlag == false))
      {
        Serial.println("E N D E");
        stepper.setTargetPositionToStop();
        stopFlag = true;
      }
    }
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.02.2020, 17:58
Beitrag #2
RE: FlexyStepper.h mit OneButton.h nutzen
Funktioniert nicht, ist eine sehr aussagekräftige Beschreibung eines Fehlers, den nur du kennst bzw. nachvollziehen kannst.
Also geht das etwas genauer ?
Z.B. was funktioniert noch und was funktioniert nicht mehr.
Hast du in deinen Sketch mal ein paar serielle Ausgaben eingebaut, um zu sehen wo der Sketch nicht mehr funktioniert ?

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.02.2020, 23:30
Beitrag #3
RE: FlexyStepper.h mit OneButton.h nutzen
Was funktioniert: Mit button.attachClick zu startender Schrittmotor macht das was er entsprechend
stepper.setSpeedInStepsPerSecond(1600);
stepper.setAccelerationInStepsPerSecondPerSecond(1600);
stepper.setTargetPositionInSteps(120000);
machen soll. Er macht seine 120000 Steps. Es wird zweimal "Anfang" ausgegeben, einmal entsprechend void Anfang() und einmal entsprechend dem void loop() - soweit also in Ordnung.

Diese vollständige Bewegung kann laut Sketch jederzeit beendet werden, wenn entsprechend
if ((ButtonState == LOW) && (stopFlag == false))
die Bedingungen erfüllt sind. Wozu (stopFlag == false) in dem Beispielsketch enthalten ist weiß ich nicht, jedenfalls ist stopFlag == false.

Was nicht funktioniert: Die andere Bedingung, dass ButtonState == LOW) ist, tritt nicht ein weil ein Doppelklick, den OneButton.h erkennen sollte keine Wirkung hat. Die Ausgabe "E N D E " erfolgt nicht.

Überraschend ist, weil ein fast identischer Sketch dies nicht tut, die Bewegung des Schrittmotors startet selbständig neu - läuft also endlos.

Der andere unterscheidet sich von dem hier dadurch, das statt:
Taster.attachClick(Anfang);
Taster.attachDoubleClick(Ende);

Taster.attachLongPressStart(Anfang);
Taster.attachLongPressStop(Ende);
enthalten ist.
Weiterhin wird hier "E N D E" ausgegeben, aber nicht wenn der Taster losgelassen, sondern erst wenn der Schrittmotor gestoppt hat. Der FlexyStepper.h Code also beendet, und die, wie ich vermute, Blockierung der OneButton.h beendet ist. Diese erkennt vermeintlich dass die Aktion, die void(Ende) auslöst, gerade passiert ist.
Um das zu testen habe ich den Sketch mit Click und DoubleClick probiert.

Eventuell ist der UNO defekt? Ich glaube mich zu erinnern, dass die LEDs bei den ersten Übungen grün leuchteten, aktuell leuchten sie rot. Ich habe dazu im Internet nichts gefunden. 'Blink' funktioniert; auch sonst ist mir nichts aufgefallen, nur halt die Probleme hier.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.02.2020, 15:30
Beitrag #4
RE: FlexyStepper.h mit OneButton.h nutzen
Ich habe es gerade mit mit einem neu geliefertem UNO probiert, die Probleme sind die gleichen.
Und, dass der eine Sketch endlos läuft ist nicht verwunderlich, da attachClick(Ende) nicht erkannt wird bleibt buttonState = HIGH.
Nutz jemand beide Librarys zusammen?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.02.2020, 15:46 (Dieser Beitrag wurde zuletzt bearbeitet: 11.02.2020 15:47 von MicroBahner.)
Beitrag #5
RE: FlexyStepper.h mit OneButton.h nutzen
Du musst die 'tick' Methode regelmäßig aufrufen, damit die OneButton Lib funktioniert. Deine Callbacks werden aus der tick-Nethode heraus aufgerufen.
Deine Schleife während der Motor läuft ist aber blockierend, da wird tick während der Laufzeit des Motors nicht mehr aufgerufen. Wie sollen da deine Callbacks 'Anfang' bzw. 'Ende' aufgerufen werden?

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.02.2020, 17:16
Beitrag #6
RE: FlexyStepper.h mit OneButton.h nutzen
Ja danke, prima, einmal Taster.tick in der while-Schleife hat geholfen. Ist ja auch logisch und bei einem anderen Sketch hatte ich das aus diesem Grund auch probiert, da half es aber nicht. Vermutlich kam ich deshalb hier nicht auf die Idee. Es haben sich weitere Probleme mit der OneButton.h ergeben - die werde ich bald hier posten.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Teilfunktion nur 1x nutzen, für begrenzte Zeit senseman 9 878 09.04.2020 10:31
Letzter Beitrag: Tommy56
  SPI Schnittstellen für mehrere Geräte nutzen Hoffmakl 11 3.038 31.01.2019 15:41
Letzter Beitrag: Hoffmakl
  OneButton geht im loop() nicht uweq 4 2.466 09.08.2018 21:29
Letzter Beitrag: uweq
  Struct mit Defaultdaten ohne initalisieren nutzen? da_user 14 3.234 22.03.2018 19:11
Letzter Beitrag: da_user
  SPI Flash mit SD Library ansprechen/nutzen? tuxedo0801 1 1.696 24.03.2017 12:01
Letzter Beitrag: tuxedo0801
  2. Router intern Nutzen. comfan 12 2.801 28.01.2017 17:55
Letzter Beitrag: hotsystems
  Bibliothek von Arduino Uno für Micro Pro nutzen? pagaty 1 1.117 12.01.2017 22:26
Letzter Beitrag: Bitklopfer
  mehere Analoge Eingänge nutzen clemens89 17 4.561 16.03.2016 20:40
Letzter Beitrag: hotsystems
Star Infrarot variabel nutzen ??? Mourti 7 1.950 18.02.2016 18:13
Letzter Beitrag: Mourti
  Taster für zwei Funktionen nutzen - wie macht man das? Gelegenheitsbastler 2 2.194 22.07.2015 11:56
Letzter Beitrag: Scherheinz

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste