astra/nema17-stepper-motor-controller-spring-clamp-rp2040
A 4-layer RP2040 controller board that negotiates USB‑C PD motor power and drives a NEMA17 stepper via a DRV8825, with current sensing, thermal shutdown, RGB status LED, buzzer alarm, optional AS5600 encoder, protection/filtering, and test points.
- Version
- 1.4.0
- License
- unset
- Stars
- 0
firmware/test_current_status.py
import unittest
from current_monitor import CurrentMonitor, current_amperes
from status_led import StatusLed, health_color
from thermal_policy import ThermalPolicy
class ADC:
def __init__(self, value): self.value = value
def read_u16(self): return self.value
class PWM:
def freq(self, hz): self.hz = hz
def duty_u16(self, value): self.duty = value
def deinit(self): self.closed = True
class CurrentStatusTests(unittest.TestCase):
def test_bidirectional_scale(self):
for amperes in (-1, 0, 1):
raw = (1.65 + amperes) / 3.3 * 65535
self.assertAlmostEqual(current_amperes(raw), amperes)
def test_independent_channels_and_clipping(self):
a, b = ADC(round(2.65/3.3*65535)), ADC(round(.65/3.3*65535))
m = CurrentMonitor(a,b)
values = m.sample()
self.assertAlmostEqual(values[0], 1, places=4)
self.assertAlmostEqual(values[1], -1, places=4)
self.assertFalse(m.clipped)
a.value = 65535
m.sample()
self.assertTrue(m.clipped)
a.value = 32768
m.sample()
self.assertFalse(m.clipped)
def test_health_and_pwm_shutdown(self):
p = ThermalPolicy()
self.assertEqual(health_color(p), (1,0,0))
p.sample(25)
self.assertEqual(health_color(p), (0,0,1))
self.assertTrue(p.arm())
self.assertEqual(health_color(p), (0,1,0))
p.sample(68)
self.assertEqual(health_color(p), (1,0.35,0))
p.sample(80)
self.assertEqual(health_color(p), (1,0,0))
p.sample(25)
self.assertEqual(health_color(p), (1,0,0))
p.trip('motor driver fault')
self.assertEqual(health_color(p), (1,0,0))
channels = [PWM(),PWM(),PWM()]
led = StatusLed(*channels)
led.update(p)
self.assertEqual([c.duty for c in channels], [65535,0,0])
led.close()
self.assertTrue(all(c.duty == 0 and c.closed for c in channels))
if __name__ == '__main__': unittest.main()