iNavFlight之RC遥控MSP协议
iNavFlight之RC遥控MSP协议
- 1. RC摇杆MSP协议
- 2. 地面站配置 & MSP遥控器
- 2.1 iNav地面站-配置
- 2.2 iNav地面站-MSP遥控器
- 3. RC摇杆总体逻辑框架
- 3.1 摇杆信息获取
- 3.2 摇杆信息处理
- 3.3 摇杆处理初始化
- 4. RC摇杆代码设计框架
- 4.1 场景分析
- 4.2 模块化抽象
- 5. MSP摇杆代码设计
- 5.1 rxMspInit
- 5.2 rxMspFrameStatus
- 5.3 rxMspReadRawRC
- 5.4 rxMspFrameReceive
- 6. 整体Rx业务逻辑处理(processRx)
- 7. 参考资料
1. RC摇杆MSP协议
iNav在地面站配置工具中,有一个MSP遥控器。该遥控器模拟了一个RC遥控器,通过MSP协议将RC摇杆信息的发送给飞控。
因此,这里也就给第三方提供了遥控控制MSP协议接口,通过这个链路将可以给飞控发送RC摇杆信息。
2. 地面站配置 & MSP遥控器
2.1 iNav地面站-配置
使能MSP遥控器的方法,需要在iNav地面站配置软件里面选择接受模式为MSP。
2.2 iNav地面站-MSP遥控器
通过iNav地面站提供的遥控器UI界面,我们可以基本操作飞机。当然相对来说不是很方便 :)
但是不管如何,我们可以基于MSP协议,通过MSP遥控器来操作飞机。当然如果换成自己的接收机就可以控制飞机了(无需修改任何开源代码)。
3. RC摇杆总体逻辑框架
以RC摇杆信息为中心,从逻辑角度,需要三个步骤:
- 摇杆信息获取
- 摇杆信息处理
- 摇杆处理初始化
3.1 摇杆信息获取
- MSP协议命令:MSP_SET_RAW_RC(200)
- 任务频度:TASK_PERIOD_HZ(100)
- 任务优先级:TASK_PRIORITY_LOW
taskHandleSerial //摇杆信息获取└──> mspFcProcessCommand└──> mspFcProcessInCommand //case MSP_SET_RAW_RC└──> rxMspFrameReceive#define MSP_SET_RAW_RC 200[TASK_SERIAL] = {.taskName = "SERIAL",.taskFunc = taskHandleSerial,.desiredPeriod = TASK_PERIOD_HZ(100), // 100 Hz should be enough to flush up to 115 bytes @ 115200 baud.staticPriority = TASK_PRIORITY_LOW,},
3.2 摇杆信息处理
- 任务频度:TASK_PERIOD_HZ(10)
- 任务优先级:TASK_PRIORITY_HIGH
taskUpdateRxMain //摇杆信息处理└──> processRx└──> calculateRxChannelsAndUpdateFailsafe[TASK_RX] = {.taskName = "RX",.checkFunc = taskUpdateRxCheck,.taskFunc = taskUpdateRxMain,.desiredPeriod = TASK_PERIOD_HZ(10), // If event-based scheduling doesn't work, fallback to periodic scheduling.staticPriority = TASK_PRIORITY_HIGH,},
3.3 摇杆处理初始化
对C语言了解的同学,这里就不讲了 :)
main //摇杆处理初始化└──> init└──> rxInit
4. RC摇杆代码设计框架
4.1 场景分析
鉴于摇杆信息从使用场景上看,主要是两种类型和十三种串行遥控器协议。所以,从整体上设计上需要考虑这些种类的摇杆信息输入。
typedef enum {RX_TYPE_NONE = 0,RX_TYPE_SERIAL,RX_TYPE_MSP
} rxReceiverType_e;typedef enum {SERIALRX_SPEKTRUM1024 = 0,SERIALRX_SPEKTRUM2048,SERIALRX_SBUS,SERIALRX_SUMD,SERIALRX_IBUS,SERIALRX_JETIEXBUS,SERIALRX_CRSF,SERIALRX_FPORT,SERIALRX_SBUS_FAST,SERIALRX_FPORT2,SERIALRX_SRXL2,SERIALRX_GHST,SERIALRX_MAVLINK,
} rxSerialReceiverType_e;
4.2 模块化抽象
经过整理和抽象以后,每种摇杆信息的使用过程无不离开如下五个步骤:
- rcInit
- rcFrameStatus
- rcProcessFrame
- rcReadRaw
- rcFrameReceive
5. MSP摇杆代码设计
本章重点介绍MSP摇杆的代码设计,当然我们依然按照逻辑思路和抽象化设计概念走。
- rcInit ==> rxMspInit
- rcFrameStatus ==> rxMspFrameStatus
- rcProcessFrame ==> 无,这里不展开,因为有些协议有反馈遥控器一些ID信息等等之类操作。
- rcReadRaw ==> rxMspReadRawRC
- rcFrameReceive ==> rxMspFrameReceive
5.1 rxMspInit
基于MSP协议的RC摇杆初始化
- 将rxMspReadRawRC和rxMspFrameStatus两个处理函数挂上统一处理框架
- 支持18个RC摇杆通道
- 支持200ms超时处理
void rxMspInit(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig)
{UNUSED(rxConfig);rxRuntimeConfig->channelCount = MAX_SUPPORTED_RC_CHANNEL_COUNT;rxRuntimeConfig->rxSignalTimeout = DELAY_5_HZ;rxRuntimeConfig->rcReadRawFn = rxMspReadRawRC;rxRuntimeConfig->rcFrameStatusFn = rxMspFrameStatus;
}#define MAX_SUPPORTED_RC_CHANNEL_COUNT 18
#define DELAY_5_HZ (1000000 / 5)
5.2 rxMspFrameStatus
这个不难理解,无非就是MSP协议的RC摇杆只有两种状态:PENDING or COMPLETE
static uint8_t rxMspFrameStatus(rxRuntimeConfig_t *rxRuntimeConfig)
{UNUSED(rxRuntimeConfig);if (!rxMspFrameDone) {return RX_FRAME_PENDING;}rxMspFrameDone = false;return RX_FRAME_COMPLETE;
}
5.3 rxMspReadRawRC
获取当前某个通道的摇杆值。
static uint16_t rxMspReadRawRC(const rxRuntimeConfig_t *rxRuntimeConfigPtr, uint8_t chan)
{UNUSED(rxRuntimeConfigPtr);return mspFrame[chan];
}
5.4 rxMspFrameReceive
- 收到报文直接进行复制,且报文数据按照0 - MAX_SUPPORTED_RC_CHANNEL_COUNT 依次排列。
- 该报文接收函数是在MSP端口配置的时候进行调度的,因此不在MSP遥控模块进行初始化。
注:
void rxMspFrameReceive(uint16_t *frame, int channelCount)
{for (int i = 0; i < channelCount; i++) {mspFrame[i] = frame[i];}// Any channels not provided will be reset to zerofor (int i = channelCount; i < MAX_SUPPORTED_RC_CHANNEL_COUNT; i++) {mspFrame[i] = 0;}rxMspFrameDone = true;
}
6. 整体Rx业务逻辑处理(processRx)
略:详见void processRx(timeUs_t currentTimeUs)
注:这里就不再将代码一一罗列出来,看一遍加注释了。如果真有朋友有兴趣,请评论留言,我有机会一一整理。
7. 参考资料
【1】Multiwii Serial Protocol Version 2
【2】BetaFlight模块设计之三十二:MSP协议模块分析
【3】iNavFlight之MSP Sensor报文格式
iNavFlight之RC遥控MSP协议相关推荐
- iNavFlight之RC遥控CRSF协议
iNavFlight之RC遥控CRSF协议 1. 遥控器电传框架设计 1.1 场景分析 1.2 逻辑框架 1.2.1 电传信息获取 1.2.2 电传信息处理 1.2.3 电传初始化 1.3 模块化设计 ...
- BetaFlight模块设计之三十二:MSP协议模块分析
BetaFlight模块设计之三十二:MSP协议模块分析 1. MSP协议模块 1.1 MSP描述 1.2 MSP版本优缺点 1.3 MSP代码资源 2. MSP报文解析 2.1 MSP收包状态机 2 ...
- 一个无线遥控通讯协议破解实例
2.4G无线遥控通讯协议破解-美嘉欣 准备做平衡车,缺个遥控器,又不想用手机App.刚好手中有个之前买的遥控直升机,配套的2.4G遥控器看着还行,就打算拿来用在平衡车上.于是就开始了破解 ...
- FPGA 24 工程模块 红外遥控(NEC协议)解码
FPGA 24 红外遥控(NEC协议)解码 主要功能 :设计了一个红外 NEC协议的解码模块 实现(设计)流程:通过遥控器发送的红外信号,外围红外信号接收传感器对数据进行接收,得到一个在基频上的高低电 ...
- STM32F4 高主频引起的PS2遥控手柄协议移植问题
在STM32F103主板上运行正常的PS2手柄驱动协议,平移到STM32F405的板子上,遇到板子收不到手柄按键信号的情况.各种查找资料,各种测试之后,终于在这篇博文的启发下找到了问题.关于使用STM ...
- iNavFlight之电传MAVLink协议
iNavFlight之电传MAVLink协议 1. 业务逻辑框架 2. MAVLink电传报文 2.1 MAVLink电传报文格式 2.2 iNav支持地面站报文(接收) 2.3 iNav支持飞控报文 ...
- iNavFlight之MSP DJI协议飞控端请求应答
iNavFlight之MSP DJI协议飞控端请求应答 1. 报文格式 2. 报文标志(flag) 3. 报文命令(cmd) 4. 请求应答 & 反馈报文 4.1 DJI_MSP_API_VE ...
- iNavFlight之MSP v2 Sensor报文格式
iNavFlight之MSP v2 Sensor报文格式 1. MSP v2传感报文介绍 2. MSP v2协议格式 3. MSP v2传感代码流程 4. MSP v2 传感器 4.1 光流传感报文- ...
- 惠而浦空调遥控协议分析及使用Arduino遥控空调
一.工具 1.红外接收头(HS1838): 2.940nm红外发光二极管及限流电阻100Ω左右: 3.Arduino及Prototype Shield: 4.Saleae Logic兼容逻辑分析仪(价 ...
最新文章
- Y15BeTa蜂鸣器唱歌程序-演奏版
- Access数据库创建字段类型无效问题
- 震惊!温州一程序员编完八皇后吐血而亡,他的代码是什么样子?!!
- 【机器学习】六种算法在人脸补全中的应用比较(K紧邻,线性,决策树,岭回归,套索回归,ElasticNet)
- android stepview 京东,Android-Android-OpenAPI SDK-帮助文档-京东云
- 【Okio】Okio 简单入门
- SQL Server 锁
- THINKPHP_关联模型MANY_TO_MANY
- android自定义控件动态,GitHub - itrenjunhua/WaveView: Android自定义控件实现动态百分比水波纹效果...
- oracle高效分页存储过程(百万数据级)
- 让极路由给支持WDS的路由器无线桥接教程
- 《武义九州》隐私政策
- 寻找春天amp;nbsp;九宫格日记-2014.04.26
- 数据库候选关键词怎么求_如何选取关键词?
- 网易严选应用的云原生演进实践
- python排序获得秩 (index)
- 计算机系统数据保存期限,哪种存储器存储数据时间长?
- spd耗材管理流程图_医用耗材SPD管理模式详解
- 探索STM32F407ZET6,全套设计资料,包含原理图
- HttpClient 模拟登录手机版新浪微博
热门文章
- Swift语法之 ---- ?和!区别
- 如何在word2013中添加MathType插件
- 菜鸟的NLP学习记002 ---------斯坦福公开课CS224n--------词向量表示:Word2Vec
- python发帖技巧_Cterm里面自动发帖的Python脚本
- java 寻找峰值峰谷_java – 时间序列中的峰值检测
- UE4 虚幻引擎,绑定Mesh到Skeleton骨骼插槽Socket
- 【Tableau 图表大全6.0】之散点图
- java生成cron表达式构造器
- java之《图书管理系统》庖丁解牛
- Visual Studio Code (VS Code) - 自定义大写和小写转换快捷键