Motor drehen und in den Ruhezustand versetzen
Was dieses Beispiel veranschaulicht
Eine vollständige Umdrehung, eine vollständige Rückdrehung, dann wechselt der Treiber in den Ruhezustand. Der Ruhezustand unterbricht die Stromaufnahme des Treibers, wenn der Motor keine Position halten muss. Aus diesem Grund sind ENABLE, RESET und SLEEP an GPIO-Pins angeschlossen und nicht auf High-Pegel festgelegt.
Das Beispiel verwendet DRV8825.CLOCK_WISE für die erste Etappe und
DRV8825.COUNTER_CLOCK_WISE für die zweite. Diese Bezeichnungen beschreiben den vom Modul eingestellten DIR-Pegel,
nicht eine garantierte physikalische Drehrichtung: In welche Richtung sich die Welle dreht,
hängt davon ab, wie Sie die Spulen verdrahtet haben. Vertauschen Sie die Paare einer Spule, um die Drehrichtung umzukehren.
Der Header des Beispiels nennt dieses Produkt: „KOMPATIBEL MIT: Schrittmotortreiber DRV8825-Platine: www.solde.red/333000“.
Der Beispielcode
Die Pin-Nummern entsprechen der NULA DeepSleep ESP32-S3-Belegung aus Quick Start. Das aufgezeichnete Beispiel verwendet GPIO 5, 18, 19, 21 und 22; GPIO18 ist auf dieser Platine nicht herausgeführt, und der ESP32-S3 verfügt über keinen GPIO22. Ansonsten wurden keine Änderungen vorgenommen.
from drv8825 import DRV8825
from time import sleep
# Define pin numbers (adjust to match your board setup)
DIR_PIN = 4 # GPIO4
STEP_PIN = 5 # GPIO5
EN_PIN = 6 # GPIO6 (optional)
RST_PIN = 7 # GPIO7 (optional)
SLP_PIN = 10 # GPIO10 (optional)
# The motor should be connected via the B1,B2,A1,A2 pins
# The motor power supply should be connected to the VIN and GND pins and have a
# parallel connected capacitor, reffer to your motors datasheet for more information
# Initialize the driver
motor = DRV8825()
motor.begin(DIR=DIR_PIN, STEP=STEP_PIN, EN=EN_PIN, RST=RST_PIN, SLP=SLP_PIN)
# Configure motor behavior
motor.setStepsPerRotation(200) # Typical for 1.8° stepper motors
motor.setStepPulseLength(1000) # Microseconds per step pulse
motor.setDirection(DRV8825.CLOCK_WISE)
motor.enable()
# Step the motor forward 200 steps (one full rotation)
print("Stepping forward...")
for _ in range(200):
motor.step()
sleep(0.005) # 5ms delay between steps
# Change direction and step back
motor.setDirection(DRV8825.COUNTER_CLOCK_WISE)
print("Stepping backward...")
for _ in range(200):
motor.step()
sleep(0.005)
# Put the motor to sleep
motor.sleep()
print("Motor is now sleeping.")
Erwartetes Ergebnis:
Stepping forward...
Stepping backward...
Motor is now sleeping.
Diese drei Zeilen sind die im Beispiel enthaltenen wörtlichen print()-Aufrufe, daher ist der Text
exakt.
Der Motor dreht sich um 200 Schritte, kehrt die Drehrichtung um und endet dort, wo er begonnen hat. Bei einem 1,8°-Motor
im Vollschritt entsprechen 200 Schritte einer vollständigen Umdrehung. Ändern Sie die Mikroschritt-Einstellung mit
M0, M1 oder M2, und dieselben 200 Impulse decken proportional weniger ab: Bei 1/8 Mikroschritt
entsprechen sie einem Achtel einer Umdrehung. setStepsPerRotation() kennt die
Mikroschritt-Pins nicht, daher liegt es an Ihnen, die beiden miteinander abzustimmen.
Nach der letzten Zeile befindet sich der Treiber im Ruhezustand, hält nichts fest, und die Welle lässt sich frei von Hand drehen.
Verwendete Funktionen
DRV8825()returns DRV8825Erstellt das Treiberobjekt. Es nimmt selbst keine Konfiguration vor; jeder Pin wird durch die Funktion `begin()` eingerichtet.
ReturnsEine neue Treiberinstanz, der noch keine Pins zugewiesen sind.
Parameter
Dieser Konstruktor benötigt keine Parameter.
begin(DIR, STEP, EN=None, RST=None, SLP=None)returns boolWeist die Steuerpins zu und konfiguriert sie als Ausgänge. DIR und STEP sind erforderlich. EN, RST und SLP sind optional; geben Sie diese nur an, wenn diese Pins an GPIO angeschlossen sind und nicht auf einen festen Pegel festgelegt sind. RST und SLP werden auf „High“ initialisiert – dies ist der Pegel, den der Treiber benötigt, um zu laufen.
ReturnsGilt, sobald die Pins konfiguriert sind.
Parameter
| Typ | Name | Beschreibung |
|---|---|---|
int | DIR | GPIO-Nummer für den Richtungs-Pin. |
int | STEP | GPIO-Nummer für den Schritt-Pin. |
int | EN | GPIO-Nummer für den Freigabe-Pin. Optional, Standardwert ist None. |
int | RST | GPIO-Nummer für den Reset-Pin. Optional, Standardwert ist None. Wird beim Start auf High gesetzt. |
int | SLP | GPIO-Nummer für den Sleep-Pin. Optional, Standardwert ist None. Wird beim Start auf High gesetzt. |
setStepsPerRotation(steps)returns NoneGibt dem Modul an, wie viele Schritte eine vollständige Umdrehung ausmachen, damit es die Position innerhalb einer Umdrehung verfolgen kann. Ein 1,8-Grad-Motor benötigt bei Vollschrittbetrieb 200 Schritte. Dies hat keinen Einfluss darauf, wie der Motor angesteuert wird.
ReturnsNichts.
Parameter
| Typ | Name | Beschreibung |
|---|---|---|
int | steps | Schritte pro voller Umdrehung. |
setStepPulseLength(length)returns NoneLegt fest, wie lange der STEP-Pin innerhalb jedes step()-Aufrufs auf „High“ und anschließend auf „Low“ gehalten wird (in Mikrosekunden). Bei einer Einstellung von 0 schaltet step() den Pin ohne zusätzliche Verzögerung um.
ReturnsNichts.
Parameter
| Typ | Name | Beschreibung |
|---|---|---|
int | length | Impulslänge in Mikrosekunden. |
setDirection(direction)returns boolLegt den Richtungs-Pin fest. Verwenden Sie die Klassenkonstanten DRV8825.CLOCK_WISE und DRV8825.COUNTER_CLOCK_WISE anstelle von reinen Zahlen. Jeder andere Wert wird abgelehnt und der Pin bleibt unverändert. Die Namen der Konstanten beschreiben den DIR-Pegel, nicht eine garantierte Drehrichtung der Welle, die sich nach der Verdrahtung Ihrer Spule richtet.
ReturnsWahr, wenn die Richtung gültig war, andernfalls Falsch.
Parameter
| Typ | Name | Beschreibung |
|---|---|---|
int | direction | DRV8825.CLOCK_WISE (1) oder DRV8825.COUNTER_CLOCK_WISE (0). |
enable()returns boolAktiviert die Treiberausgänge, indem der ENABLE-Pin auf Low gesetzt wird. Gibt „False“ zurück, wenn bei der Funktion „begin()“ kein Enable-Pin übergeben wurde.
ReturnsWahr, wenn der Pin angesteuert wurde; Falsch, wenn kein Freigabepin konfiguriert ist.
Parameter
Diese Funktion benötigt keine Parameter.
step()returns NoneBewegt den Motor um einen Schritt weiter: STEP-Impulse werden erst auf „High“, dann auf „Low“ gesetzt, wobei bei jedem Pegel die konfigurierte Impulsdauer abgewartet wird. Außerdem wird der Schrittzähler erhöht und die verfolgte Position um eine Stelle in die aktuelle Richtung verschoben.
ReturnsNichts.
Parameter
Diese Funktion benötigt keine Parameter.
sleep()returns boolVersetzt den Treiber in den Energiesparmodus, indem der SLEEP-Pin auf Low gesetzt wird. Rufen Sie wakeup() auf, bevor Sie den nächsten Schritt ausführen. Gibt „False“ zurück, wenn bei begin() kein Sleep-Pin übergeben wurde.
ReturnsWahr, wenn der Pin angesteuert wurde; Falsch, wenn kein Sleep-Pin konfiguriert ist.
Parameter
Diese Funktion benötigt keine Parameter.
Zusammenführung
Der Aufbau ist immer derselbe: begin() mit Ihren Pins, Beschreibung des Motors mit
setStepsPerRotation() und setStepPulseLength(), enable() und anschließend der Schritt.
Das Timing können Sie selbst steuern. setStepPulseLength(1000) hält jeden STEP-Pegel für
1 ms, und das sleep(0,005) in der Schleife fügt zwischen den Schritten 5 ms hinzu, sodass der Motor
mit etwa 140 Schritten pro Sekunde läuft. Verkürzen Sie eines von beiden, um schneller zu werden.
Der Treiber bleibt im Leerlauf mit Strom versorgt, sofern Sie nichts anderes festlegen, und die Einsparung
durch sleep() ist nicht unerheblich. Laut Datenblatt liegt der Versorgungsstrom des DRV8825
im Betrieb typischerweise bei 5 mA, im Ruhezustand bei typischerweise 10 µA, beide Werte gemessen bei 24 V.
wakeup() weckt ihn wieder auf und isSleeping() meldet den aktuellen Zustand. Bei einem
batteriebetriebenen Controller lohnt es sich, zwischen jeder Bewegung in den Ruhezustand zu wechseln.
Zwei Dinge werden im Ruhezustand nicht abgeschaltet. Der Motor wird nicht mehr festgehalten, sodass alles, was einer Last ausgesetzt ist, rückwärts läuft: Schalten Sie den Ruhezustand erst am Ende einer Bewegung ein, wenn ein Positionsverlust akzeptabel ist oder wenn sich der Mechanismus selbst hält. Und die bordinterne PWR-LED verbraucht weiterhin Strom, unabhängig davon, was der Treiber gerade tut, es sei denn, Sie unterbrechen JP1.