Mercurial > micropython-pca9685
changeset 2:d4bc1dc37e39
Add DC motor driver
| author | Radomir Dopieralski <sheep-devel@sheep.art.pl> |
|---|---|
| date | Mon, 27 Jun 2016 22:32:52 +0200 |
| parents | 4740a9fdbc7c |
| children | c8dec836f7a4 |
| files | motor.py |
| diffstat | 1 files changed, 45 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/motor.py Mon Jun 27 22:32:52 2016 +0200 @@ -0,0 +1,45 @@ +import pca9685 + + +_DC_MOTORS = ((8, 9, 10), (13, 12, 11), (2, 3, 4), (7, 6, 5)) + + +class DCMotors: + def __init__(self, i2c, address=0x40, freq=1600): + self.pca9685 = pca9685.PCA9685(i2c, address) + self.pca9685.freq(freq) + + def _pin(self, pin, value=None): + if value is None: + return bool(self.pca9685.pwm(pin)[0]) + if value: + self.pca9685.pwm(pin, 4096, 0) + else: + self.pca9685.pwm(pin, 0, 0) + + def speed(self, index, value=None): + pwm, in2, in1 = _DC_MOTORS[index] + if value is None: + value = self.pca9685.duty(pwm) + if self._pin(in2) and not self._pin(in1): + value = -value + return value + if value > 0: + # Forward + self._pin(in2, False) + self._pin(in1, True) + elif value < 0: + # Backward + self._pin(in1, False) + self._pin(in2, True) + else: + # Release + self._pin(in1, False) + self._pin(in2, False) + self.pca9685.duty(pwm, abs(value)) + + def brake(self, index): + pwm, in2, in1 = _DC_MOTORS[index] + self._pin(in1, True) + self._pin(in2, True) + self.pca9685.duty(pwm, 0)
