kopia lustrzana https://github.com/micropython/micropython-lib
54 wiersze
2.1 KiB
Python
54 wiersze
2.1 KiB
Python
![]() |
import time
|
||
|
|
||
|
# Constants
|
||
|
STEPS_PER_REV = 200 # Number of steps per motor revolution
|
||
|
MIN_DELAY = 0.001 # Minimum delay between steps (controls maximum speed)
|
||
|
|
||
|
class A4988:
|
||
|
def __init__(self, step_pin, dir_pin, en_pin=None):
|
||
|
self.step_pin = step_pin
|
||
|
self.dir_pin = dir_pin
|
||
|
self.en_pin = en_pin
|
||
|
if self.en_pin is not None:
|
||
|
self.enable_motor(enabled=True)
|
||
|
|
||
|
def enable_motor(self, enabled=True):
|
||
|
"""Enable or disable the motor driver (active low)."""
|
||
|
if self.en_pin:
|
||
|
self.en_pin.value(0 if enabled else 1)
|
||
|
|
||
|
def step_motor(self, steps=STEPS_PER_REV, direction=1, delay=0.005):
|
||
|
"""Move the motor a specified number of steps in the given direction."""
|
||
|
self.dir_pin.value(direction) # Set direction (1 = forward, 0 = backward)
|
||
|
for _ in range(steps):
|
||
|
self.step_pin.value(1)
|
||
|
time.sleep(delay)
|
||
|
self.step_pin.value(0)
|
||
|
time.sleep(delay)
|
||
|
|
||
|
def calculate_speed(self, current_delay):
|
||
|
"""Calculate the current speed in steps per second and RPM."""
|
||
|
if current_delay <= 0:
|
||
|
return 0, 0
|
||
|
steps_per_second = 1 / (2 * current_delay) # Delay is for each half-step
|
||
|
rpm = (steps_per_second / STEPS_PER_REV) * 60 # Convert to RPM
|
||
|
return steps_per_second, rpm
|
||
|
|
||
|
def inc_speed(self, current_delay):
|
||
|
"""Decrease delay to increase speed, respecting minimum delay limit."""
|
||
|
new_delay = max(current_delay - 0.001, MIN_DELAY)
|
||
|
return new_delay
|
||
|
|
||
|
def dec_speed(self, current_delay):
|
||
|
"""Increase delay to decrease speed."""
|
||
|
new_delay = current_delay + 0.001
|
||
|
return new_delay
|
||
|
|
||
|
def forward_motion(self, steps=STEPS_PER_REV, delay=0.005):
|
||
|
"""Move motor forward for a given number of steps and delay."""
|
||
|
self.step_motor(steps=steps, direction=1, delay=delay)
|
||
|
|
||
|
def backward_motion(self, steps=STEPS_PER_REV, delay=0.005):
|
||
|
"""Move motor backward for a given number of steps and delay."""
|
||
|
self.step_motor(steps=steps, direction=0, delay=delay)
|