玩无人机的朋友应该都有过这种体验:飞控数据链一断,哪怕飞机姿态再稳,心里也一下子没底。市面上现成的一体化数传电台不少,但如果你和我一样喜欢自己攒链路,那 Digi 的 XBee-PRO 900HP,业内常说的 S3B 模块,迟早会出现在你的清单里。这个模块不算便宜,配置也不算傻瓜化,但胜在稳定、抗干扰、通信距离远,配上合格的天线之后,地面站里看飞机姿态和航点上传的手感,和那些廉价透传模块完全是两回事。这篇博文我就把自己从零搭建一套基于 S3B 的无人机数传电台的完整过程、参数思路和踩坑记录整理出来,给准备自组数传链路的朋友做个参照。
1. 项目概述:为什么无人机数传会选 XBee-PRO 900HP
1.1 数传电台在无人机系统里的定位
无人机除了图传之外,遥控和数传是两条各自独立的链路。遥控链路负责把人的操作指令送到飞控,数传链路则负责把飞控的状态数据、传感器信息、GPS坐标、电池电压这些数据实时传回地面站,同时也能把航点任务从地面站上传给飞机。MAVLink 协议跑在这条链路上,所以数传的稳定性直接决定了你能不能安心地看着屏幕飞行。
S3B 属于 900MHz 频段的数传模块。相比 2.4GHz 的 Wi-Fi 或蓝牙,900MHz 频段在同等功率下能传得更远,绕射能力也更好。城市里有楼房、野外有树丛,多多少少会挡信号,但低频在这种场景下依然能穿过去一部分,这就是很多人选它的根本原因。S3B 的发射功率标称在 +24dBm,也就是大约 250mW,看起来不大,但配合高增益天线,官方给出的室外视距通信距离能达到几十公里级别。当然这是理想条件下的数据,实际飞行中要考虑机身遮挡、天线摆放、电池干扰等因素,但至少做 5 到 10 公里以内的任务链路是绰绰有余的。
1.2 适合什么样的无人机项目
先说结论:S3B 适合对链路可靠性有要求、愿意花时间配置和测试的玩家、开发者和航测团队。如果你只是飞个几百米的娱乐机,原厂那套 2.4G 数传完全够用,没必要折腾这个。但遇到下面这些场景,S3B 就非常值得考虑。
第一类是远距离固定翼和长航时多旋翼。飞行距离超过两三公里后,2.4GHz 数传的丢包率会明显上升,而 S3B 在同样距离下还能保持比较稳定的 RSSI 信号强度。第二类是地形复杂的作业现场,比如山区测绘、电力巡检。低频信号在低空穿越树梢和山脊时,表现比高频好不少。第三类是竞赛和科研项目,需要自己掌握链路参数、需要读取信号强度数据、需要调试天线方向,S3B 提供了完整的 AT 命令和 API 帧,支持深度定制。
我见过不少人买了两块 S3B,装上以后发现距离还没有对讲机远,就判定这模块是吹牛的。其实绝大多数时候不是模块不行,而是没把配置和天线弄对。下面我按硬件、配置、集成、天线、排查这几个模块逐个拆开讲。
2. 硬件选型与接口细节
2.1 S3B 的核心参数与选型陷阱
先看一张我整理的关键参数表,这些是选型和排查时最常用的信息。
| 参数项 | 典型值 | 备注 |
|---|---|---|
| 工作频段 | 902-928 MHz ISM | 不同区域的实际开放频段不同,跨境项目要提前确认 |
| 发射功率 | +24 dBm(约 250mW) | 可用 PL 命令降低功率等级 |
| 接收灵敏度 | 约 -101 dBm | 配合增益天线可进一步拉远通信距离 |
| 射频数据速率 | 最高 200 kbps | 实际吞吐和固件、距离有关 |
| 串口波特率 | 1200-230400 可配 | 常见用 9600 或 57600 |
| 供电电压 | 2.1-3.6V,推荐 3.3V | 严禁 5V 直供,容易烧模块 |
| 发射电流 | 约 215mA(瞬间可能更高) | 电源设计要留余量 |
| 网络拓扑 | 点对点、点对多点、DigiMesh | 无人机常用点对点透明传输 |
| 加密 | AES-128 | 需要两端配置相同密钥 |
选型的时候最容易踩的坑是只看“XBee-PRO 900HP”这串字,没注意购买料号。S3B 系列下有不同的天线选型,有的是板载 PCB 天线,有的是 U.FL 微同轴接口,有的是外置 SMA 座。无人机上我建议直接买 U.FL 或 SMA 版本,方便自己接外置天线。板载天线在很多机架上会被碳纤维和电池挡住,距离表现会非常难看。
还有一个坑是料号里的固件版本。老库存的 S3 和新款 S3B 虽然外观相似,但支持的固件和命令集有差别。收到模块以后第一步不是接飞控,而是在 XCTU 里确认固件能正常识别和更新,再用到实际链路上,这样可以减少后面一半的排查时间。
2.2 引脚定义与开发板接线
S3B 模块是 20 引脚的邮票孔封装,引脚间距 2mm,直接手工焊接不太友好,一般建议买配套的转接板或 USB 适配器。最常用的几个引脚是 VCC、GND、DOUT、DIN、RSSI 和 RTS/CTS。
接线逻辑上有个特别容易搞反的点:模块的 DOUT 是数据输出,应该接你单片机或飞控的 RX;模块的 DIN 是数据输入,应该接对方的 TX。很多人习惯性把 DOUT 对接对方 TX,结果两边全都在发数据却没人听,串口自然没数据。我第一次给飞控接 S3B 的时候就犯过这个错,对着接线图看了半天才发现是交叉接反了。
电平也要特别注意。S3B 是 3.3V TTL 电平,很多 Arduino 或者老式飞控的串口是 5V 电平,直接连上去轻则数据乱码,重则烧引脚。如果必须接 5V 设备,中间一定要加电平转换模块,比如 TXS0108E 或者 BSS138 做的双向转换板。Pixhawk 类飞控的 TELEM 串口通常是 3.3V,可以直接连,但也要确认具体型号的接口定义。
2.3 USB 调试板的选型与准备
配置 S3B 离不开电脑端的 XCTU 工具,所以要准备一个能识别模块的 USB 转串口板。最省事的是 Digi 官方的 XBee USB 接口板,插上就能用,但价格偏高,而且不是所有渠道都有货。替代方案是用常见的 FTDI FT232RL 模块,注意选 3.3V 输出版本,或者带 3.3V/5V 跳线切换的 CP2102 板子。
这里要提醒一下:市面上很多几块钱的 CH340 串口板默认是 5V 电平,直接插模块上用,XCTU 可能能识别到串口但读不到模块版本,甚至可能把模块弄坏。买的时候尽量选明确标注支持 3.3V 的版本。如果手上只有 5V 的板子,最简单的办法是给模块的 VCC 接外部 3.3V 稳压源,串口 TX/RX 之间串接电阻分压,RX 线串一个 1k 电阻再并一个 2k 电阻到地,能把 5V 降到约 3.3V,但这种方法只适合调试,不适合长期使用。
3. 固件烧录与参数配置
3.1 XCTU 的安装与模块识别
XCTU 是 Digi 官方提供的跨平台配置工具,Windows、macOS、Linux 都有。安装后把模块通过 USB 转串口板插到电脑上,XCTU 会自动扫描可用串口端口。
如果点击扫描后没有发现模块,先别急着怀疑硬件。我遇到过的情况里,九成是下面几个原因:一是 RX/TX 接反,二是在选择端口时波特率设置不对,三是模块供电不足。XCTU 扫描时可以选“Test”功能逐个端口测试,也可以在连接设置里指定波特率。S3B 出厂默认波特率通常是 9600,但二手模块可能被改过,如果扫描不到,可以试试 115200、57600 这些常见值。
识别到模块之后,第一步是读一下当前固件版本和模块信息。如果发现固件类型和你需要的模式不匹配,比如买到的是 DigiMesh 固件但你想做点对点透传,或者固件版本太旧,就需要在 XCTU 里更新固件。更新固件的过程很简单,选择模块型号,然后选目标固件版本,点 Write 等待完成。注意整个写入过程绝对不能断电,宁可多等两分钟也别去碰 USB 线,刷砖了只能用专用烧录器恢复,很麻烦。
3.2 AT 透传模式的配置步骤
对无人机来说,我最常用的配置是两个模块都工作在 AT 透明传输模式,也就是串口里发什么,另一端串口就原样吐出什么。MAVLink 协议本身自带帧头和校验,不需要数传模块做额外解析,透明传输是最简单、最可靠的方式。
具体配置大概是这样的思路。两个模块分别接电脑或 USB 调试板,在 XCTU 的终端模式中进入 AT 命令模式,然后逐条设置参数。需要保持一致的参数至少包括:
- ID:网络的 PAN ID,相当于两台设备加入同一个群聊。
- KY:如果启用加密,两边的密钥必须一致。
- 信道相关参数:保持默认或者都用同一信道范围。
针对点对点通信,则要正确配置目标地址。每个 S3B 都有唯一的 64 位 MAC 地址,存储在 SH 和 SL 两个参数里。设置方向时,把模块 A 的 DH/DL 指向模块 B 的 64 位地址,把模块 B 的 DH/DL 指向模块 A 的地址。如果对方地址的高 32 位是 0,可以将 DH 设为 0,并把 DL 设为对方的低 32 位。
配置完成后执行 WR 命令保存参数,再执行 CN 退出命令模式。然后就可以用 XCTU 的终端或 Console 做环回测试:在模块 A 的串口终端里打一串字符,如果模块 B 的终端里原样出现这些字符,说明链路已经打通。
3.3 AT 命令模式下容易忽略的几个细节
用 AT 命令模式配置的时候,很多人会忽略命令的时序要求。进入命令模式之前,串口必须先处于空闲状态,然后发送三个连续的加号“+++”,中间不能有其他字符,模块才会进入命令模式。如果程序自动发送一串数据后立刻发“+++”,模块会把加号当成普通数据吞掉,导致配置不生效。
另外,AT 命令修改后,如果不执行 WR,断电之后配置就会回到原来的值。我早期调试时经常是这次改好了,重新上电又变了,然后怀疑模块坏了,最后才发现是没保存。现在我的习惯是每改一个关键参数就顺手 WR 一次,虽然有点啰嗦,但至少不会前功尽弃。
还有一个容易被忽略的参数是 BD,也就是串口波特率。S3B 的 UART 波特率默认 9600,但飞控的 TELEM 端口通常配置为 57600 或更高。两边不匹配的话,数据会变成一串乱码。BD 参数在不同固件里的索引映射略有差异,保险的做法是在 XCTU 图形界面里直接选择波特率,而不是硬记索引值。
3.4 API 模式与 AT 模式的选择权衡
S3B 还支持 API 模式,也就是数据以帧格式封装,包含源地址、RSSI 信号强度、帧序号等信息。很多开发者一开始就想用 API 模式,觉得信息更全,但无人机场景我反而建议优先考虑 AT 透传,除非你特别需要在地面端解析每个数据帧的信号强度。
原因很简单:MAVLink 协议自己已经有心跳超时、消息 ID、数据校验,数传链路只需要做可靠透传即可。API 模式虽然能给你额外的链路诊断信息,但也会增加帧解析的复杂度。一旦某个帧处理不当,可能把完整的 MAVLink 包切成两半,反而影响地面站解析。
如果你确实需要 RSSI 数据来评估链路质量,可以地面站一端用 API 模式,机载端继续用 AT 透明模式,或者干脆用 S3B 的 RSSI 引脚输出模拟 PWM 信号接到飞控 ADC 上。不过这些都属于进阶玩法,前期先把 AT 透传链路跑稳定,比什么都强。
4. 实机集成:从飞控到地面站的完整链路
4.1 机载端接线与供电设计
机载端 S3B 和飞控的连接,我以最常见的 Pixhawk 类飞控举例。飞控的 TELEM1 或 TELEM2 接口提供了串口 TX/RX 和电源输出,但 TELEM 端口的供电能力有限,而 S3B 在发射瞬间电流可能冲到 200mA 以上,直接从飞控 TELEM 口取电有一定风险,可能会导致飞控电压跌落甚至复位。
我常用的做法是:串口信号线接 TELEM 端口的 TX/RX,电源则单独从电源模块或者稳压模块取 3.3V。很多飞控的 TELEM 口输出的是 3.3V,但如果你不确定,万用表量一下最稳妥。S3B 的电源脚最好加一个 100uF 左右的电容靠近模块放置,用来吸收发射瞬间的电流尖峰。这个电容很小,塞在转接板背面就行,效果却很直观。
接线顺序也要注意。先把 S3B 的电源和地接好,再插串口线,最后再接天线。热拔插天线虽然偶尔没事,但射频口经常带电插拔容易损坏模块内部的功放部分,这种损坏是渐进的,一开始看不出来,用了一段时间才发现距离越来越近,然后怀疑人生。
4.2 地面站端的接线方式
地面站端的接线相对简单,就是把另一块 S3B 通过 USB 转串口板连接到电脑。USB 转串口板选 3.3V 电平版本,连接方式同上面说的交叉接法。
如果地面站离飞机的位置比较尴尬,比如你人在车里、电脑放后座,或者需要把地面天线架到屋顶,可以加一个树莓派或者类似的单板电脑当中继。树莓派通过 USB 串口连接 S3B,再通过 Wi-Fi 或者以太网和地面站电脑通信。这样地面天线可以放得更高更远,人坐在屋里也能操作,对拉距离很有帮助。
地面端天线我强烈建议用高增益天线,比如吸盘天线或者定向八木天线。但也要注意,增益越高的天线波束越窄,飞机在头顶正上方时,定向天线反而可能收不到信号。所以如果是手工操控近距离飞行,全向高增益鞭状天线更省心;如果是固定航线远航,地面天线指向起飞方向即可。
4.3 Mission Planner 与 QGroundControl 的参数设置
到了地面站软件这一步,很多人反而开始迷糊。Mission Planner 里设置数传其实很直接:连接串口,选择对应的 COM 口,波特率选 57600 或 115200,与飞控和 S3B 保持完全一致,协议选 MAVLink Auto,然后点 Connect。
如果一直提示 Heartbeat timeout,也就是收不到心跳包,最可能的原因是波特率不匹配。S3B 的串口波特率、飞控 TELEM 端口的波特率、地面站选择的波特率,这三个必须保持完全一致,缺一不可。我曾经在飞控里把 TELEM2 配成 57600,S3B 也设成 57600,但地面站软件里忘了改,默认 115200,结果排查了半小时才发现是软件设置的问题。
QGroundControl 的设置思路也差不多,只是界面布局不同。连接前可以在参数设置里确认一下 SERIALx_BAUD 和 SERIALx_PROTOCOL 是否正确,MAVLink 协议如果设成了别的协议,地面站也收不到数据。
4.4 首次链路验证与拉距测试
链路接好之后,不要急着起飞。先把飞机放在阳台或楼顶,地面站放在屋里,打开 XCTU 的 Range Test 功能,这个功能可以直观地看到两端的 RSSI 和丢包率。
我第一次做 Range Test 的时候,发现飞机放在自己面前时 RSSI 很高,但只要飞机转到某个角度,信号立刻掉一大截。后来发现是机载天线被电机座遮挡了,调整天线位置后改善明显。这类问题在地面测试阶段就能暴露,远比飞到空中再丢链路好处理。
地面拉距测试建议选在视线开阔的场地,先跑个 200 米,观察 RSSI 变化,再逐步加距离。记录下每个距离点的 RSSI 值,后面飞到空中可以做对比。如果地面 200 米就开始严重丢包,空中基本也不会好太多,先别飞,回头检查天线和配置。
5. 天线、结构与飞行安全
5.1 天线安装位置的核心原则
天线是整条数传链路里最容易被忽视、又对效果影响最大的部分。S3B 模块本身能力再强,天线被碳纤维机架挡住,信号照样出不去几十米。
摆放天线有几个基本原则。第一是尽量远离碳纤维结构和大面积金属件,碳纤维本身会屏蔽射频信号,贴在被遮挡的机身内基本等于没有天线。第二是尽量保持天线竖直,和地面站天线保持相同极化方向。线极化对极化失配很敏感,一个天线横着、一个天线竖着,距离会直接缩水一大截。第三是天线附近不要平行贴着电池、电源线和摄像头排线,这些线缆会吸收部分射频能量。
机载端我一般把天线固定在起落架或者机臂外侧,尽量远离 GPS 天线。虽然频率不同,但射频信号之间的干扰还是可能影响 GPS 接收灵敏度。如果机架空间有限,至少也要保证天线主体露在机壳外面,不要让机壳边框横在辐射方向上。
5.2 供电与射频干扰的再讨论
前面提过供电电流问题,这里再多说几句。S3B 在最大功率发射时,模块表面的温度会明显上升,这在夏天太阳直晒下尤其明显。过热会导致发射功率下降,距离缩短。有条件的话,机载端的 S3B 不要紧紧贴在飞控或电调散热片上,稍微留一点空气流动的空间。
如果发现 S3B 工作时会干扰飞控的 GPS 或者 IMU,优先检查是不是天线离传感器太近。其次可以尝试降低发射功率等级,某些场景下把功率从 +24dBm 降到 +20dBm,距离只损失一点,但干扰问题可能就消失了。这个问题在集成度很高的 FPV 机架上尤其常见。
5.3 摔机或异常断链后的恢复检查
数传链路一旦出问题,先检查软件配置的人都走了弯路。我的习惯是先物理后软件。看天线有没有松动,SMA 座有没有开裂,U.FL 线有没有脱扣,模块引脚有没有虚焊。很多“突然距离变短”的故障,最后都源于天线座内部的同轴接触不良。
如果物理检查没问题,再用 XCTU 读一下模块信息,看固件是否还正常响应。如果模块完全无响应,有可能是供电异常导致模块进入保护状态,断电几分钟再上电试试。如果模块能响应但通信距离明显缩短,优先怀疑功放部分受过损伤,比如频繁热插拔天线或者长时间过温工作导致的。
6. 常见问题与排查技巧实录
6.1 问题速查表
| 故障现象 | 可能原因 | 处理方法 |
|---|---|---|
| 上电后串口无数据 | RX/TX 接反,或电平不匹配 | 交叉接线,确认 3.3V TTL 电平 |
| 两模块无法互通 | ID 不一致,或 DH/DL 地址错误 | 统一 PAN ID,核对目标 64 位地址 |
| 距离很近却严重丢包 | 天线被遮挡、极化方向不一致 | 重放天线,保持两端天线同向竖直 |
| MAVLink 连不上 | 飞控、S3B、地面站波特率不一致 | 三处波特率统一,检查协议选择 |
| 偶尔出现乱码 | 电源纹波过大或电平临界 | 加电容,确认供电稳定 |
| 发射瞬间飞控复位 | TELEM 口取电不足 | 改为独立 3.3V 供电 |
| 模块发热严重 | 长时间满功率发射,散热不足 | 降低功率等级,改善散热 |
| XCTU 扫描不到模块 | 串口板电平错误或接线错误 | 换 3.3V 串口板,检查 RX/TX |
6.2 三个容易被忽略的配置坑
第一个坑是写配置时没有保存。AT 命令改了 ID、地址,如果不执行 WR,断电后全部复位。这种问题最坑的一点是,测试的时候一切正常,第二天拿到外场一上电,链路不通,你会以为天线或者模块坏了,实际上只是配置被重置了。
第二个坑是进入命令模式的时序。在透传模式下,模块会把所有收到的字符当数据转发。你要改配置时,必须先让链路静默,再发送“+++”,模块回 OK 之后才能输入 AT 命令。如果串口调试工具发送“+++”时同时发送了换行符,模块可能不识别,要试几次。
第三个坑是两个模块固件版本不一致。不同版本的跳频算法和协议实现可能不兼容,导致搜索不到对方。我建议到手后两块模块都用 XCTU 刷成完全相同的固件版本,再开始配置,不然会遇到很多“明明设置一模一样就是不通”的灵异问题。
6.3 几组典型实测数据与我的判读习惯
我自己的测试场景是一架四旋翼,机载端用 U.FL 转 SMA 接了一根 5dBi 全向天线,垂直固定在起落架边上;地面站用吸盘天线放在车顶约 1.5 米高,飞控串口波特率 57600,S3B 也对应设置 57600。
地面 100 米距离时,RSSI 通常在 -60dBm 到 -65dBm 之间,丢包率接近 0。飞到 300 米高度、水平距离 1.5 公里左右,RSSI 大概在 -75dBm 附近,遥测数据刷新依然比较流畅。到 3 公里以外,RSSI 会掉到 -85dBm 以下,这时候就会出现零星丢包,MAVLink 心跳偶尔超时,但链路还没有彻底断。
我个人的判读习惯是:RSSI 高于 -70dBm 可以放心飞,-70 到 -85dBm 要留意天线姿态,低于 -90dBm 基本就该考虑返航或者降低高度了。这些数值受具体天线、飞控功率和环境影响很大,但作为一个参考门槛还是很有用的。
写在最后的一点体会
整套链路搭下来,我最大的感受是:决定通信距离的头号因素,往往不是模块本身,而是天线位置和安装细节。很多人执着于刷固件、换模块、调功率,却忽略了一根摆放合理的 5dBi 天线就足以让距离翻倍。我每次飞行的前几分钟都会花三分钟做一次地面 Range Test,把 RSSI 记录到飞控日志里。这样飞机飞到外场信号变差了,回头翻日志就能快速定位是天线松了、还是被机架挡住、还是地面端朝向有问题。希望这篇记录能帮准备自己搭无人机数传电台的朋友避开我已经踩过的坑,让链路一次到位。