from machine import Pin
import time

# D0–D3 = GPIO26–29
IN1 = Pin(26, Pin.OUT)
IN2 = Pin(27, Pin.OUT)
IN3 = Pin(28, Pin.OUT)
IN4 = Pin(29, Pin.OUT)

pins = [IN1, IN2, IN3, IN4]

# Half-step sequence (smooth)
sequence = [
    [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],
]

step_count = 0

def set_step(pattern):
    for pin, val in zip(pins, pattern):
        pin.value(val)

def stop_motor():
    for pin in pins:
        pin.value(0)

def step_motor(steps, delay_ms=3, direction=1):
    global step_count
    seq_len = len(sequence)

    for i in range(steps):
        index = i % seq_len
        if direction == -1:
            index = (seq_len - 1) - index

        set_step(sequence[index])
        step_count += direction
        print("Step:", step_count)

        time.sleep_ms(delay_ms)

    stop_motor()

# Main loop
while True:
    print("Forward 256 steps")
    step_motor(256, delay_ms=3, direction=1)
    time.sleep(1)

    print("Backward 256 steps")
    step_motor(256, delay_ms=3, direction=-1)
    time.sleep(1)