KevsRobots Learning Platform
56% Percent Complete
By Kevin McAleer, 3 Minutes
Page last updated May 10, 2025
With a fixed ultrasonic sensor, your robot can only detect whatβs directly in front of it. By mounting the sensor on a servo motor, you can scan the surroundings and make smarter decisions based on a wider field of view.
A servo motor rotates to a specific angle between 0Β° and 180Β°. You control it by sending PWM signals with specific duty cycles that correspond to different angles.
β οΈ Some servos draw a lot of current β consider powering them from the L298N 5V output or a separate regulator.
from machine import Pin, PWM
from time import sleep
servo = PWM(Pin(10))
servo.freq(50)
def set_angle(angle):
duty = int(1638 + (angle / 180) * 4912) # Convert 0β180Β° to duty cycle
servo.duty_u16(duty)
# Sweep
while True:
for angle in range(0, 181, 15):
set_angle(angle)
sleep(0.1)
for angle in range(180, -1, -15):
set_angle(angle)
sleep(0.1)
Combine the servo sweep with distance measurement:
from machine import Pin, PWM, time_pulse_us
from time import sleep
servo = PWM(Pin(10))
servo.freq(50)
trigger = Pin(8, Pin.OUT)
echo = Pin(9, Pin.IN)
def set_angle(angle):
duty = int(1638 + (angle / 180) * 4912)
servo.duty_u16(duty)
sleep(0.15)
def get_distance():
trigger.low()
sleep(0.002)
trigger.high()
sleep(0.01)
trigger.low()
duration = time_pulse_us(echo, 1, 30000)
return duration / 58
# Scan and print distance at each angle
for angle in range(0, 181, 30):
set_angle(angle)
dist = get_distance()
print(f"Angle: {angle}Β°, Distance: {dist:.1f} cm")
sleep(0.2)
Choose direction to turn based on obstacle data
Now your robot can look around before moving β just like a cautious driver!
Next up: Bluetooth Control with HC-05
You can use the arrows β β
on your keyboard to navigate between lessons.