from machine import Pin,ADC,PWM
import time
#定义18 4 引脚为舵机控制PWM,频率50hz,即一个周期0.02s
#初始化占空比让舵机归位
p18=PWM(Pin(18,Pin.OUT),freq=50,duty=26)
p4=PWM(Pin(4,Pin.OUT),freq=50,duty=26)
# 定义摇杆引脚
ps2y=ADC(Pin(33))
ps2x=ADC(Pin(32))
# 设置输出的模拟值在0-4095之间
ps2y.atten(ADC.ATTN_11DB)
ps2x.atten(ADC.ATTN_11DB)
#设置舵机初始角度值为0
anglex=0
angley=0
#限定舵机转动角度为0-180
#舵机在20ms为一个周期内,若高电平时间为0.5ms,则转动方向为0
#有下表: 0.5ms 0°
# 1ms 45°
# 1.5ms 90°
# 2ms 135°
# 2.5ms 180°
# 从0-180之间有2ms的时间间隔,推出舵机转动1°(angle=1)的占空比公式:
# pw=((angle/180*2000)+500)/20000*65535
#65535与PWM设置的精度有关,esp32默认就是65535
#向左
def move_l():
# 定义全局变量,方便在函数内修改
global anglex
#让舵机转动1°
anglex += 1
if anglex > 180:
anglex = 180
#括号内的值在0-65535之间,其与65535的比值为占空比
pw=((anglex/180*2000)+500)/20000*65535
p4.duty_u16(int(pw))
#向右
def move_r():
# 定义全局变量,方便在函数内修改
global anglex
#让舵机相反方向转动1°
anglex -= 1
if anglex < 0:
anglex=0
pw=((anglex/180*2000)+500)/20000*65535
p4.duty_u16(int(pw))
#向上
def move_u():
# 定义全局变量,方便在函数内修改
global angley
#让舵机转动1°
angley += 1
if angley > 180:
angley=0
pw=((angley/180*2000)+500)/20000*65535
p18.duty_u16(int(pw))
#向右
def move_d():
# 定义全局变量,方便在函数内修改
global angley
#让舵机相反方向转动1°
angley -= 1
if angley < 0:
angley=0
pw=((angley/180*2000)+500)/20000*65535
p18.duty_u16(int(pw))
while True:
#用选择语句对摇杆的方向进行判断
if ps2y.read()<1600:
move_l()
elif ps2y.read()>2000:
move_r()
if ps2x.read()<1600:
move_u()
elif ps2x.read()>2000:
move_d()
#调节摇杆灵敏度
time.sleep_ms(10)
接线图