ArduPilot 中使用 SmartAudio Lua 脚本通过 RC 遥控器控制 VTX 图传功率
2026/9/15 16:30:49 网站建设 项目流程

ArduPilot 中使用 SmartAudio Lua 脚本通过 RC 遥控器控制 VTX 图传功率

【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot

SmartAudio 是 FPV 图传(VTX)厂商广泛采用的一种串行控制协议。ArduPilot 官方在 libraries/AP_Scripting/applets/SmartAudio.md 中提供了一款开箱即用的 Lua 脚本,让飞手无需地面站,即可通过 RC 遥控器通道在飞行中切换 SmartAudio 2.0 图传的发射功率(Pit Mode / 低 / 中 / 高 / 最大五档),并可在系统上电时自动设定初始功率。阅读完本文,你将掌握该脚本的接线方式、飞控端串口与 RC 通道的完整参数配置、功率档位与 PWM 的映射关系,以及脚本内部的实现原理与协议细节。

脚本能做什么

SmartAudio Lua 脚本(SmartAudio.lua)实现了两大功能:

  • RC 实时调功率:通过一个 RC 通道(RCx_OPTION设为 300)的摇杆位置或拨杆开关,实时把 VTX 切换到 Pit Mode、LOW、MED、HIGH、MAX 五档功率之一。功率只在该通道的取值跨越到新档位区间时才会被激活。
  • 开机设定初始功率:通过参数SCR_USER1设定上电后的初始功率,可以选择保持原样(-1),或直接进入上述五档之一。

脚本通过 UART 串口以 SmartAudio 2.0 协议与 VTX 通信,同时通过 GCS(地面站)文本消息确认开机功率值与后续每一次功率变更,方便调试与确认。

从源码结构看,脚本依赖 ArduPilot 的 Lua 脚本绑定(paramrcserialgcs接口),因此需要飞行控制器固件启用 Lua 脚本功能(通常要求 ArduPilot 4.1 或更新版本,并具备足够 Flash 空间),运行时它会注册到脚本调度器循环执行。

硬件连接与串口配置

接线

  1. 在飞控上找一个空闲的 UART 串口。
  2. 将该串口的TX引脚接到 VTX 的SmartAudio输入引脚。
  3. 该 UART 在飞控参数中以SERIALx_PROTOCOL = 28(脚本串口)启用,SERIALx_OPTIONS = 4(半双工)。

文档明确指出:SmartAudio 信号是半双工串行通信,因此SERIALx_OPTIONS必须设为 4(半双工模式),否则 VTX 返回的状态信息将无法正常接收。脚本源码中对应的初始化代码为port:begin(4800)(SmartAudio.lua),即以 4800 波特率打开该串口——这正是 SmartAudio 协议的标准波特率。

相关参数汇总

参数取值作用
SERIALx_PROTOCOL28将该串口指定为 Lua 脚本串口
SERIALx_OPTIONS4半双工模式(SmartAudio 通信必需)
RCx_OPTION300指定用于切换功率的 RC 通道(对应 Scripting1 辅助功能)
SCR_USER1-1 / 0 / 1 / 2 / 3 / 4上电初始功率:-1 保持原样,0=Pit Mode,1=LOW,2=MED,3=HIGH,4=MAX

RC 通道辅助功能 300 的官方定义为300:Scripting1(参见 RC_Channel.cpp 中的取值注释),脚本通过rc:find_channel_for_option(300)(SmartAudio.lua)来查找该通道。SCR_USER1是脚本通用用户参数之一,脚本通过param:get('SCR_USER1')(SmartAudio.lua)读取。

功率档位与 PWM 映射

脚本把 RC 通道的归一化输入(norm_input(),范围为 -1 到 1)映射为 1 到 5 的档位整数:

function get_power() input = scripting_rc:norm_input() -- - 1 to 1 input = (input + 1) * 2 -- 0 to 4 return math.floor(input+0.5) + 1 -- integer 1 to 5 end

(SmartAudio.lua)

