Zum Hauptinhalt springen

Eine bestimmte Anzahl von Schritten zurücklegen

Was dieses Beispiel zeigt​

Den Motor um eine präzise Strecke bewegen und dort anhalten, wobei die Bibliothek die Drehzahl erst hoch- und dann wieder herunterfährt, damit der Motor an beiden Enden keine Schritte überspringt. Genau das ist erforderlich für alles, was an einer bestimmten Stelle ankommen muss: eine Achse, ein Zuführer, ein Drehtisch.

Der mitgelieferte Sketch verwendet BasicStepper stepper;, was der Bibliotheks-Header als AccelStepper::FULL4WIRE an den Pins 2, 3, 4 und 5 definiert. Das treibt die Motorspulen direkt an und passt nicht zu dieser Platine. Erstellen Sie stattdessen eine Instanz mit BasicStepper::DRIVER und verwenden Sie stattdessen Ihre STEP- und DIR-Pins, wie unten gezeigt.

Der Beispielcode​

Select Board
Blocking.ino
#include <Basic-Stepper-Driver-SOLDERED.h>

#define dirPin 4
#define stepPin 5

BasicStepper stepper(BasicStepper::DRIVER, stepPin, dirPin);

void setup()
{
stepper.setMaxSpeed(200.0);
stepper.setAcceleration(100.0);
}

void loop()
{
stepper.runToNewPosition(0);
stepper.runToNewPosition(500);
stepper.runToNewPosition(100);
stepper.runToNewPosition(120);
}

Erwartetes Ergebnis:

Der Motor bewegt sich schrittweise zur Position 500, zurück zu 100, vorwärts zu 120, kehrt dann zu 0 zurück und wiederholt den Vorgang. Bei jeder Bewegung wird vom Startpunkt aus beschleunigt und beim Erreichen des Ziels abgebremst. Bei einem 200-Schritt-Motor im Vollschritt-Modus entsprechen 500 Schritte zweieinhalb Umdrehungen.

Es gibt keine serielle Ausgabe. runToNewPosition() blockiert, bis jede Bewegung abgeschlossen ist, sodass nichts anderes ausgeführt werden kann, während sich der Motor bewegt.

Umsetzung ohne Blockierung​

runToNewPosition() ist zwar praktisch, aber völlig ungeeignet für einen Sketch, der auch einen Sensor auslesen oder auf eine Taste reagieren muss. Die nicht blockierende Variante legt ein Ziel fest und nähert sich diesem schrittweise aus loop() heraus:

Select Board
Blocking.ino
#include <Basic-Stepper-Driver-SOLDERED.h>

#define dirPin 4
#define stepPin 5

BasicStepper stepper(BasicStepper::DRIVER, stepPin, dirPin);

void setup()
{
stepper.setMaxSpeed(1000);
stepper.setAcceleration(50);
}

void loop()
{
stepper.move(100);
while (stepper.run()) {}
delay(2000);
stepper.move(50);
while (stepper.run()) {}
delay(2000);
}

move() arbeitet relativ; bei einem Motor mit 200 Schritten dreht sich dieser also um eine halbe Umdrehung, wartet zwei Sekunden, dreht sich um ein weiteres Viertel und wartet erneut. Ersetzen Sie die while-Schleifen durch einen einfachen run()-Aufruf pro Durchlauf durch loop(), und der Sketch blockiert überhaupt nicht mehr.

Wenn du eine konstante Geschwindigkeit bis zu einer Position anstelle einer beschleunigten Geschwindigkeit wünschst, reicht moveTo() gefolgt von run() nicht aus: Im Header wird darauf hingewiesen, dass moveTo() die Geschwindigkeit für den nächsten Schritt neu berechnet und run() dann daraufhin seine eigene Beschleunigungskurve anwendet. Verwenden Sie moveTo(), dann setSpeed() und anschließend runSpeedToPosition(), das laut Dokumentation mit der ausgewählten Geschwindigkeit läuft und keine Beschleunigungen implementiert.

Verwendete Funktionen​

BasicStepper(uint8_t interface, uint8_t pin1, uint8_t pin2)returns None

Erstellt einen Stepper auf der angegebenen Schnittstelle. Übergeben Sie für diese Platine zunächst `BasicStepper::DRIVER`, dann den STEP-Pin und den DIR-Pin – in dieser Reihenfolge. Geerbt von `AccelStepper`, das für Direct-Drive-Schnittstellen zudem zwei weitere Pins und ein Freigabe-Flag akzeptiert.

ReturnsKonstruktor; kein Rückgabewert.

Parameter

TypNameBeschreibung
uint8_tinterfaceTyp der Motorschnittstelle. BasicStepper::DRIVER (1) für einen Step/Dir-Treiber. Standardwert ist FULL4WIRE (4).
uint8_tpin1Bei DRIVER der STEP-Pin. Standardwert ist 2.
uint8_tpin2Bei Verwendung von DRIVER der DIR-Pin. Standardwert ist 3.
setMaxSpeed(float speed)returns void

Legt die höchste Drehzahl fest, die der Motor erreichen darf. Die Beschleunigung steigt bis zu diesem Wert an und geht nicht darüber hinaus.

