Zum Hauptinhalt springen

Zwei Treiber, ein Controller

Was dieses Beispiel zeigt​

Zwei Schrittmotoren, die von einem Controller angesteuert werden und jeweils über eine eigene DRV8825-Platine verfügen. Beide Motoren bewegen sich zu einer Zielposition, und sobald sie diese erreichen, kehren sie in die entgegengesetzte Richtung um, um die Bewegung zu spiegeln, sodass sie unendlich lange hin und her fahren. Die Beschleunigung wird automatisch geregelt: Die Motoren beschleunigen und verlangsamen sich sanft auf die jeweilige Zielposition hin, anstatt abrupt anzufahren und anzuhalten.

Sie benötigen zwei dieser Platinen, eine pro Motor, sowie vier Pins des Controllers.

Trotz seines Dateinamens verwendet DualMotorShield.ino kein Motor-Shield. Es erstellt zwei BasicStepper-Instanzen auf der DRIVER-Schnittstelle, was genau der Art und Weise entspricht, wie diese Platine angesteuert wird.

Der Beispielcode​

Die vier Pin-Nummern entsprechen der NULA DeepSleep ESP32-S3-Belegung. Der mitgelieferte Sketch verwendet 2, 3, 6 und 7, was der Arduino-Uno-Nummerierung entspricht; der Rest bleibt unverändert.

Select Board
DualMotorShield.ino
#include "Basic-Stepper-Driver-SOLDERED.h"

// The X Stepper pins
#define STEPPER1_DIR_PIN 4
#define STEPPER1_STEP_PIN 5
// The Y stepper pins
#define STEPPER2_DIR_PIN 6
#define STEPPER2_STEP_PIN 7

// Define some steppers and the pins the will use
BasicStepper stepper1(BasicStepper::DRIVER, STEPPER1_STEP_PIN, STEPPER1_DIR_PIN);
BasicStepper stepper2(BasicStepper::DRIVER, STEPPER2_STEP_PIN, STEPPER2_DIR_PIN);

void setup()
{
stepper1.setMaxSpeed(200.0);
stepper1.setAcceleration(200.0);
stepper1.moveTo(100);

stepper2.setMaxSpeed(100.0);
stepper2.setAcceleration(100.0);
stepper2.moveTo(100);
}

void loop()
{
// Change direction at the limits
if (stepper1.distanceToGo() == 0)
stepper1.moveTo(-stepper1.currentPosition());
if (stepper2.distanceToGo() == 0)
stepper2.moveTo(-stepper2.currentPosition());
stepper1.run();
stepper2.run();
}

Erwartetes Ergebnis:

Beide Motoren fahren schrittweise zur Position 100, dann rückwärts auf -100, dann wieder zurück, und setzen diesen Vorgang unendlich fort. Bei jeder Bewegung wird zunächst beschleunigt und anschließend abgebremst. Der erste Motor läuft mit bis zu 200 Schritten pro Sekunde und der zweite mit bis zu 100, sodass es sichtbar etwa doppelt so lange dauert, die gleiche Strecke zurückzulegen, und die beiden außer Takt geraten.

Es gibt keine serielle Ausgabe.

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“, anschließend den STEP-Pin und den DIR-Pin in dieser Reihenfolge. Geerbt von „AccelStepper“, das für Direct-Drive-Schnittstellen zusätzlich 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 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. Dadurch kann der Motor sanft in eine Zielposition einfahren, anstatt abrupt anzuhalten.

ReturnsNichts.

Parameter

TypNameBeschreibung
floataccelerationBeschleunigung in Schritten pro Sekunde im Quadrat.
moveTo(long absolute)returns void

Legt eine absolute Zielposition in Schritten fest. Der Motor wird dadurch nicht von selbst bewegt; die Schrittbewegung erfolgt durch die Funktion „run()“. Wird die Funktion wie in diesem Beispiel mit dem negativen Wert der aktuellen Position aufgerufen, wird der Motor in die Richtung zurückgeführt, aus der er gekommen ist.

ReturnsNichts.

Parameter

TypNameBeschreibung
longabsoluteZielposition in Schritten, relativ zur Startposition des Motors.
distanceToGo()returns long

Wie viele Schritte sind noch übrig, bis die Zielposition erreicht ist? Der Wert Null bedeutet, dass der Motor angekommen ist – so erkennt dieses Beispiel, wann die Drehrichtung umgekehrt werden muss.

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

Parameter

Diese Funktion benötigt keine Parameter.

currentPosition()returns long

Die Position des Motors in Schritten, gezählt ab seiner Ausgangsposition.

ReturnsAktuelle Position in Schritten.

Parameter

Diese Funktion benötigt keine Parameter.

run()returns boolean

Lässt den Motor höchstens einmal unter Anwendung der Beschleunigungskurve anlaufen. Die Funktion muss wiederholt aufgerufen werden, damit sich der Motor weiterbewegt; deshalb befindet sie sich in der Funktion „loop()“, ohne dass etwas sie blockiert.

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

Parameter

Diese Funktion benötigt keine Parameter.

Zusammenfassung​

Das Schema ist bei einem oder mehreren Motoren dasselbe. Konfigurieren Sie Geschwindigkeit und Beschleunigung einmalig in setup(), legen Sie ein Ziel fest und rufen Sie dann bei jedem Durchlauf von loop() die Funktion run() auf. Da run() pro Aufruf höchstens einen Schritt ausführt, führt alles, was blockiert – sei es ein delay() oder ein langsames Auslesen eines Sensors – zu einem Stillstand des Motors. Halten Sie loop() schnell und lassen Sie sich von distanceToGo() mitteilen, wann eine Bewegung beendet ist.

Beide Treiber benötigen eine eigene Platine, einen eigenen Anschluss für die Motorversorgung und eine eigene, über den Trimmer eingestellte Strombegrenzung. Sie können sich die Masse des Controllers teilen.