如何限制舵机角度值增减范围?解决舵机随机自转问题
问题分析与修复方案
核心问题
- 角度无边界限制:变量
a会持续增减,超出舵机正常工作角度范围(通常0°-180°),导致舵机过载出现随机自转。 - 逻辑执行冗余:循环内每次都会强制调用
servo(a),即使角度无需调整,频繁的指令会干扰舵机稳定。 - 舵机受力持续:设置角度后未及时停止PWM信号,舵机会一直保持受力状态,容易引发异常。
修复步骤
- 给角度变量添加边界限制,确保其始终在
0到180之间 - 优化逻辑,仅在需要调整角度时才调用舵机控制函数
- 调整舵机控制函数,设置角度后重置PWM占空比,避免持续受力
- 修正光照判断的逻辑分支,避免重复修改角度
修复后的代码
import RPi.GPIO as gpio import time servo_pin = 11 west_ldr = 21 east_ldr = 20 gpio.setmode(gpio.BCM) gpio.setup(west_ldr, gpio.IN) gpio.setup(east_ldr, gpio.IN) gpio.setup(servo_pin, gpio.OUT) pwm = gpio.PWM(servo_pin, 50) pwm.start(0) current_angle = 90 def set_servo_angle(angle): # 确保角度在有效范围内 clamped_angle = max(0, min(180, angle)) duty_cycle = clamped_angle * (1/18) + 2 pwm.ChangeDutyCycle(duty_cycle) time.sleep(0.5) # 重置占空比,避免舵机持续受力 pwm.ChangeDutyCycle(0) return clamped_angle # 初始化舵机位置 current_angle = set_servo_angle(current_angle) while True: read_west = gpio.input(west_ldr) read_east = gpio.input(east_ldr) angle_changed = False if read_west == 0: print("西向LDR检测到光照") if current_angle > 0: current_angle -= 5 angle_changed = True else: print("西向LDR无光照") if read_east == 0: print("东向LDR检测到光照") if current_angle < 180: current_angle += 5 angle_changed = True else: print("东向LDR无光照") # 仅当角度变化时才调整舵机 if angle_changed: current_angle = set_servo_angle(current_angle) # 添加短延时,避免循环过于频繁 time.sleep(0.2)
关键修改说明
- 角度边界控制:通过
max(0, min(180, angle))限制角度范围,防止超出舵机物理极限 - 舵机受力优化:设置角度后调用
pwm.ChangeDutyCycle(0),让舵机在到位后停止受力,减少异常 - 逻辑精简:引入
angle_changed标记,仅在角度需要调整时才驱动舵机,避免无效指令 - 分支修正:调整光照判断的分支逻辑,避免同时触发加减操作导致角度来回波动
内容的提问来源于stack exchange,提问作者Chiron K
相关产品推荐
相关产品推荐

