首页 > 其他分享 >RM遥控&键鼠控制总结

RM遥控&键鼠控制总结

时间:2024-08-25 21:51:51浏览次数:11  
标签:DMA HAL 键鼠 遥控 pData 遥控器 RM DBUS USART1

硬件&通信介绍

RM比赛中各个参赛队伍使用的都是大疆官方提供的遥控器套装,包括遥控器和接收机,接收机上共三个引脚:VCC,GND,DBUS(数据通道),首次使用需要进行遥控器和接收机配对,在两者都上电的情况下短按接收机上的对频按键即可(位于指示灯旁边)。在官方更新了遥控器的固件版本之后,遥控器上手轮也已经开放。

遥控器通讯采用的是2.4GHz频段的DBUS通讯协议,接收机工作电压为4-8.4V,输出信号满足TTL电平,但是为负逻辑,因此接收机和单片机之间需要加反相器来获得正确的数据(官方开发板的USART1接口已经集成)。

接收机的数据发送周期为14ms,每次发送18字节数据,和单片机通过串口通信,通信参数如下:

1.jpg

2.jpg

什么是DBUS?

DBUS是一个轻量级的IPC,用于进程间或进程与内核间的通信,DBUS通信结构下图:

Bus daemon(总线守护进程):DBUS是点对点进行通信,所以基本上DBUS进程连接的都是Bus daemon,Bus daemon负责将受到的DBUS信息进行路由、转发。DBUS进程将信息发送给Bus daemon,Bus daemon会结合消息的目标地址、对象路径、消息的类型、以及DBUS进程希望受到的信息进行综合,然后转发。

解码

遥控器的数据每一帧为18个字节,采用串口接收,每个字节都用CPU处理效率较低,因此考虑使用DMA,串口中断使能IDLE(线路空闲),当一帧数据接收完毕之后触发串口中断,调用DMA进行接收。官方手册提供了基于标准库的串口&DMA配置以及解码函数,在这里只贴出中断服务函数(HAL库)以及解码函数,串口和DMA略去。

代码实现(如果要使用请提前定义相关变量):

void RemotreCtl_Data_Receive(void)
{
uint32_t rx_data_len = 0;
if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET)) //判断一帧数据是否接收完成
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1); //清空IDLE标志位
(void)USART1->SR; //清空SR寄存器
(void)USART1->DR; //清空DR寄存器
__HAL_DMA_CLEAR_FLAG(&hdma_usart1_rx,DMA_FLAG_TCIF2_6); //清除DMA传输完成标注
HAL_UART_DMAStop(&huart1); //停止DMA接收
rx_data_len=BSP_USART1_DMA_RX_BUF_LEN-__HAL_DMA_GET_COUNTER(&hdma_usart1_rx);//数据量
HAL_UART_Receive_DMA(&huart1,USART1_DMA_RX_BUF, BSP_USART1_DMA_RX_BUF_LEN); //读数据
if(rx_data_len== 18) //如果数据量正确,则进行解码
{
RC_DataHandle(USART1_DMA_RX_BUF);
}
}
}
2.解码函数
voidRC_DataHandle(uint8_t *pData)
{
if(pData == NULL)
{
return;
}
/*pData[0]为ch0的低8位,Data[1]的第三位为ch0的高三位*/
RemoteCtrlData.remote.ch0 =((uint16_t)pData[0] | (uint16_t)pData[1] << 8) & 0x07FF;
/*pData[1]的高5位为ch1的低五位,pData[2]的低6位为ch1的高6位*/
RemoteCtrlData.remote.ch1 = ((uint16_t)pData[1] >> 3 |(uint16_t)pData[2] << 5) & 0x07FF;
/*pData[2]的高2位为ch3的低二位,pData[3]为ch3的3~10位,pData[4]的最低位为ch3的最高位*/
RemoteCtrlData.remote.ch2 = ((uint16_t)pData[2] >> 6 |(uint16_t)pData[3] << 2 | (uint16_t)pData[4] << 10) & 0x07FF;
/*pData[4]的高7位为ch4的低7位,pData[5]的低4位为ch4的高4位*/
RemoteCtrlData.remote.ch3 = ((uint16_t)pData[4] >> 1 |(uint16_t)pData[5] << 7) & 0x07FF
/*pData[5]的高8位为S1*/
RemoteCtrlData.remote.s1 = ((pData[5] >> 6) &0x03);
/*pData[5]的6、7位为s2*/
RemoteCtrlData.remote.s2 = ((pData[5] >> 4) &0x03);
/*pData[6]和pData[7]鼠标x方向*/
RemoteCtrlData.mouse.x = ((int16_t)pData[6] |(int16_t)pData[7] << 8);
/*pData[8]和pData[9]为鼠标Y方向*/
RemoteCtrlData.mouse.y = ((int16_t)pData[8] | (int16_t)pData[9] << 8);
/*pData[10]和pData[11]为鼠标Z方向*/
RemoteCtrlData.mouse.z = ((int16_t)pData[10] | (int16_t)pData[11] << 8);
/*pData[12]为鼠标左键*/
RemoteCtrlData.mouse.press_l = pData[12];
/*pData[13] 为鼠标右键*/
RemoteCtrlData.mouse.press_r = pData[13];
/*pData[14]和pData[15]为键盘*/
RemoteCtrlData.key.v = ((int16_t)pData[14]) |((int16_t)pData[15] << 8);
}

