news 2026/8/3 0:08:10

APM使用LUA脚本发送实现遥控器PWM信号输出CAN协议信号

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
APM使用LUA脚本发送实现遥控器PWM信号输出CAN协议信号

需求:由于舵机是CAN总线舵机,需实现APM开源飞控遥控器输入PWM通道到CAN的发送。

方法1:修改APM固件源码,编译,运行,测试。实现复杂。
方法2:使用lua脚本。实现简单

目前采用方法2,使用lua脚本:
几乎所有运行ArduPilot 4.5及以上固件、并且有足够存储空间的飞控,理论上都支持Lua脚本

一定要升级飞控版本到4.5以上。早期的支持比较差,各种运行不通。

✅ 运行Lua PWM→CAN 的必要设置(完整清单)
一、固件版本要求
项目 要求 说明
ArduPilot版本 ≥ 4.5.0 4.6.3验证可用,4.5以上才完整支持Lua CAN API
飞控硬件 有足够Flash/MCU CUAV V5+/X7、Pixhawk系列、H7系列等
二、参数设置(必须)

  1. Lua脚本总开关
    参数 设置值 说明
    SCR_ENABLE 1 启用Lua脚本引擎
    SCR_DIR_DISABLE 0 确保scripts目录被读取(默认0)

  2. CAN接口参数(以CAN1为例)
    参数 设置值 说明
    CAN_P1_DRIVER 1 启用CAN1硬件接口
    CAN_D1_PROTOCOL 12 (Scripting2) 关键! 让Lua脚本接管CAN口
    CAN_P1_BITRATE 按需(如250000) 与你的CAN设备匹配
    如果是用第二个CAN口,对应参数为 CAN_P2_DRIVER、CAN_D2_PROTOCOL

  3. 修改参数后的关键操作
    操作 说明
    写入参数 点击"写入参数"保存
    完全断电重启 拔掉USB线和电池,等30秒再上电
    只点"重启飞控"可能不够,彻底冷启动才能让CAN驱动正确初始化

三、脚本文件要求
项目 要求 说明
存放路径 /APM/scripts/ 必须严格区分大小写
文件名后缀 .lua(小写) 不能是 .lua.txt
文件编码 UTF-8 无BOM 推荐用VS Code/Notepad++编辑

上传新脚本前,快速过一遍:

固件版本 ≥ 4.5(当前4.6.3 ✅)

SCR_ENABLE = 1

CAN_P1_DRIVER = 1

CAN_D1_PROTOCOL = 12(关键!)

已完全断电重启(拔USB+电池)

脚本放在 /APM/scripts/ 目录

文件名以 .lua 结尾

代码中用 CAN:get_device2(5)(Protocol 12专用)

定时用 update 函数(最兼容)

CAN ID用 uint32_t() 包裹

CAN分析仪已监听或设备已连接

-- pwm_to_can_template.lua-- 稳定版模板(Protocol 12 + update函数)```lualocaldriver=CAN:get_device2(5)ifnotdriverthengcs:send_text(0,"CAN init failed")returnendgcs:send_text(0,"PWM→CAN script started")locallast_send=0localTX_INTERVAL=20-- mslocalframe_count=0localfunctionsend_frames()frame_count=frame_count+1forch=1,9do-- 读取PWMlocalpwm=rc:get_pwm(ch)or1500pwm=math.min(math.max(pwm,1000),2000)-- 构建数据(根据你的协议修改)localdata={0x22,0x03,0x60,0x00,pwm%256,math.floor(pwm/256),0x00,0x00}-- 发送CAN帧localmsg=CANFrame()msg:id(uint32_t(0x0600+ch))msg:dlc(8)fori=0,7domsg:data(i,data[i+1])enddriver:write_frame(msg,10000)end-- 调试输出(每秒一次)ifframe_count%(1000/TX_INTERVAL)==0thengcs:send_text(0,string.format("Running: %d Hz",1000/TX_INTERVAL))endendlocalfunctionupdate()localnow=millis()ifnow-last_send>=TX_INTERVALthensend_frames()last_send=nowendreturnupdate,TX_INTERVALendreturnupdate()

保存代码,然后在mission planner中拷贝到这里,如果没有SCRIPTS文件夹,就自己建立一个。

最后的效果:```

最后,用雷迅X7的飞控实现CAN通信舵机如下

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 15:05:06

从接口到业务协同:看懂 SAP 集成与 API 的底层逻辑

在很多企业项目里,业务系统从来都不是孤岛。人力、财务、采购、销售、制造、客户服务,往往分布在不同产品、不同平台,甚至不同云环境里。真正让这些系统协同运转的,不是某一个单独的事务码,也不是某一张漂亮的报表,而是隐藏在背后的 integration 和 API。它们决定了一条业…

作者头像 李华
网站建设 2026/7/14 15:05:20

从零搭建ComfyUI:硬件选型、环境部署与工作流优化实战

1. ComfyUI入门:为什么选择节点式工作流? 第一次打开ComfyUI时,那种密密麻麻的节点连线界面确实容易让人发懵——这和我熟悉的WebUI差别太大了!但用惯之后才发现,这种看似复杂的设计才是真正的生产力工具。就像从Windo…

作者头像 李华
网站建设 2026/7/14 15:05:17

从部署到对话:Qwen3-0.6B-FP8图文并茂的完整操作流程

从部署到对话:Qwen3-0.6B-FP8图文并茂的完整操作流程 1. 开篇:为什么选择Qwen3-0.6B-FP8? 如果你正在寻找一个能在普通电脑上流畅运行,同时又能干点“聪明事”的AI模型,那么Qwen3-0.6B-FP8很可能就是你的菜。 想象一…

作者头像 李华