做PX4外接设备的朋友大概率都遇到过同一个问题:同样一颗舵机,用Arduino驱动很听话,接到飞控上就完全不听使唤。根源往往不是PWM本身的问题,而是遥控器通道映射没做对。今天这篇文章想聊的,就是如何通过遥控器通道映射,在PX4上实现多舵机PWM的精准控制。
说得直白一点,本文要解决的是这种需求:无人机上挂了一个两轴云台、机械爪、收放脚架或者别的舵机外设,我想把遥控器上多余的开关、拨杆变成舵机动作,一拨杆子舵机就转,旋钮拧多大角度舵机就摆多大角度。这件事在航模上直接插个舵机就行,到了PX4上就得走一套完整的链路:遥控器 -> 接收机 -> 飞控RC解析 -> 通道映射 -> 混控器 -> PWM输出口 -> 舵机。
文章面向的读者,是已经能正常用QGroundControl连接飞控、会刷固件、知道SBUS/PPM基本概念的朋友。看完之后你至少能解决三件事:第一,看懂PX4的遥控器通道映射是怎么回事;第二,把任意遥控器通道精确映射到任意PWM输出口;第三,多舵机一起挂的时候怎么接线、怎么设置限位和故障保护,不炸。从硬件选型、接线、参数设置到混控器文件的写法,都会讲到。
1. 先理清思路:遥控器信号到舵机的完整链路
在动手之前,我建议先把这条链路想明白。我之前见过不少朋友一上来就在网上搜“PX4舵机输出参数”,抄了一堆PWM_AUX_MIN/MAX设置,结果舵机还是不动,最后发现是卡在混控器层的映射关系上。所以这一节先把链路拆开看。
1.1 遥控器输入协议先分类:SBUS、PPM、DSM
遥控器把摇杆、开关、旋钮的位置变成数字信号,通过接收机发出去。目前PX4飞控支持的输入协议大概有三类,日常用得最多的就是SBUS。
- SBUS:Futaba提出的一种串行遥控总线协议,一根信号线就能传16个通道,帧率100Hz左右,信号电平是反相的TTL。市面上绝大多数遥控器都带SBUS输出,Pixhawk的RC IN口一般直接接这个。
- PPM:脉冲位置调制,也叫PPMSUM,一根线传8个通道,现在新遥控器已经很少用了,老接收机或者一些训练机还在用。
- DSM/DSMX:Spektrum家的协议,早期穿越机流行过,现在玩PX4的用得不多了。
- PWM单独线直连:每个通道单独一根线接到飞控输入口,通道一多线就乱,而且会占掉GPIO,一般只有特殊接收机才这么接。
接收机输出的协议要提前在QGroundControl的“Radio”设置里和飞控对上。比如你用SBUS接收机,但飞控里没把RC输入类型设成SBUS,飞控是收不到你遥控器数据的。在QGC里选择好之后,打开Radio通道监视器,你拨动通道时能看到对应通道的PWM数值在变化,就说明接收机到飞控这一截通了。这一步是整个控制链的输入端,进不来后面全都白搭。
1.2 通道映射:RC_MAP_* 把物理通道翻译成飞控能懂的指令
接收机数据进入飞控后,会被解析成一串通道值,通常是[1000, 2000]之间的数字。但飞控并不天生知道通道1是横滚、通道4是油门,它需要一套“翻译规则”。这套规则就是PX4里的RC_MAP_*参数。
举个例子,RC_MAP_ROLL默认值为1,意思就是“接收机第1通道当成横滚指令”;RC_MAP_THROTTLE默认值为4,意思就是“接收机第4通道当成油门指令”;RC_MAP_AUX1默认值一般是6,意思就是“接收机第6通道当成辅助通道1”。
如果你遥控器上某个开关接的是接收机第7通道,想让它控制舵机,那就需要把RC_MAP_AUX1设置成7。同理,RC_MAP_AUX2、AUX3、AUX4对应接收机的第8、9、10通道,以此类推。
这一步的核心逻辑是:RC_MAP_*只负责“把物理通道翻译成逻辑通道”,它不负责决定哪个舵机输出口工作。逻辑通道(roll、pitch、yaw、throttle、aux1...)最终由混控器来决定是否去驱动某个PWM口,以及驱动哪个PWM口。很多教程只讲到这里,导致大家设置完RC_MAP_AUX1后去拨开关,发现舵机还是纹丝不动。原因就在于“映射”和“输出”是两层,中间还夹着一个混控器。
1.3 混控器:决定哪个PWM端口输出舵机信号
混控器(Mixer)是PX4里一个很核心但也容易被忽视的概念。通俗理解,它就是一张“转发表”:把某种控制指令(比如辅助通道1)连接到某个PWM输出端口(比如AUX1口),同时还可以做缩放、反向、限幅、混入比例等操作。
PX4飞控在启动时会加载混控器文件,默认位置在/etc/mixers/目录下。多旋翼无人机通常会有一个main.mix和一个aux.mix。main.mix决定了MAIN输出口怎么接电机,aux.mix决定了AUX输出口怎么输出。
对于舵机控制,我们更关心aux.mix,因为AUX口默认的PWM频率是50Hz,正好匹配绝大多数模拟舵机;MAIN口默认频率较高,适合无刷电调。如果你把舵机接到MAIN口,不是不能工作,但要注意PWM频率设置,否则舵机会有奇怪的抖动或者发烫。
在aux.mix文件里,一行舵机混控器(Servo Mixer)的定义就对应一路PWM输出。写法和参数我会在第三部分实操中具体展开。这里只需要先理解:混控器是从“逻辑通道”到“输出口”的关键桥梁,不写混控器,遥控器映射做得再好,PWM口也不会有信号。
1.4 为什么非要走“通道映射 + 混控器”,不能直接给舵机PWM?
有人可能会问:既然只是想让舵机跟着某个通道走,能不能直接拿一根信号线把遥控器接收机PWM输出接到舵机上?类似航模那种方式?
在某些简单场景下确实可以,比如有些接收机自带PWM输出口,舵机直连接收机就能工作。但如果你用PX4,我不建议绕过飞控去接。原因有几个:
第一,安全逻辑会失效。PX4的故障保护(Failsafe)可以在失控时把舵机拨到一个安全位置;直连接收机就完全失去了这层保护,一旦遥控器失联,舵机会停在最后位置,甚至抖动机毁。
第二,解锁/急停逻辑冲突。PX4里的AUX输出会受飞控的安全开关和解锁状态影响,直连接收机后,飞控并不知道舵机正在动作,它无法参与整机的状态管理。万一你有“解锁后舵机自动回中位”的需求,绕过飞控就没法实现。
第三,通道数量不够用。接收机直接输出PWM通常只有几个口,而SBUS接收机加上PX4的通道映射可以支持到16个通道,多舵机项目需要的就是这种扩展能力。
所以,这条“通道映射 + 混控器”的链路虽然看起来绕,但它换来的是一套安全、可扩展、可编程的舵机控制体系。尤其当你要做多舵机联动、有故障保护、或者和飞控状态联动时,这套链路几乎不可替代。
2. 硬件准备与接线:多舵机项目最容易翻车的一步
软件链路想清楚了,接下来是硬件。很多人花二三十块买个SG90接连到Pixhawk AUX口上发现飞控频繁重启,然后开始怀疑固件有问题。其实多数情况下是供电没做好。
2.1 飞控选型与舵机供电方案
选飞控时,如果你是做多旋翼加舵机外设,尽量选带独立AUX输出的型号。Pixhawk标准架构里,飞控通常有两组PWM输出,一组是主输出(MAIN,通常是电机),一组是辅助输出(AUX,可以用来接舵机)。像Pixhawk 4、Pixhawk 6C、Holybro Durandal、CUAV V5+这些都有AUX排针,做DIY外设项目足够了。
舵机的供电需要单独说。一颗9g舵机正常工作时电流几十到两百毫安,堵转时可能到500mA以上;像MG996R这种大扭力舵机,堵转电流可能超过1A。Pixhawk机身的5V供电能力有限,如果直接从飞控的5V引脚给多颗大舵机供电,轻则舵机无力、抖动,重则把飞控上的电源稳压电路打坏。
我的建议是:如果只挂一到两颗9g小舵机,可以试探着用飞控的5V供电,但要在QGC里持续观察电压值;只要挂两颗以上,或者用任何超过9g级别的舵机,就要上独立BEC(Battery Eliminator Circuit)。
接线方式很简单:BEC输入接电池分电板,BEC输出(5V)给舵机电源线供电,舵机地线同时接到BEC地和飞控地(共地),舵机信号线接到AUX口。注意地线必须和飞控共地,否则信号线的电平参考不一致,舵机会出现莫名其妙的乱动。
这里有个细节:舵机信号线和舵机电源线最好分开走。很多舵机在堵转瞬间会把电源电压拉垮,如果这个电源和飞控是同一个,飞控必然重启。独立BEC加上共地之后,信号路径和功率路径就分开了,系统稳定性会好很多。
2.2 接收机接线与协议设置
接收机的接线相对简单。SBUS接收机一般有三条线:信号、电源(5V)、地。接到飞控RC IN接口上,线序一般有标注。注意SBUS信号线要接到RC IN的数据脚,而不是另一个标注PPM的针脚,不同飞控针脚定义不同,接线前看一眼说明书或者丝印。
接好之后,在QGC里设置输入方式。路径是Vehicle Setup -> Radio,第一栏选择接收机协议,比如SBUS。设置完以后打开遥控器,观察通道数值。这里有一个常见坑:如果你接收机接的是PPM,但飞控里选的是SBUS,或者反过来,通道数据会全部无效,甚至QGC里根本没有通道反应。所以这步虽然简单,但最好在焊线之前先验证。
另外,如果你用的是比较老的遥控器,发射机不支持SBUS输出,只支持PPM或者PWM,那就要看飞控是否启用了PPM输入。Pixhawk标准硬件上,RC IN那排针通常有一根是PPM信号线,接PPM接收机时要用到它。协议匹配问题在项目初期解决掉,后面会很省心。
2.3 舵机接线:信号、电源、地线别接反
舵机一般有三根线,颜色相对统一:棕色/黑色是地线,红色/橙色是电源正,黄色/白色/橙色是信号线。接到飞控AUX口时,AUX排针旁边一般标注有S(Signal)、V(Voltage)、G(Ground),依次对应信号、电源、地线。
要特别提醒:AUX口的V和G是飞控内部控制板上的电源,如果你按舵机的接法把信号线接到了V脚、电源线接到了S脚,那几乎必烧。插线之前把三根线分清,不要只看颜色,有条件的话用万用表量一下接收机和舵机线的电压再插也不迟。
另外,舵机线材一般比较细,多舵机布线时建议用硅胶线或杜邦线,线径不要小于0.2平方毫米。接线完成后用束线带固定,避免飞行时震动导致松动。这一项是很多炸机事故的隐患,比参数问题隐蔽得多。
3. 实操配置:从QGC校准到自定义混控器文件
这一节是整篇文章的精华,按步骤走就行。我以一个具体需求为例:四旋翼上加装4个舵机,遥控器第7、8通道是两个开关,第9、10通道是两个旋钮,分别控制4个舵机的角度。
3.1 第一步:QGroundControl连接与基础校准
先下载QGroundControl,用USB连接飞控。如果你手上飞控固件版本比较旧,建议先刷成当前的主流稳定版(比如PX4 v1.14.x对应的QGC 4.2.x分支)。刷完固件之后,机架一定要选对,因为机架不同会加载不同的默认混控器。做多旋翼就选对应机架类型,做固定翼就选固定翼机架。
连接后做传感器校准:加速度计、陀螺仪(通常随加速度计一起校)、罗盘、水平基准面。这一步看似和舵机无关,但如果飞控姿态估计异常,很多安全保护会拒绝解锁,间接影响舵机测试。我的经验是至少把加速度计和水平面校准做了,哪怕你只是做地面机器人,这一步也能帮你排除很多诡异问题。
3.2 第二步:遥控器校准,先把每个摇杆的行程喂给飞控
打开QGC左侧的Radio页面,在“RC Configuration”里面会显示当前的通道值。先确认接收机已经被正确识别,通道值会跟着你拨动摇杆变化。
然后点击“Calibrate”按钮开始校准。按照提示,将遥控器上所有摇杆、开关、旋钮拨到最大、最小、中位,重复几次。校准过程会生成每个通道的最小值、最大值、中位值和映射方向。这一串数据会写到RC_MIN、RC_MAX、RC_TRIM、RC_REV等相关参数里。
校准完成后,到“Radio”界面的通道监视器里逐一检查:
- 每个摇杆通道的中位应该稳定在1500左右,如果偏离到1400或者1600,说明校准没做好,重新校准;
- 拨动开关和旋钮时,对应通道的数值应该能在1000~2000之间平滑变化;
- 如果某个通道方向反了,可以在遥控器上直接反向,也可以调节QGC里的通道反向设置。
这一步之所以重要,是因为后面的通道映射是建立在“校准好的通道值”基础上的。如果通道值本身不准、不稳,后面就算混控器映射对了,舵机角度也会偏,做不到“精准控制”。
3.3 第三步:设置RC_MAP_*,告诉飞控哪个通道干哪件事
校准完遥控器后,到Parameters界面搜索“RC_MAP”,会列出所有通道映射参数。我的目标是:
- 把通道7映射到辅助通道1:设RC_MAP_AUX1 = 7
- 把通道8映射到辅助通道2:设RC_MAP_AUX2 = 8
- 把通道9映射到辅助通道3:设RC_MAP_AUX3 = 9
- 把通道10映射到辅助通道4:设RC_MAP_AUX4 = 10
其他RC_MAP_ROLL/PITCH/YAW/THROTTLE保持默认即可,只要你的接收机通道1~4确实送的是横滚、俯仰、油门、偏航。
设置时注意两点:
第一,RC_MAP值不要和已有通道重复。如果你已经设了RC_MAP_AUX1 = 7,就不要再把RC_MAP_AUX2也设成7,否则飞控会不知道拿哪个通道当辅助通道2。重复映射某些固件版本可能不报错,但行为会变得很奇怪。
第二,某些固件版本里,RC_MAP_AUX1的默认值可能是0,表示未启用。这种情况下即使你拨动通道,飞控也不会把它当成辅助通道1。所以看到默认值0也不要奇怪,改成你需要的通道号即可。
设置完参数,去通道监视器里确认映射是否生效。切到“RC”选项卡,里面能看到roll、pitch、yaw、throttle、aux1~aux8的实时值。拨动通道7,如果aux1的值在跟着变,说明映射生效了。此时舵机还不会动,因为还差混控器这一层。
3.4 第四步:PWM输出限值、中位和故障保护
既然要精准控制,PWM输出参数必须设置好。这里主要关注PWM_AUX_*这组参数。
- PWM_AUX_MIN:最小输出脉宽,一般设1000,单位微秒,对应舵机0度(或你的舵机最小角度)。
- PWM_AUX_MAX:最大输出脉宽,一般设2000,单位微秒,对应舵机最大角度。
- PWM_AUX_TRIM:中位脉宽,一般设1500,单位微秒,对应舵机中位。
- PWM_AUX_RATE:PWM频率,模拟舵机设50Hz,数字舵机看说明书,常见100Hz或200Hz。
- PWM_AUX_DISARMED:未解锁时的输出值。如果你希望上电后舵机先回到一个安全位置,可以设成1000,或者某个固定角度对应的脉宽。
注意,PWM的数值单位是微秒,不是百分比。如果你用示波器或逻辑分析仪量AUX口的波形,会发现脉宽确实在1000~2000us之间变化,和参数对得上。这是“精准”的关键,也是排查问题时要盯住的核心信号指标。
故障保护也要在这里设置。搜索“FS”或者“COM_FAIL”相关的参数,把遥控器失控时的行为配好。PX4在RC信号丢失后有多种处理策略,可以选择让舵机进入安全位置。比如你挂的是机械爪,失控时希望它立刻张开到安全角度,那就把对应通道的Failsafe值设成安全位置对应的PWM。不同的固件版本参数名略有差异,但思路一致:提前想好失控位置,别让舵机在失控时停在危险姿态。
3.5 第五步:编写混控器文件并实时验证输出
现在到了最关键的步骤:编写混控器文件,把辅助通道映射到AUX PWM输出口。
打开QGC的Analyze Tools -> MAVLink Console,进入飞控的nsh shell。先看一下当前的aux混控器内容:
cat /etc/mixers/aux.mix默认情况下可能是空文件或者只有注释。我们把它替换成4个舵机的定义。在MAVLink Console里逐行输入:
rm /etc/mixers/aux.mix touch /etc/mixers/aux.mix echo "M: 4" > /etc/mixers/aux.mix echo "O: S" >> /etc/mixers/aux.mix echo "S: 3 5 10000 0 0 -10000 10000" >> /etc/mixers/aux.mix echo "O: S" >> /etc/mixers/aux.mix echo "S: 3 6 10000 0 0 -10000 10000" >> /etc/mixers/aux.mix echo "O: S" >> /etc/mixers/aux.mix echo "S: 3 7 10000 0 0 -10000 10000" >> /etc/mixers/aux.mix echo "O: S" >> /etc/mixers/aux.mix echo "S: 3 8 10000 0 0 -10000 10000" >> /etc/mixers/aux.mix sync然后重启飞控,拔USB重插或者执行reboot都行。重启后在QGC的“Actuator Output”页面(有的版本叫“Motors/Servos”)里,应该能看到AUX1~AUX4对应通道有信号。这时候拨动遥控器通道7,AUX1对应的舵机应该跟着动;拨动通道8,AUX2动,以此类推。
关于S行语法我再解释一下。这个格式是PX4舵机混控器的标准写法:
S: <控制组> <控制序号> <增益> <偏置> <微调> <输出下限> <输出上限>- 控制组3表示“手动遥控输入”(Manual/RC),也就是前面映射好的辅助通道所在的那一组;
- 控制序号5、6、7、8分别对应RC输入里的aux1、aux2、aux3、aux4;
- 增益10000对应100%,正数表示方向正常,想反向就写-10000;
- 偏置一般写0,微调一般写0;
- 输出下限-10000和上限10000表示混控器本身不做额外限幅,最终输出范围由PWM_AUX_MIN/MAX控制。
如果你只用一颗舵机,把M: 4改成M: 1,只保留第一个O: S和S行即可。如果你要把舵机输出到AUX5、AUX6,则需要把混控器文件对应的顺序和输出口匹配好。这里最容易出错:混控器文件里第几个O: S就对应第几个AUX口输出。举例来说,第一个O: S对应AUX1,第二个对应AUX2,以此类推。
这里我要特别提一个实操技巧:在写混控器文件之前,先在QGC的Actuator Output页面手动给每个AUX口输出一个PWM值,用一个小舵机去试每个口对应哪个AUX编号。因为不同飞控的丝印和QGC里的通道号可能有差异,这一步能帮你确定哪根信号线插在哪个物理口上,避免后面映射错乱。
验证无误后,再做一次完整的系统检查:解锁状态下舵机是否正常跟随遥控器;锁定状态下舵机是否回到安全位置;断开遥控器,触发故障保护,观察舵机是否回到预设安全角度。这三项都过了,你的多舵机PWM控制才算真的跑通了。
4. 常见问题与排查技巧实录
最后这一部分,我把项目中遇到过的典型问题和排查思路整理一下。这些问题看起来都很小,但每一个都足以卡住新手好几天,而且有一部分是常规文档里不会写的经验。
4.1 舵机抖动或行程不对
舵机抖动先查PWM频率。模拟舵机一般只支持50Hz左右,如果你把PWM_AUX_RATE调到了200Hz甚至更高,舵机内部电路会收到混乱的脉宽,表现为抖动、发烫、或者乱转。数字舵机通常可以跑到100Hz以上,但也要看舵机手册,不要盲目把频率拉高。
其次查供电。舵机在接近极限位置时电流会显著上升,如果BEC输出电流不够,电压会瞬间跌落,舵机会出现“用力-失去-回弹”的抖动节奏。用万用表测量舵机电源电压,如果舵机动作时电压掉到4.5V以下,说明供电偏弱,换大电流BEC或者降低负载。如果舵机比较多样,尽量把电源线单独拉一条粗线,不要和信号线混在一起。
行程不对的问题多半出在校准。RC校准不准会导致通道值在1000~2000之间没跑满,或者中位偏了。先看RC通道监视器的数值范围,确保最小值接近1000us、最大值接近2000us。如果数值范围没问题,再调PWM_AUX_MIN/MAX和PWM_AUX_TRIM,把舵机机械零点和飞控逻辑零点对齐。实际项目中,不同品牌舵机的PWM中位可能有几十微秒的偏差,这是正常的,用TRIM修正就好。
4.2 通道方向相反或错位
拨动遥控器通道7,舵机却朝反方向转。有三个地方可以改:遥控器端换向、QGC的RC通道反向、或者混控器S行的增益符号。我个人建议优先在遥控器端换向,这样飞控里的参数可以保持标准逻辑,后续换飞控时不容易乱。
错位问题则多出在混控器文件上。比如你明明写了S: 3 5,对应aux1,结果拨的通道7控制的却是AUX2输出。这种情况下先回RC参数里确认RC_MAP_AUX1的值确实对应遥控器通道7,再看aux.mix里第几个O: S是否和你期望的AUX口序号一致。我的习惯做法是:先在Actuator Output页面手动输出PWM,找出和物理舵机一一对应的口,再反过来改混控器,这样就不会错位。
4.3 输出端口没信号
最常见的怀疑点是混控器没生效。写完aux.mix之后一定要重启飞控,光改文件不重启,新配置不会加载。另外检查混控器文件的M:计数和O: S行数是否匹配,少一个O: S就会少一路输出。
还有一个容易忽略的点:PX4只有在系统处于解锁状态,或者特别配置的状态下,才允许某些输出信号。如果你没有解锁,但PWM_AUX_DISARMED又设成了0或禁用值,AUX口可能完全是低电平。遇到输出没信号,先在Actuator Output页面手动给对应AUX口输出一个值,如果手动有信号而遥控器拨动没信号,说明问题在RC_MAP或混控器映射;如果手动也没信号,问题在PWM参数或硬件接线。
4.4 多舵机上电瞬间飞控重启
这是供电不足的典型症状,不是固件BUG。多颗舵机上电瞬间都会有一个“寻找中点”的动作,电流峰值叠加在一起非常夸张。9g舵机三颗以上同时上电,瞬时电流就可能到2A到3A。
解决办法是加独立BEC,功率余量留足。我常用的方案:
- 1~2颗9g舵机:飞控5V直供,但要在QGC里实时观察电压,谨慎使用;
- 3~4颗9g舵机:5V/5A BEC独立供电;
- MG996R级别大舵机:每颗舵机单独供电,或使用多路BEC。
如果你是做实验临时用飞控供电,可以在供电线上加一个大一点的电解电容(比如470uF/10V并一个0.1uF陶瓷电容)来吸收瞬态电流,但治标不治本,长期项目还是上独立BEC更靠谱。如果你的舵机电流实在太大,甚至需要用MOS管做功率扩展,那还要额外注意PWM频率。有些舵机驱动电路对PWM频率很敏感,频率不合适会让MOS管发热严重,这时候要参考舵机厂家的推荐频率,而不是拍脑袋选频。
我把几个高频问题和排查顺序列成表格,方便现场对照:
| 现象 | 优先排查顺序 |
|---|---|
| 舵机完全不动 | 1. RC通道值是否进入飞控 2. RC_MAP设置是否生效 3. 混控器文件是否加载 4. PWM输出口是否有信号 |
| 舵机抖动 | 1. PWM频率 2. 供电能力 3. 信号线接触 4. 地线是否共地 |
| 舵机方向反 | 1. 遥控器反向 2. QGC通道反向 3. 混控器增益符号 |
| 舵机只在中位不动 | 1. RC_MAP没有映射 2. 混控器控制组序号不对 3. 输出频率设置错误 |
| 多舵机上电重启 | 1. BEC供电能力 2. 独立电源是否共地 3. 电解电容缓冲 |
这一整套配置我完整跑过不止一遍,从最初只会用QGC飞多旋翼,到后来给各种实验平台加舵机外设,踩的最多的坑就是混控器这层。很多人习惯在单片机里直接打PWM,到了PX4上会不适应这种“间接”的控制方式,但我觉得恰恰是这种间接设计,才让系统变得更可靠、更统一。
最后分享一个小技巧:每次改完混控器和RC参数后,别急着起飞,先在桌面上测试半小时,让舵机持续往返运动,观察有没有发热、抖动、丢步。舵机这类机械执行器,前期的小毛病在桌面上都能查出来,上了天才会变成大问题。另外,如果你用的是飞特这类总线舵机,那就不能用本文的PWM接法了,需要走串行转接板,控制和供电方案完全是另一套逻辑。PWM舵机和总线舵机各有优劣,做项目之前先想清楚用哪种,能省掉后面一堆返工。