在上面的代码里,DMA被用于UART通信,以实现高效的数据接收。

键鼠控制的小tips

键鼠控制和遥控器有所不同,按键存在延时,按下一个键该键值会被置高一段时间,并且在中断中不能通过延时来解决该问题。

按下按键之前:

3.jpg

短暂按下按键之后:

4.jpg

基本上短按都会持续 7~14次接收周期, 所以如果想要用按键做模式切换的话,至少需要延时20个接收周期,也就是在第一次接收到这个键之后20次接收中断中不再对这个键进行解码,因为模式切换通常来说不会在短时间内进行,所以我建议1S之内都不对这个按键进行解码,从而实现可靠模式切换。

标签:DMA,HAL,键鼠,遥控,pData,遥控器,RM,DBUS,USART1
From: https://blog.csdn.net/weixin_74923758/article/details/141534451

相关文章

  • 【HarmonyOS NEXT应用开发】案例99:基于HiAppEvent能力的应用崩溃监控上报
    HiAppEvent介绍:HiAppEvent的接口设计,由系统决定回调的时机。使用这种机制,可以获取的应用崩溃事件结构化日志。HiAppEvent运营&运维事件软件模块,用于连接APP开发者、APM上传模块、HiView故障维测服务。支撑应用开发者完成运营和运维的数据分析工作。主要通过如下措施支持开发......
  • 【HarmonyOS NEXT应用开发】案例98:HiLog日志能力介绍
    ⦁   日志打印及显示。日志打印格式:日期时间进程号线程号日志级别domainID/日志标签:日志内容如下所示,这是一条domainID为0x003200和标签是"testTag"的info级别的日志:04-1917:02:14.735 5394 5394IA03200/testTag:thisisainfolevelhilog说明:日志级......
  • DMP调研(Data Management Platform-数据管理平台)
    基础概念数据资产CRM、DMP、CDP定义CustomerDataPlatform(CDP,客户数据平台):对于企业来说,CDP是作为全链路运营的核心数据系统。是汇集所有客户数据并将数据存储在统一的、可多部门访问的数据平台中,让企业各个部门都可以轻松使用。这种平台通常包括一个集中的数据库,用于......
  • 芯片、GPU、CPU、显卡、显存、x86、ARM、AMD等基础知识
    1.芯片芯片指的是半导体材料制成的集成电路,可以包含一个或多个电子元件、电路或系统。芯片可以是任何电子设备的组成部分,不仅限于CPU,还包括GPU、内存芯片、存储控制器、网络接口等。GPU和CPU是两种最常见的特定的芯片。它们分别针对图形处理和通用计算任务进行了优化。2.CPU......
  • 【鸿蒙学习】HarmonyOS应用开发者高级认证 - 应用DFX能力介绍(含闯关习题)
    学完时间:2024年8月24日学完排名:第1698名一、PerformanceAnalysisKit简介PerformanceAnalysisKit(性能分析服务)为开发者提供应用事件、日志、跟踪分析工具,可观测应用运行时状态,用于行为分析、故障分析、安全分析、统计分析,帮助开发者持续改进应用体验。使用场景应用......
  • 销售易CRM怎么样?如何自动同步?
    销售易CRM是什么?销售易CRM是一款企业级CRM软件,它利用先进的移动互联、社交网络和云计算技术,提供从营销、销售到服务的一体化解决方案。销售易CRM不仅是一个软件工具,更是一种企业经营管理理念,通过智能技术的应用,企业能够更好地理解和服务客户,实现可持续增长。销售易CRM的主要......
  • 开发日志:表单解析 LeipiFormDesign
    PHP版本:https://gitee.com/yxkj_2/LeipiFormDesigner/blob/LeipiFormDesigner/Formdesign4_1/php/Formdesign.class.phpjs版本: varleipiFormDesign={/*执行控件*/exec:function(method){ue.execCommand(method);},......
  • iTransformer时序模型改进——基于SENet和TCN的倒置Transformer,性能暴涨
    1数据集介绍ETT(电变压器温度):由两个小时级数据集(ETTh)和两个15分钟级数据集(ETTm)组成。它们中的每一个都包含2016年7月至2018年7月的七种石油和电力变压器的负载特征。 数据集链接:https://drive.google.com/drive/folders/1ZOYpTUa82_jCcxIdTmyr0LXQfvaM9vIy......
  • 银河麒麟系统V10(arm版)安装nginx-1.14.1说明
    #银河麒麟系统#、#nginx#随着2024年微软全球蓝屏事件的出现,系统安全越来越重要。目前很多企业开始尝试国产化操作系统上,本文介绍如何在国产化银河麒麟系统V10(arm)版上安装nginx-1.14.1。本资源是arm版本的nginx-1.14.1的rpm离线安装包(下载地址:银河麒麟系统arm版nginx-1.14.1-......
  • vit和swin transformer的区别
    ViTvsSwinTransformerViT和SwinTransformer的区别1.架构设计ViT(VisionTransformer):ViT直接将图像分割成固定大小的非重叠小块(patches),然后将每个小块展开成一个向量,并将这些向量序列作为输入送入标准的Transformer架构中。每个小块会被映射到一个高维特征空间,然......