You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

57 lines
1.7 KiB
Python

from machine import Pin, PWM
class PWMMotor:
def __init__(self, pin_ia, pin_ib, freq=1000, flip_dir=False):
"""
:param pin_ia: Pin connected to IA on L9110S
:param pin_ib: Pin connected to IB on L9110S
:param freq: PWM frequency (default 1000Hz)
:param flip_dir: Boolean to reverse logical forward/backward
"""
# Initialize PWM on both pins
self._pwm_a = PWM(Pin(pin_ia), freq=freq)
self._pwm_b = PWM(Pin(pin_ib), freq=freq)
# Start with motor off
self._pwm_a.duty_u16(0)
self._pwm_b.duty_u16(0)
self._flip_dir = flip_dir
self._speed = 0.0 # Range -1.0 to 1.0
def set_speed(self, speed):
"""
Sets motor speed and direction.
:param speed: Float between -1.0 (reverse) and 1.0 (forward)
"""
self._speed = max(-1.0, min(1.0, speed))
# Adjust for flip_dir preference
effective_speed = -self._speed if self._flip_dir else self._speed
# Convert 0.0-1.0 to 16-bit duty cycle (0-65535)
duty = int(abs(effective_speed) * 65535)
if effective_speed > 0:
# Forward: PWM on A, B held at 0
self._pwm_a.duty_u16(duty)
self._pwm_b.duty_u16(0)
elif effective_speed < 0:
# Reverse: B held at 0, PWM on B
self._pwm_a.duty_u16(0)
self._pwm_b.duty_u16(duty)
else:
# Stop
self.stop()
def stop(self):
self._pwm_a.duty_u16(0)
self._pwm_b.duty_u16(0)
self._speed = 0.0
def deinit(self):
"""Release the PWM hardware"""
self._pwm_a.deinit()
self._pwm_b.deinit()