Mercurial > ukubik
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
