'''
Reference
https://wokwi.com/projects/334512724199342674
https://how2electronics.com/control-stepper-motor-with-a4988-raspberry-pi-pico/
https://iot.keicode.com/arduino/arduino-stepper-motor-a4988.php
https://lastminuteengineers.com/a4988-stepper-motor-driver-arduino-tutorial/
Half step mode enabled by connecting the MS1 pin of the A4988 driver to a high logic level (3.3V from the Raspberry Pi Pico).
'''
from machine import Pin
import utime
class Stepper:
def __init__(self, step_pin, dir_pin):
self.step_pin = Pin(step_pin, Pin.OUT)
self.dir_pin = Pin(dir_pin, Pin.OUT)
def set_speed(self, rpm):
steps_per_rev = 400 # 200 full steps * 2 (half-step mode)
self.delay = 60 / (steps_per_rev * rpm) # delay in seconds
def set_direction(self, direction):
self.dir_pin.value(direction)
def step(self):
self.step_pin.value(1)
utime.sleep_us(2) # High pulse width of at least 1 microsecond
self.step_pin.value(0)
utime.sleep(self.delay)
def move(self, direction, steps):
self.set_direction(direction)
for _ in range(steps):
self.step()
# Define the pins
dir_pin = 2 # GPIO number where dir pin is connected
step_pin = 3 # GPIO number where step pin is connected
# Initialize stepper
stepper = Stepper(step_pin, dir_pin)
def loop():
while True:
# Move forward 2 revolutions (800 half-steps) at 60 RPM
stepper.set_speed(60) # Set speed in RPM
stepper.move(direction=1, steps=800)
utime.sleep(1)
# Move backward 1 revolution (400 half-steps) at 180 RPM
stepper.set_speed(180)
stepper.move(direction=0, steps=400)
utime.sleep(1)
# Move forward 3 revolutions (1200 half-steps) at 120 RPM
stepper.set_speed(120)
stepper.move(direction=1, steps=1200)
utime.sleep(3)
if __name__ == '__main__':
loop()