首页 > 行业资讯 >减速电机
TECHNICAL SUPPORT

树莓派控制舵机C++代码教程

发布时间: 2026-05-28

许许多多刚着手接触树莓派以及舵机控制的友人, 会遭遇一个共通的困惑, 那就是: 缘何我依据网上的教程来进行接线, 运用C++编写的程序, 舵机却全然没有反应, 或者仅仅只能转到一个方向呢? 这通常并非是由于硬件损坏了, 而是因为C++代码之中欠缺了关键的时序控制抑或是引脚配置。本教程将会一步一步地引领你从起始处搭建一个稳定的、可以调节的舵机控制程序, 使得你能用C++在树莓派上精准地控制舵机旋转到任意的角度。

01准备工作:硬件与软件环境

于着手编写代码以前, 要保证你的树莓派已然安装了操作系统(推荐为 Pi OS), 且连接了网络。在硬件这块, 你所需的是:

一个标准的PWM舵机(如SG90、等)

一根公对母杜邦线

一个面包板(可选,但推荐)

接线方式:

舵机线 颜色 连接树莓派GPIO
信号线 橙/白 (物理引脚12)
电源线 5V引脚(物理引脚2或4)
地线 黑/棕 GND引脚(物理引脚6、9等)

重点提示, 舵机于转动之际耗电颇为巨大, 要是多个舵机一块开展工作, 奉劝选用外部电源予以供电, 切莫径去仰仗树莓派彼之5V引脚, 不然的话没准会致使系统处于不稳定之状。

02核心原理:PWM与舵机角度

控制舵机要借助PWM(脉冲宽度调制)信号, 一个典型的PWM周期是20ms(频率50Hz), 在这样的周期当中, 舵机旋转角度由高电平持续时间来决定。

0°时, 高电平的时长大约是0.5ms, 其占空比为2.5%。

树莓派控制舵机c++_树莓派控制串行总线舵机_树莓派舵机控制板

九十度, 高电平大概是一点五毫秒有这么个时长(占空比为百分之七点五)。

180°的状态下, 高电平持续的时间大概是2.5ms, 其占空比为12.5%。

舵机存在着不同的品牌, 还有不同的型号, 针对于这些舵机而言, 它们所对应的脉冲范围, 有可能会存在着略微的差异, 然而上述所提到的数值, 是属于通用的参考基准。

03编写C++控制程序

在树莓派上去对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来运行。

04常见问题与

1. 舵机完全没有反应

树莓派控制串行总线舵机_树莓派舵机控制板_树莓派控制舵机c++

对线缆连接状况实施检查, 要明确认可靠确保信号线与标明为之处相实行相连, 电源线与标记为5V的线路进行连接, 地线和标记为GND的线路进行衔接。

检查权限: 确保使用sudo运行程序。

查看PWM是不是被别的进程所占用, 去排查: 有些系统服务会占用PWM通道, 能够借助ls /sys/class/pwm//来查看已导出的通道。

2. 舵机只能转到一端

造成这种情况, 往往是由于脉冲宽度计算出现了差错。请去确认一下你所使用的舵机, 它实际能够支持的脉冲范围究竟是多少。有一部分舵机, 其0°对应的是0.6ms(也就是), 而180°对应的则是2.4ms(即)。你能够依照舵机说明书, 对函数里面的计算参数进行微调。

3. 舵机抖动或不稳定

电源不足是最常见的原因。尝试使用外部电源给舵机独立供电。

检查杜邦线是否接触良好伟创动力伟创动力舵机,必要时重新插拔。

05与行动建议

借助上述的C++代码以及接线方式, 你已然能够平稳地操控树莓派上的舵机转动至任何角度。关键要点在于: 运用PWM0通道(), 将周期设定为20ms, 经由调节占空比(至)去控制角度, 而且一定要通过sudo来运行程序。

行动给出的建议是: 即刻依据教程进行接线操作, 随后运行代码。去体验从0°开始直至180°的那种平滑转动情况, 之后对函数里的脉冲范围作出修改, 以此适配自身手头所拥有的舵机型号。一旦把握了这个基础内容, 便能够接着扩展程序, 达成多舵机联动、角度反馈读取等高级功能。

重复核心观点: 控制舵机成功的要点在于正确地进行PWM脉冲宽度计算, 以及准确地配置GPIO引脚。只要这两个方面不出现差错, 你的树莓派便能够如同专业的舵机控制器那般稳定地运行。

为所有产品提供动力单元

联系伟创动力产品专家,为你的产品推荐合适的驱动系统所需部件。

发送邮件
在线留言
WhatsApp
+86 0769 8399 3238
 
kpowerMap