2. Let Servo Rotate¶
In this chapter, we will show you how to make the servo work.
In a nutshell, to make the servo work you need to write 0.5ms to 2.5ms pulses to it every 20ms, for the principle see 1. Introduce Servo .
So we get the following code.
Code
import machine
import time
servo = machine.PWM(machine.Pin(18))
servo.freq(50)
def mapping(x, in_min, in_max, out_min, out_max):
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
def set_angle(pin,angle):
pulse_width=mapping(angle, -90, 90, 2.5,0.5)
duty=int(mapping(pulse_width, 0, 20, 0,65535))
pin.duty_u16(duty)
for angle in range(-90,90,5):
set_angle(servo,angle)
time.sleep(0.1)
You can copy the above code into Thonny or open the sonar_2_servo_rotate.py
under the path of pico_4wd_car-v2.0\examples\learn_modules
. Then click the button or press F5
to run it.
When you power up the Pico 4WD car, you will see the servo rotate from 0° to 180°.
How it works?
Let’s analyze this code.
The servo needs to accept the signal in a 20ms cycle, which means setting a PWM with a frequency of 50Hz(1/20ms).
servo = machine.PWM(machine.Pin(18)) servo.freq(50)
Use the
mapping()
function to map the servo angle range (-90 ~ 90) to pulse width range (0.5 ~ 2.5ms).pulse_width=mapping(angle, -90, 90, 0.5,2.5)
Converts the pulse width from period to duty cycle. Since
duty_u16()
cannot be used with decimals (the value cannot be of floating point type), we useint()
to force the duty to int type.duty=int(mapping(pulse_width, 0, 20, 0,65535)) pin.duty_u16(duty)