Mercurial > micropython-pca9685
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)
