changeset 3:c8dec836f7a4

Add a servo controller class
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Mon, 27 Jun 2016 22:52:00 +0200
parents d4bc1dc37e39
children c8edef7bd81c
files servo.py
diffstat 1 files changed, 35 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/servo.py	Mon Jun 27 22:52:00 2016 +0200
@@ -0,0 +1,35 @@
+import pca9685
+import math
+
+
+class Servos:
+    def __init__(self, i2c, address=0x40, freq=50, min_us=600, max_us=2400,
+                 degrees=180):
+        self.min_duty = self._us2duty(min_us)
+        self.max_duty = self._us2duty(max_us)
+        self.degrees = degrees
+        self.freq = freq
+        self.period = 1000000 / freq
+        self.pca9685 = pca9685.PCA9685(i2c, address)
+        self.pca9685.freq(freq)
+
+    def _us2duty(self, value):
+        return int(4095 * value / self.period)
+
+    def position(self, index, degrees=None, radians=None, us=None, duty=None):
+        span = self.max_duty - self.min_duty
+        if degrees is not None:
+            duty = self.min_duty + span * degrees / self.degrees
+        elif radians is not None:
+            duty = self.min_duty + span * radians / math.radians(self.degrees)
+        elif us is not None:
+            duty = self._us2duty(us)
+        elif duty is not None:
+            pass
+        else:
+            return self.pca9685.duty(index)
+        duty = min(self.max_duty, max(self.min_duty, int(duty)))
+        self.pca9685.duty(index, duty)
+
+    def release(self, index):
+        self.pca9685.duty(index, 0)