即以通道 PWM 的中间值 1500 为中心,将全量程线性切分成 5 等份。文档给出了RCx_MIN = 1000RCx_MAX = 2000时的完整映射表:

PWM 范围功率档位
1000 – 1124Pit Mode
1125 – 1374LOW
1375 – 1624MED
1625 – 1874HIGH
1875 – 2000MAX

注意:实际输出的物理功率取决于所使用图传的具体型号与固件——同一档位在不同 VTX 上可能对应不同的毫瓦(mW)功率值,Pit Mode(坑道模式/低功率维修模式)亦然。若RCx_MIN/RCx_MAX不是 1000/2000,档位边界会按比例线性平移。

档位切换的内部流程

脚本的主循环非常简洁,由调度器每 500ms 调用一次:

function update() setPower(get_power()) return update, 500 end

(SmartAudio.lua)

setPower(power)会先与内部保存的_current_power比较,只有档位真正变化时才发送串口指令并上报 GCS,从而避免反复发送相同指令:

function setPower(power) if power == _current_power then return end updateSerial(power_commands[power][1]) gcs:send_text(4, power_commands[power][2]) _current_power = power end

(SmartAudio.lua)

发送的指令是预置的 SmartAudio 2.0 十六进制命令帧,保存在power_commands表中:

power_commands[1] = { {0x00,0x00,0xAA,0x55,0x0B,0x01,0x01,0xF8,0x00}, "VTX Pit Mode" } power_commands[2] = { {0x00,0x00,0xAA,0x55,0x05,0x01,0x00,0x6B,0x00}, "VTX PWR LOW" } power_commands[3] = { {0x00,0x00,0xAA,0x55,0x05,0x01,0x01,0xBE,0x00}, "VTX PWR MED" } power_commands[4] = { {0x00,0x00,0xAA,0x55,0x05,0x01,0x02,0x14,0x00}, "VTX PWR HIGH" } power_commands[5] = { {0x00,0x00,0xAA,0x55,0x05,0x01,0x03,0xC1,0x00}, "VTX PWR MAX" }

(SmartAudio.lua)

这些帧符合 SmartAudio 帧结构:同步字节0xAA+ 头字节0x55,随后是命令字与载荷。对照 ArduPilot 原生 SmartAudio 驱动 AP_SmartAudio.h 中的协议定义可以看到:0x05SMARTAUDIO_CMD_SET_POWER(设置功率),0x0BSMARTAUDIO_CMD_SET_MODE(设置模式,用于 Pit Mode),同步字节与头字节的宏定义为SMARTAUDIO_SYNC_BYTE 0xAASMARTAUDIO_HEADER_BYTE 0x55(AP_SmartAudio.h),脚本与原生驱动对协议的理解完全一致。

上电初始功率(SCR_USER1)

脚本初始化(init())时读取SCR_USER1并据此设置开机功率:

if startup_pwr then -- make sure we found the param if startup_pwr >= 0 and startup_pwr < 5 then setPower(math.floor(startup_pwr) + 1) -- set the current power local to that requested by the rc in -- this prevents instantly changing the power from the startup value _current_power = get_power() end end

(SmartAudio.lua)

要点解读:

  • SCR_USER1 = -1(默认):保持不变,即不主动发送任何功率指令,VTX 维持断电前自身记忆的功率。
  • SCR_USER1 = 04:分别对应 Pit Mode、LOW、MED、HIGH、MAX,上电后立即设置。
  • 设置完初始功率后,脚本把_current_power强制赋值为当前 RC 通道所代表的档位。这是一个精心设计的细节:防止 RC 通道当前停留的档位与开机功率不一致时,脚本在第一次update()中立刻把功率改回去。换句话说,开机初始功率只生效一次,随后的功率完全由 RC 通道决定。

脚本初始化前会延迟 2 秒(return init, 2000,见 SmartAudio.lua),给 RC 接收机上电稳定留出时间,也让错误消息更容易被看到。

初始化自检与故障排查

init()中内置了两项自检,失败时会在 GCS 显示明确提示:

if not port then gcs:send_text(0, "SmartAudio: No Scripting Serial Port") return end if not scripting_rc then gcs:send_text(0, "SmartAudio: No RC option for scripting") return end

