树莓派Python控制MG995舵机无法实现精准角度控制求助
MG995舵机精准角度控制问题解决(树莓派)
问题描述
使用Tower Pro MG995舵机为小型机器人实现车轮转向时,遇到以下问题:
- 无法精准控制舵机转到指定角度,转动时长完全依赖
time.sleep设置 - 多次执行同一角度命令,舵机无法保持相同位置
- 调整
time.sleep时长、手动修改占空比后,仍无法达到理想精度
原代码
import RPi.GPIO as GPIO from time import sleep servo_pin = 18 GPIO.setmode(GPIO.BCM) GPIO.setup(servo_pin, 50) pwm= GPIO.PWM(servo_pin, 50) pwm.start(0) def move_servo(angle): duty = angle / 18 + 3 GPIO.output(servo_pin, True) pwm.ChangeDutyCycle(duty) sleep(1) GPIO.output(servo_pin, False) pwm.ChangeDutyCycle(duty) move_servo(35) pwm.stop() GPIO.cleanup()
解决方案
1. 修复核心代码错误
原代码存在两处关键问题:GPIO模式设置错误、多余的电平输出操作。修正后的代码如下:
import RPi.GPIO as GPIO from time import sleep servo_pin = 18 GPIO.setmode(GPIO.BCM) GPIO.setup(servo_pin, GPIO.OUT) # 正确设置为输出模式 pwm = GPIO.PWM(servo_pin, 50) # MG995标准PWM频率为50Hz pwm.start(0) def move_servo(angle): # MG995标准占空比范围:2.5%对应0度,12.5%对应180度,公式调整为更准确的版本 duty = angle / 18 + 2.5 pwm.ChangeDutyCycle(duty) sleep(0.5) # 给舵机足够时间完成转动并稳定,0.5秒足够覆盖MG995的转动耗时 pwm.ChangeDutyCycle(0) # 停止PWM输出,避免舵机持续抖动 try: move_servo(35) finally: pwm.stop() GPIO.cleanup()
2. 手动校准舵机角度
不同批次的MG995可能存在占空比-角度的细微偏差,需要校准:
- 测试0度:设置占空比2.5%,观察舵机位置,若未到最左端,微调公式中的偏移值(比如改成2.3或2.7)
- 测试180度:设置占空比12.5%,同理调整偏移值,直到角度匹配预期
- 校准完成后,固定公式中的参数,确保每次调用都能输出正确的占空比
3. 使用更精准的PWM控制库
树莓派自带的RPi.GPIO库软件PWM精度有限,推荐使用pigpio实现硬件级PWM控制:
- 安装并启用服务:
sudo apt-get install pigpio sudo systemctl enable pigpiod && sudo systemctl start pigpiod - 示例代码:
import pigpio from time import sleep servo_pin = 18 pi = pigpio.pi() # 连接pigpio服务 def move_servo(angle): # MG995的脉冲宽度范围为500us(0度)到2500us(180度) pulse_width = 500 + (angle / 180) * 2000 pi.set_servo_pulsewidth(servo_pin, pulse_width) sleep(0.5) pi.set_servo_pulsewidth(servo_pin, 0) # 停止脉冲输出 try: move_servo(35) finally: pi.stop() # 断开连接
4. 检查机械结构
若校准后角度仍不稳定,排查机械问题:
- 舵机输出轴与转向连杆的连接是否松动
- 车轮转向机构是否有卡顿、阻力过大的情况
- 舵机安装是否牢固,运行中是否存在位移
内容的提问来源于stack exchange,提问作者Cooler Mann
相关产品推荐
相关产品推荐

