class PWMMotor: def __init__(self, dir_pin1, dir_pin2, enable_pin, flip_dir=False): self._dir_pin1 = dir_pin1 self._dir_pin2 = dir_pin2 self._enable = enable_pin self._flip_dir = flip_dir self._direction = True self._speed = 0.0 @property def forward(self): return self._direction @forward.setter def forward(self, direction): check = not direction if self._flip_dir else direction if check: self._dir_pin1.on() self._dir_pin2.off() self._direction = True else: self._dir_pin1.off() self._dir_pin2.on() self._direction = False @property def speed(self): return self._speed @speed.setter def speed(self, percentage): f_percentage = float(percentage) if f_percentage < 0 or f_percentage > 100: raise ValueError('Speed must be a float or int from 0 to 100') self._enable.duty(int(1023 / 100 * f_percentage)) self._speed = f_percentage class ServoMotor(PWMMotor): def __init__(self, dir_pin1, dir_pin2, enable_pin, flip_dir=False, sensor_pin_a=None, sensor_pin_b=None): super().__init__(dir_pin1, dir_pin2, enable_pin, flip_dir=False) sensor_pin_a = sensor_pin_a sensor_pin_b = sensor_pin_b class MotorController: def __init__(self, dir_pin_a1=None, dir_pin_a2=None, enable_pin_a=None, flip_dir_a=False, dir_pin_b1=None, dir_pin_b2=None, enable_pin_b=None, flip_dir_b=False): self.motor_a = PWMMotor(dir_pin_a1, dir_pin_a2, enable_pin_a, flip_dir_a) self.motor_b = PWMMotor(dir_pin_b1, dir_pin_b2, enable_pin_b, flip_dir_b)