(SmartAudio.lua)

即:找不到脚本串口,或找不到设置为 300 的 RC 通道时,脚本都会在 GCS 打印SmartAudio: ...错误消息并中止初始化。正常工作时,上电后与每次档位变化,GCS 都会收到"VTX Pit Mode""VTX PWR LOW""VTX PWR MED""VTX PWR HIGH""VTX PWR MAX"之类的确认文本(通过gcs:send_text发送)。

常见排查思路:

  1. 确认固件版本与板卡支持 Lua 脚本(ArduPilot 4.1 及以后),且SCR_ENABLE相关脚本功能已开启、脚本文件已上传到飞控 SD 卡的APM/scripts目录。
  2. 确认SERIALx_PROTOCOL = 28SERIALx_OPTIONS = 4,且 UART 的 TX 确实接到了 VTX 的 SmartAudio 引脚。
  3. 确认RCx_OPTION = 300,并在SCR_USER1中设置了期望的开机功率。
  4. 上电后观察 GCS 是否出现SmartAudio:开头的错误消息或功率确认消息。

关于 Pit Mode 的兼容性说明

文档特别提醒了一个重要兼容性差异:

  • 部分SmartAudio 2.0图传无法通过远程指令进入 Pit Mode,但可以通过本脚本退出 Pit Mode 并切换功率。
  • SmartAudio 2.1图传具备被远程指令置入 Pit Mode 的能力。

也就是说,即使你的 VTX 不支持远程进入 Pit Mode,脚本的其他四档功率控制依然可用。此外,ArduPilot 的 SmartAudio 协议驱动将协议分为 v1 / v2 / v2.1 三个版本(见 AP_SmartAudio.h 中的ProtocolVersion枚举),不同版本的命令响应帧结构存在差异(v2.1 响应中会额外包含当前功率 dBm、功率档位数与各档 dBm 值,见 AP_SmartAudio.h 的注释),本 Lua 脚本按 v2 规范发送命令帧。

与原生 SmartAudio 驱动的对比

需要说明的是,ArduPilot 本身已经内置了完整的 SmartAudio 图传控制支持(AP_VideoTX.cpp + AP_SmartAudio.cpp),原生驱动通过VTX_*参数组(如VTX_POWERVTX_FREQVTX_OPTIONS中的VTX_PITMODE等位标志,见 AP_VideoTX.h)进行配置,并支持change_power()等 API(AP_VideoTX.cpp)。

本 Lua 脚本的价值在于:当飞手更希望"纯脚本 + RC 通道"方式控制功率、或者板载固件未启用原生 VTX 驱动时,提供了一种完全通过 Lua 脚本实现同等控制的轻量方案——其五档划分、上电功率设定与 GCS 反馈均独立实现,不依赖VTX_*参数,且 RC 通道映射逻辑清晰(每 500ms 轮询一次,档位变化才发指令),易于二次修改。

快速配置清单

按以下顺序操作即可完成部署:

  1. 将 SmartAudio.lua 上传到飞控的APM/scripts目录(板卡需支持 Lua 脚本)。
  2. 选择一个空闲 UART 串口,设置SERIALx_PROTOCOL = 28SERIALx_OPTIONS = 4
  3. 将该串口 TX 引脚连接到 VTX 的 SmartAudio 输入。
  4. 选择一个 RC 通道,设置RCx_OPTION = 300作为功率切换通道。
  5. 按需设置SCR_USER1-1保持原功率,0=Pit Mode,1=LOW,2=MED,3=HIGH,4=MAX。
  6. 上电后观察 GCS 文本消息确认开机功率;拨动 RC 通道,确认VTX PWR ...消息随档位切换出现。

配置完成后,功率档位与 PWM 的对应关系、SCR_USER1的含义以及脚本的初始化逻辑都可以随时回到 SmartAudio.md 与 SmartAudio.lua 中核对,ArduPilot 内置的 SmartAudio 协议定义(AP_SmartAudio.h)则为理解底层通信提供了完整的参考。

【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询