changeset 52:5b268cd253ff

Use freqencies not angles.
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Fri, 22 Aug 2014 14:22:20 +0200
parents c3c959e09dc8
children 477b5bb22e33
files servo.py
diffstat 1 files changed, 12 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/servo.py	Fri Aug 22 13:32:53 2014 +0200
+++ b/servo.py	Fri Aug 22 14:22:20 2014 +0200
@@ -10,10 +10,14 @@
         angle += 360
     return angle
 
+def _word(value):
+    return chr(value & 0xff) + chr(value & 0xff00 >> 8)
 
 class Servo(object):
     span = 180
     center = 90
+    min_freq = 600
+    max_freq = 2400
 
     def __init__(self, serial, index, reverse=False, trim=0):
         self.index = index
@@ -24,14 +28,14 @@
 
     def update(self):
         angle = self.calculate_angle()
-        command = '\xff%c%c' % (self.index, angle)
+        command = '\xff%c%c' % (self.index, int(angle))
         self.serial.write(command)
 
     @classmethod
     def update_all(cls, servos):
         serial = servos[0].serial
         servos = sorted(servos, key=lambda servo: servo.index)
-        command = '\xfe%s' % ''.join('%c' % servo.calculate_angle()
+        command = '\xfc%s' % ''.join(_word(servo.calculate_freq())
                                      for servo in servos)
         serial.write(command)
 
@@ -49,8 +53,13 @@
         angle = min(max(0, self.center + position + self.trim), self.span)
         return angle
 
+    def calculate_freq(self):
+        angle = self.calculate_angle()
+        return int(self.min_freq +
+                   angle * (self.max_freq - self.min_freq) / self.span)
+
     def move_degrees(self, degrees):
-        degrees = int(_normalize_degrees(degrees))
+        degrees = _normalize_degrees(degrees)
         if not self.center - self.span <= degrees <= self.center + self.span:
             raise ValueError("Servo angle out of range.")
         self.position = degrees