servo.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. class Servo_mcu:
  2. def mcu_init(self,pin, freq, duty): self.pwm = machine.PWM(pin, freq,duty)
  3. def mcu_duty(self,duty): self.pwm.duty(duty)
  4. def mcu_idle(self): self.pwm.duty(0)
  5. mcu_stop = mcu_idle
  6. class Servo(Servo_mcu):
  7. def call(self,o, freq=50, min_us=500, max_us=2300, angle=180 ):
  8. self.min_us = min_us
  9. self.max_us = max_us
  10. self.us = 0
  11. self.freq = freq
  12. self.angle = angle
  13. self.mcu_init(o[-1],freq,0)
  14. return [self]
  15. def free(self): self.pwm = None
  16. def write_us(self, us):
  17. if us == 0:
  18. self.pwm.duty(0)
  19. return
  20. us = min(self.max_us, max(self.min_us, us))
  21. duty = us * 1024 * self.freq // 1000000
  22. self.mcu_duty(duty)
  23. def set_angle(self, degrees=None, radians=None):
  24. if degrees is None:
  25. raise #degrees = math.degrees(radians)
  26. degrees = degrees % 360
  27. total_range = self.max_us - self.min_us
  28. us = self.min_us + total_range * degrees // self.angle
  29. self.write_us(us)
  30. def set_table(self,left=0,neutral=90,right=180):
  31. self.neutral = float(neutral)
  32. self.set_angle(neutral)
  33. self.lc = float(neutral - left) / 90.0
  34. self.rc = float(right - neutral) / 90.0
  35. self.rn = None
  36. def remap(self,l,n,r):
  37. self.rl = -( 90.0 / (n-l) )
  38. self.rn = n
  39. self.rr = 90.0 / (r-n)
  40. def set_pos(self,orel=0):
  41. rel =orel
  42. if self.rn is not None:
  43. if rel<self.rn:
  44. rel = (self.rn - rel ) * self.rl
  45. elif rel>self.rn:
  46. rel = (rel - self.rn ) * self.rr
  47. else:
  48. rel=0.0
  49. if rel<0:
  50. rel = 90+rel
  51. rel= int(rel * self.lc)
  52. elif rel>0:
  53. rel = int( self.neutral + rel*self.rc )
  54. else:
  55. rel = int(self.neutral)
  56. self.set_angle(rel)
  57. return orel