ReturnsNichts.

Parameter

TypNameBeschreibung
floatspeedMaximale Geschwindigkeit in Schritten pro Sekunde.
setAcceleration(float acceleration)returns void

Legt fest, wie schnell der Motor seine Drehzahl ändert; dies gilt sowohl für das Beschleunigen als auch für das Abbremsen. Anders als bei `runSpeed()` trifft dies hier tatsächlich zu: `run()`, `runToPosition()` und `runToNewPosition()` folgen alle der Rampe.

ReturnsNichts.

Parameter

TypNameBeschreibung
floataccelerationBeschleunigung in Schritten pro Sekunde im Quadrat.
runToNewPosition(long position)returns void

Bewegt sich mit Beschleunigung und Verzögerung auf ein absolutes Ziel zu und wartet, bis der Motor dort angekommen ist. Einfach zu verwenden, aber während der Bewegung wird nichts anderes in Ihrem Sketch ausgeführt; halten Sie ihn daher aus Ereignisschleifen fern.

ReturnsNichts. Der Wert wird zurückgegeben, sobald der Motor die Position erreicht hat.

Parameter

TypNameBeschreibung
longpositionAbsolute Zielposition in Schritten.
move(long relative)returns void

Legt ein Ziel fest, das eine bestimmte Anzahl von Schritten von der aktuellen Position des Motors entfernt ist. Die Funktion selbst führt keine Bewegung aus; die Schrittbewegung erfolgt über die Funktion `run()`. Negative Werte bedeuten eine Bewegung gegen den Uhrzeigersinn ausgehend von der aktuellen Position.

ReturnsNichts.

Parameter

TypNameBeschreibung
longrelativeZielversatz in Schritten von der aktuellen Position.
moveTo(long absolute)returns void

Legt eine absolute Zielposition fest, gemessen vom Startpunkt des Motors. Außerdem wird die Geschwindigkeit für den nächsten Schritt neu berechnet, weshalb bei einer Bewegung mit konstanter Geschwindigkeit die Funktion `setSpeed()` anschließend erneut aufgerufen werden muss.

ReturnsNichts.

Parameter

TypNameBeschreibung
longabsoluteAbsolute Zielposition in Schritten. Negative Werte bedeuten eine Drehung gegen den Uhrzeigersinn ausgehend von Position 0.
run()returns boolean

Treibt den Motor höchstens einmal an und folgt dabei der Beschleunigungskurve in Richtung des Ziels. Muss wiederholt aufgerufen werden; alles, was in der Schleife `loop()` blockiert, verlangsamt den Motor.

ReturnsGilt, solange sich der Motor noch auf dem Weg zu seinem Ziel befindet.

Parameter

Diese Funktion benötigt keine Parameter.

distanceToGo()returns long

Wie viele Schritte sind noch übrig, bis das Ziel erreicht ist? Der Wert Null bedeutet, dass der Motor das Ziel erreicht hat; dies ist die übliche Methode, um festzustellen, dass eine Bewegung beendet ist, ohne dass es dabei zu einer Blockierung kommt.

ReturnsNoch verbleibende Schritte. Negativ, wenn sich das Ziel hinter der aktuellen Position befindet.

Parameter

Diese Funktion benötigt keine Parameter.

stop()returns void

Legt ein neues Ziel so nah an der aktuellen Position fest, wie es die Verzögerungsrate zulässt, damit der Motor kontrolliert zum Stillstand kommt und seine Position nicht verliert. Rufen Sie anschließend runToPosition() auf, um den Stopp abzuschließen.

ReturnsNichts.

Parameter

Diese Funktion benötigt keine Parameter.

Zusammenfassung​

Legen Sie Geschwindigkeit und Beschleunigung einmal fest und wählen Sie dann den Aufruf, der dem Umfang Ihrer Kontrollanforderungen entspricht. runToNewPosition() für eine schnelle Skizze, bei der Blockierung in Ordnung ist. move() oder moveTo() plus run() in loop(), wenn andere Prozesse weiterlaufen müssen. distanceToGo() == 0, um zu erkennen, dass eine Bewegung beendet ist, und stop(), wenn Sie eine Bewegung abbrechen müssen, ohne den Überblick über die aktuelle Position des Motors zu verlieren.

Das Hochfahren ist der springende Punkt bei all dem. Ein Schrittmotor, der unter Last direkt auf die Geschwindigkeit springen soll, überspringt Schritte, und ein übersprungener Schritt bedeutet, dass die Position, an der sich die Bibliothek glaubt, nicht mehr die Position ist, an der sich die Welle tatsächlich befindet. Es gibt kein Feedback, um das zu erkennen, sodass der Fehler bestehen bleibt, bis du den Referenzpunkt neu setzt.

Varianten in der Bibliothek​

Vier weitere mitgelieferte Sketches führen Positionsbewegungen auf die gleiche Weise aus, mit demselben Vorbehalt bezüglich des Konstruktors. Es lohnt sich, sie eher wegen der Muster als wegen der Ergebnisse zu lesen: