# Rui Santos & Sara Santos - Random Nerd Tutorials # Complete project details at https://RandomNerdTutorials.com/raspberry-pi-pico-servo-motor-micropython/ from machine import Pin, PWM class Servo: __servo_pwm_freq = 50 __min_u16_duty = 1802 __max_u16_duty = 7864 min_angle = 0 max_angle = 180 current_angle = 0.001 def __init__(self, pin): self.__initialise(pin) def update_settings(self, servo_pwm_freq, min_u16_duty, max_u16_duty, min_angle, max_angle, pin): self.__servo_pwm_freq = servo_pwm_freq self.__min_u16_duty = min_u16_duty self.__max_u16_duty = max_u16_duty self.min_angle = min_angle self.max_angle = max_angle self.__initialise(pin) def move(self, angle): # round to 2 decimal places, so we have a chance of reducing unwanted servo adjustments angle = round(angle, 2) # do we need to move? if angle == self.current_angle: return self.current_angle = angle # calculate the new duty cycle and move the motor duty_u16 = self.__angle_to_u16_duty(angle) self.__motor.duty_u16(duty_u16) def stop(self): self.__motor.deinit() def get_current_angle(self): return self.current_angle def __angle_to_u16_duty(self, angle): return int((angle - self.min_angle) * self.__angle_conversion_factor) + self.__min_u16_duty def __initialise(self, pin): self.current_angle = -0.001 self.__angle_conversion_factor = (self.__max_u16_duty - self.__min_u16_duty) / (self.max_angle - self.min_angle) self.__motor = PWM(Pin(pin)) self.__motor.freq(self.__servo_pwm_freq)