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)