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
#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:
#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 NoneErstellt 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
| Typ | Name | Beschreibung |
|---|---|---|
uint8_t | interface | Typ der Motorschnittstelle. BasicStepper::DRIVER (1) für einen Step/Dir-Treiber. Standardwert ist FULL4WIRE (4). |
uint8_t | pin1 | Bei DRIVER der STEP-Pin. Standardwert ist 2. |
uint8_t | pin2 | Bei Verwendung von DRIVER der DIR-Pin. Standardwert ist 3. |
setMaxSpeed(float speed)returns voidLegt 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
| Typ | Name | Beschreibung |
|---|---|---|
float | speed | Maximale Geschwindigkeit in Schritten pro Sekunde. |
setAcceleration(float acceleration)returns voidLegt 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
| Typ | Name | Beschreibung |
|---|---|---|
float | acceleration | Beschleunigung in Schritten pro Sekunde im Quadrat. |
runToNewPosition(long position)returns voidBewegt 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
| Typ | Name | Beschreibung |
|---|---|---|
long | position | Absolute Zielposition in Schritten. |
move(long relative)returns voidLegt 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
| Typ | Name | Beschreibung |
|---|---|---|
long | relative | Zielversatz in Schritten von der aktuellen Position. |
moveTo(long absolute)returns voidLegt 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
| Typ | Name | Beschreibung |
|---|---|---|
long | absolute | Absolute Zielposition in Schritten. Negative Werte bedeuten eine Drehung gegen den Uhrzeigersinn ausgehend von Position 0. |
run()returns booleanTreibt 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 longWie 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 voidLegt 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: