|
| 1 | +import time |
| 2 | + |
| 3 | +# Constants |
| 4 | +STEPS_PER_REV = 200 # Number of steps per motor revolution |
| 5 | +MIN_DELAY = 0.001 # Minimum delay between steps (controls maximum speed) |
| 6 | + |
| 7 | +class A4988: |
| 8 | + def __init__(self, step_pin, dir_pin, en_pin=None): |
| 9 | + self.step_pin = step_pin |
| 10 | + self.dir_pin = dir_pin |
| 11 | + self.en_pin = en_pin |
| 12 | + if self.en_pin is not None: |
| 13 | + self.enable_motor(enabled=True) |
| 14 | + |
| 15 | + def enable_motor(self, enabled=True): |
| 16 | + """Enable or disable the motor driver (active low).""" |
| 17 | + if self.en_pin: |
| 18 | + self.en_pin.value(0 if enabled else 1) |
| 19 | + |
| 20 | + def step_motor(self, steps=STEPS_PER_REV, direction=1, delay=0.005): |
| 21 | + """Move the motor a specified number of steps in the given direction.""" |
| 22 | + self.dir_pin.value(direction) # Set direction (1 = forward, 0 = backward) |
| 23 | + for _ in range(steps): |
| 24 | + self.step_pin.value(1) |
| 25 | + time.sleep(delay) |
| 26 | + self.step_pin.value(0) |
| 27 | + time.sleep(delay) |
| 28 | + |
| 29 | + def calculate_speed(self, current_delay): |
| 30 | + """Calculate the current speed in steps per second and RPM.""" |
| 31 | + if current_delay <= 0: |
| 32 | + return 0, 0 |
| 33 | + steps_per_second = 1 / (2 * current_delay) # Delay is for each half-step |
| 34 | + rpm = (steps_per_second / STEPS_PER_REV) * 60 # Convert to RPM |
| 35 | + return steps_per_second, rpm |
| 36 | + |
| 37 | + def inc_speed(self, current_delay): |
| 38 | + """Decrease delay to increase speed, respecting minimum delay limit.""" |
| 39 | + new_delay = max(current_delay - 0.001, MIN_DELAY) |
| 40 | + return new_delay |
| 41 | + |
| 42 | + def dec_speed(self, current_delay): |
| 43 | + """Increase delay to decrease speed.""" |
| 44 | + new_delay = current_delay + 0.001 |
| 45 | + return new_delay |
| 46 | + |
| 47 | + def forward_motion(self, steps=STEPS_PER_REV, delay=0.005): |
| 48 | + """Move motor forward for a given number of steps and delay.""" |
| 49 | + self.step_motor(steps=steps, direction=1, delay=delay) |
| 50 | + |
| 51 | + def backward_motion(self, steps=STEPS_PER_REV, delay=0.005): |
| 52 | + """Move motor backward for a given number of steps and delay.""" |
| 53 | + self.step_motor(steps=steps, direction=0, delay=delay) |
0 commit comments