发布时间: 2026-05-28
许许多多刚着手接触树莓派以及舵机控制的友人, 会遭遇一个共通的困惑, 那就是: 缘何我依据网上的教程来进行接线, 运用C++编写的程序, 舵机却全然没有反应, 或者仅仅只能转到一个方向呢? 这通常并非是由于硬件损坏了, 而是因为C++代码之中欠缺了关键的时序控制抑或是引脚配置。本教程将会一步一步地引领你从起始处搭建一个稳定的、可以调节的舵机控制程序, 使得你能用C++在树莓派上精准地控制舵机旋转到任意的角度。
于着手编写代码以前, 要保证你的树莓派已然安装了操作系统(推荐为 Pi OS), 且连接了网络。在硬件这块, 你所需的是:
一个标准的PWM舵机(如SG90、等)
一根公对母杜邦线
一个面包板(可选,但推荐)
接线方式:
重点提示, 舵机于转动之际耗电颇为巨大, 要是多个舵机一块开展工作, 奉劝选用外部电源予以供电, 切莫径去仰仗树莓派彼之5V引脚, 不然的话没准会致使系统处于不稳定之状。
控制舵机要借助PWM(脉冲宽度调制)信号, 一个典型的PWM周期是20ms(频率50Hz), 在这样的周期当中, 舵机旋转角度由高电平持续时间来决定。
0°时, 高电平的时长大约是0.5ms, 其占空比为2.5%。
![]()
九十度, 高电平大概是一点五毫秒有这么个时长(占空比为百分之七点五)。
180°的状态下, 高电平持续的时间大概是2.5ms, 其占空比为12.5%。
舵机存在着不同的品牌, 还有不同的型号, 针对于这些舵机而言, 它们所对应的脉冲范围, 有可能会存在着略微的差异, 然而上述所提到的数值, 是属于通用的参考基准。
在树莓派上去对GPIO实施控制从而输出PWM信号, 较为直接的那种方式是借助/sys/class/pwm文件系统接口, 接下来呈现的是一个完整的、能够直接运行的C++程序。
#
#
#
#
#
// 使用树莓派的PWM0通道,对应
# "/sys/class/pwm/"
# 0
class {
:
std:: ;
std:: ;
std:: ;
std:: ;
std:: ;
void (const std::& path, const std::& value) {
std:: file(path);
if (!file.()) {
std::cerr << "无法写入: " << path << std::endl;
exit(1);
}
file << value;
file.close();
}
:
() {
= + std::("/");
= + std::("/");
= + std::("/pwm") + std::() + "/";
= + std::("/pwm") + std::() + "/";
= + std::("/pwm") + std::() + "/";
}
// 初始化PWM
bool init() {
// 如果已经导出,先解除
(, std::());
(); // 等待100ms
// 导出PWM通道
(, std::());
(); // 等待200ms确保设备文件创建
// 设置周期为20ms ()
(, "");
// 设置初始占空比为0(舵机停止)
(, "0");
// 启用PWM
(, "1");
std::cout << "PWM初始化成功" << std::endl;
true;
}
// 设置舵机角度
void (int angle) {
if (angle < 0) angle = 0;
if (angle > 180) angle = 180;
// 根据角度计算占空比(纳秒)
// 0°: , 180°:
int = + (angle * / 180);
(, std::());
std::cout << "设置角度: " << angle << "°, 脉冲宽度: " << << "ns" << std::endl;
}
// 释放资源
void () {
(, "0");
(, std::());
std::cout << "PWM已关闭" << std::endl;
}
};
int main() {
servo;
if (!servo.init()) {
std::cerr << "初始化失败" << std::endl;
1;
}
// 示例:让舵机旋转到各个角度
std::cout << "开始控制舵机..." << std::endl;
// 旋转到0°
servo.(0);
(); // 等待2秒
// 旋转到90°
servo.(90);
();
// 旋转到180°
servo.(180);
();
// 回到0°
servo.(0);
();
servo.();
0;
}
把上述代码存下来成为.cpp, 接着在终端里去执行。
g++ o .cpp
sudo ./
提请留意, 针对/sys/class/pwm展开操作, 这是需要root权限的, 所以, 必然得运用sudo来运行。
![]()
对线缆连接状况实施检查, 要明确认可靠确保信号线与标明为之处相实行相连, 电源线与标记为5V的线路进行连接, 地线和标记为GND的线路进行衔接。
检查权限: 确保使用sudo运行程序。
查看PWM是不是被别的进程所占用, 去排查: 有些系统服务会占用PWM通道, 能够借助ls /sys/class/pwm//来查看已导出的通道。
造成这种情况, 往往是由于脉冲宽度计算出现了差错。请去确认一下你所使用的舵机, 它实际能够支持的脉冲范围究竟是多少。有一部分舵机, 其0°对应的是0.6ms(也就是), 而180°对应的则是2.4ms(即)。你能够依照舵机说明书, 对函数里面的计算参数进行微调。
电源不足是最常见的原因。尝试使用外部电源给舵机独立供电。
借助上述的C++代码以及接线方式, 你已然能够平稳地操控树莓派上的舵机转动至任何角度。关键要点在于: 运用PWM0通道(), 将周期设定为20ms, 经由调节占空比(至)去控制角度, 而且一定要通过sudo来运行程序。
行动给出的建议是: 即刻依据教程进行接线操作, 随后运行代码。去体验从0°开始直至180°的那种平滑转动情况, 之后对函数里的脉冲范围作出修改, 以此适配自身手头所拥有的舵机型号。一旦把握了这个基础内容, 便能够接着扩展程序, 达成多舵机联动、角度反馈读取等高级功能。
重复核心观点: 控制舵机成功的要点在于正确地进行PWM脉冲宽度计算, 以及准确地配置GPIO引脚。只要这两个方面不出现差错, 你的树莓派便能够如同专业的舵机控制器那般稳定地运行。