from machine import Pin, PWM, ADC
import time
# 1. DC Motor Setup (GP15)
dc_motor = PWM(Pin(15))
dc_motor.freq(1000)
# 2. Servo Setup (GP16)
servo = PWM(Pin(16))
servo.freq(50) # Servos require exactly 50Hz
# 3. Potentiometer (GP26)
pot = ADC(26)
# Servo pulse helper
def set_servo_duty(angle):
# Map 0-180 degrees to ~1638-8192 duty (0.5ms to 2.5ms)
duty = int(((angle / 180) * 6554) + 1638)
servo.duty_u16(duty)
current_angle = 0
step_direction = 1
while True:
# Read Potentiometer
pot_val = pot.read_u16()
# 1. Update DC Motor Speed
dc_motor.duty_u16(pot_val)
# 2. Calculate Servo "Speed" (Delay)
# Mapping pot to a delay between 0.001s (Fast) and 0.05s (Slow)
# Note: If pot is 0, we stop the servo
speed_delay = (65535 - pot_val) / 1000000 + 0.001
if pot_val > 1000:
# Move servo one step
current_angle += step_direction
if current_angle >= 180 or current_angle <= 0:
step_direction *= -1 # Reverse direction at boundaries
set_servo_duty(current_angle)
speed_percent = int((pot_val / 65535) * 100)
print(f"DC Speed: {speed_percent}% | Servo Speed: {speed_percent}%", end="\r")
else:
print("Motors Stopped... ", end="\r")
time.sleep(speed_delay)