PHP无法直接控制SG90舵机,需通过pigpio等外部工具间接驱动;推荐使用pigs命令(如pigs s 18 1500),配合角度-脉宽映射公式及外接供电。

PHP 不能直接控制 SG90 舵机
PHP 是服务端脚本语言,没有硬件 GPIO 访问能力,无法直接输出 PWM 信号驱动 SG90。所谓“PHP 控制舵机”,本质是 PHP 作为逻辑层,通过调用底层系统命令(如 gpio、servo 工具)或与 C/Python 进程通信来间接控制。硬要让 PHP 发 PWM,必须依赖外部硬件接口程序(如树莓派上的 pigpio daemon 或 wiringPi)。
树莓派上用 PHP 调用 pigpio 控制 SG90 的实际路径
推荐使用 pigpio 库:它提供守护进程 pigpiod,支持网络接口,PHP 可通过 socket 连接发送 PWM 指令。SG90 标准脉宽范围是 500–2400 μs,对应 0°–180°,但实际有效范围常为 600–2300 μs(需校准)。
- 先启动守护进程:
sudo pigpiod - PHP 中用 socket 连接
localhost:8888,调用set_servo_pulsewidth函数(注意:pigpio 协议需按二进制格式构造请求,不建议手写;更稳妥是用现成封装) - 更简单做法:用 PHP 执行 shell 命令调用
gpio工具(如果已安装 wiringPi)——但 wiringPi 已停止维护,且新版树莓派系统默认不兼容
所以真正可行的最小闭环是:
exec('pigs s 18 1500'); // 将 GPIO 18 的脉宽设为 1500μs(约 90°)其中 pigs 是 pigpio 提供的命令行工具,s 表示 servo 模式,18 是 BCM 编号引脚,1500 是微秒值。注意:SG90 的中位(90°)通常在 1450–1550 之间,需实测调整。
立即学习“PHP免费学习笔记(深入)”;
PHP 计算角度到脉宽的映射公式及常见偏差
线性换算公式为:pulse = 500 + (angle / 180.0) * 1900(理论 500–2400),但 SG90 个体差异大,实际常用:pulse = 600 + (angle / 180.0) * 1700(即 600–2300)。关键点:
- 角度输入必须限制在
0–180,否则可能烧舵机或触发保护 - 不要用浮点运算直接传给
pigs,它只接受整数微秒值,需(int)round($pulse) - 连续转动时,避免突变(如从 0° 直跳 180°),应分步延迟,否则舵机可能抖动或失步
- 部分廉价 SG90 实际只能转 120°–150°,标称 180° 是理想值
示例 PHP 函数:
function angle_to_pulse($angle) {
$angle = max(0, min(180, (int)$angle));
return (int)round(600 + ($angle / 180.0) * 1700);
}
exec('pigs s 18 ' . angle_to_pulse(180)); // 转到 180°绕过 PHP 直接控制的更稳方案
如果项目允许,把控制逻辑下沉:用 Python 写一个常驻进程监听本地 socket 或 Redis 队列,PHP 只负责发指令(如写 Redis key servo:target),Python 进程读取后调用 RPi.GPIO 或 gpiozero 输出精确 PWM。这样既避开 PHP 的实时性短板,又规避了 exec() 安全风险和并发阻塞问题。尤其当需要多舵机同步、加速度曲线或位置反馈时,PHP 层几乎无法胜任。
真正容易被忽略的是供电——SG90 空载电流约 10mA,堵转可达 500mA+。树莓派 GPIO 无法直供,必须外接 5V 电源,并共地。没共地,pigs 命令看似成功,舵机却不动。











