树莓派3与SG90微型舵机异常问题排查:C++及GPIO工具代码无效但Python与pigpio可正常运行
我来帮你排查一下C++和gpio工具控制舵机失效的问题——先从你给出的连接和测试信息入手分析:
舵机与树莓派GPIO连接说明
- 舵机棕色线(GND):连接引脚#9(GND)
- 舵机红色线(5V供电):连接引脚#2(5VO)
- 舵机黄色线(信号):连接引脚#11(GPIO 17)
已验证可行的方案
Python(gpiozero)
代码运行正常,舵机能按预期切换位置:
from gpiozero import Servo from time import sleep servo = Servo(17) while True: servo.mid() sleep(0.5) servo.min() sleep(0.5) servo.max() sleep(0.5)
pigpio
操作完全正常,舵机响应符合预期:
sudo pigpiod # 启动守护进程 pigs s 17 1500 # 中位 pigs s 17 1000 # 安全逆时针 pigs s 17 2000 # 安全顺时针
问题排查:C++(wiringPi)与gpio工具失效原因
1. C++代码的核心问题
你的wiringPi代码里,PWM脉冲宽度的数值设置错误。舵机需要的是50Hz频率(周期20ms)的信号,有效脉冲宽度范围通常是1ms(最小位置)到2ms(最大位置),中位是1.5ms。
你代码里的pwmSetClock(192)和pwmSetRange(2000)是正确的(计算下来刚好是20ms周期),但pwmWrite的参数完全不对:
- 1ms脉冲对应数值是
100(2000*(1/20)) - 1.5ms对应
150 - 2ms对应
200
你写的50对应0.5ms(远低于舵机响应阈值),250对应2.5ms(超过大部分舵机的安全范围,触发保护),所以舵机完全没反应。
修正后的C++代码(还加了初始化失败判断):
#include <cstdio> // printf() #include <wiringPi.h> // wiringPiSetupGpio() pinMode() pwmSetMode() pwmSetRange() pwmSetClock() pwmWrite() delay() int main() { int pin = 17; printf("Raspberry Pi wiringPi test program\n"); if(wiringPiSetupGpio() == -1) { printf("wiringPi initialization failed!\n"); return 1; } pinMode(pin, PWM_OUTPUT); pwmSetMode(PWM_MODE_MS); pwmSetClock(192); pwmSetRange(2000); while (true) { pwmWrite(pin, 100); // 1ms - 最小位置 delay(1000); pwmWrite(pin, 150); // 1.5ms - 中位 delay(1000); pwmWrite(pin, 200); // 2ms - 最大位置 delay(1000); } return 0; }
2. gpio工具的问题点
同样是操作时的编号模式问题,你之前的命令里gpio pwm-ms没有加-g参数,导致模式设置没有应用到BCM编号的GPIO17上,舵机自然没反应。正确的操作步骤应该是:
# 全程使用BCM编号(-g参数) gpio -g mode 17 pwm gpio -g pwm-ms gpio -g pwmc 192 gpio -g pwmr 2000 # 测试中位 gpio -g pwm 17 150 sleep 1 # 测试最大位置 gpio -g pwm 17 200 sleep 1 # 测试最小位置 gpio -g pwm 17 100
额外提示
- 可以用
gpio -v检查wiringPi版本,旧版本可能存在PWM相关bug,必要时更新库 - 如果舵机电流较大,建议用外部电源供电,避免树莓派5V引脚过载导致异常
内容的提问来源于stack exchange,提问作者GFB
相关产品推荐
相关产品推荐

