54 lines
1.3 KiB
Python
54 lines
1.3 KiB
Python
"""
|
|
Servo
|
|
|
|
MicroPython library for the Servo(0~180°)
|
|
=======================================================
|
|
|
|
#Preliminary composition 20220803
|
|
|
|
dahanzimin From the Mixly Team
|
|
"""
|
|
from machine import Pin,PWM
|
|
|
|
class Servo:
|
|
__species = {}
|
|
__first_init = True
|
|
|
|
def __new__(cls, pin, *args, **kwargs):
|
|
if pin not in cls.__species.keys():
|
|
cls.__first_init = True
|
|
cls.__species[pin]=object.__new__(cls)
|
|
return cls.__species[pin]
|
|
|
|
def __init__(self,pin):
|
|
if self.__first_init:
|
|
self.__first_init = False
|
|
self._pulse=None
|
|
self.pwm = PWM(Pin(pin), duty=0, freq=50)
|
|
|
|
def servo_write(self,pulse):
|
|
self._pulse=pulse
|
|
self.pwm.duty_u16(int(1638.375 + 6553.5 * pulse))
|
|
|
|
def servo_read(self):
|
|
return self._pulse
|
|
|
|
#-------Method usage of class--------
|
|
|
|
def servo180_angle(pin,angle=None):
|
|
if angle is None:
|
|
return int(Servo(pin).servo_read()*180)
|
|
else:
|
|
if not 0<= angle <= 180:
|
|
raise ValueError("The effective range of the servo(180) angle is 0~180°")
|
|
Servo(pin).servo_write(angle/180)
|
|
|
|
|
|
def servo360_speed(pin,speed=None):
|
|
if speed is None:
|
|
return int(Servo(pin).servo_read()*200-100)
|
|
else:
|
|
if not -100<= speed <= 100:
|
|
raise ValueError("The effective range of the servo(360) speed is -100~100%")
|
|
Servo(pin).servo_write((speed+100)/200)
|