seveibar/nema17-stepper-motor-driver-tmc2209-usb-pd

RP2040-based USB-C PD stepper-motor controller with TMC2209 drive, AS5600 position feedback, TMP102 thermal shutdown, current/voltage telemetry, RGB status LED, and protected buzzer alarm circuitry.

Version
0.2.0
License
unset
Stars
0

firmware/status_led.py

"""TZ-0807Z1RGB-5V-I4-MS(5mA), GPIO25, GRB, deliberately dim."""
MAX_CHANNEL = 8  # 8/255 duty; ~0.16 mA average per color at the 5 mA rating.
TIMING_NS = (300, 950, 950, 300)  # Manufacturer T0H/T1L 0.2–0.35 us.


def grb_frame(red, green, blue):
    return bytes(max(0, min(MAX_CHANNEL, int(c))) for c in (green, red, blue))


class StatusLED:
    def __init__(self):
        from machine import Pin, bitstream
        from time import sleep_us
        self.pin = Pin(25, Pin.OUT, value=0)
        self.bitstream = bitstream
        self.sleep_us = sleep_us
        self.last = None
        self.set(0, 0, 0)

    def set(self, red, green, blue):
        frame = grb_frame(red, green, blue)
        if frame != self.last:
            self.bitstream(self.pin, 0, TIMING_NS, frame)
            self.sleep_us(100)  # Datasheet reset >80 us.
            self.last = frame

    def update(self, stopped, warm, now_ms):
        if stopped:
            self.set(8 if (now_ms // 250) % 2 else 0, 0, 0)
        elif warm:
            self.set(8, 3, 0)
        else:
            self.set(0, 4, 0)