from machine import Pin
import time
 
# 引脚初始化
in1 = Pin(21, Pin.OUT)
in2 = Pin(20, Pin.OUT)
in3 = Pin(19, Pin.OUT)
in4 = Pin(18, Pin.OUT)
 
# 延时时间
delay = 1
 
# 电机旋转一圈所需的步数，(约360°)，有轻微的偏差
ROUND_VALUE = 509
 
# 四相八拍步进电机顺序值:A-AB-B-BC-C-CD-D-DA-A.
STEP_VALUE = [
    [1, 0, 0, 0],
    [1, 1, 0, 0],
    [0, 1, 0, 0],
    [0, 1, 1, 0],
    [0, 0, 1, 0],
    [0, 0, 1, 1],
    [0, 0, 0, 1],
    [1, 0, 0, 1],
]
 
# 引脚输出低电平
def reset():
    in1(0)
    in2(0)
    in3(0)
    in4(0)
 
# 如果计数为正整数，则顺时针旋转，如果计数为负整数，则逆时针旋转
def step_run(count):
    direction = 1     # 顺时针方向旋转
    if count < 0:
        direction = -1  # 逆时针方向旋转
        count = -count
    for x in range(count):
        for bit in STEP_VALUE[::direction]:
            in1(bit[0])
            in2(bit[1])
            in3(bit[2])
            in4(bit[3])
            time.sleep_ms(delay)
    reset()
 
# 如果a是正整数,则顺时针旋转，如果a是负整数,则逆时针旋转
def step_angle(a):
    step_run(int(ROUND_VALUE * a / 360))
 
# 循环:顺时针转一圈，再逆时针转一圈.
while True:
    step_run(509)
    step_run(-509)
    step_angle(360)
    step_angle(-360)