You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制舵机角度值增减范围?解决舵机随机自转问题

问题分析与修复方案

核心问题

  1. 角度无边界限制:变量a会持续增减,超出舵机正常工作角度范围(通常0°-180°),导致舵机过载出现随机自转。
  2. 逻辑执行冗余:循环内每次都会强制调用servo(a),即使角度无需调整,频繁的指令会干扰舵机稳定。
  3. 舵机受力持续:设置角度后未及时停止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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 16:05:13