RM遥控键鼠控制总结

news2024/9/25 17:20:51

硬件&通信介绍

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之内都不对这个按键进行解码,从而实现可靠模式切换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2073661.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Bootstrap 滚动监听(Scrollspy)插件

滚动监听&#xff08;Scrollspy&#xff09;插件&#xff0c;即自动更新导航插件&#xff0c;会根据滚动条的位置自动更新对应的导航目标。其基本的实现是随着您的滚动&#xff0c;基于滚动条的位置向导航栏添加 .active class。 如果您想要单独引用该插件的功能&#xff0c;那…

快团团团长如何高质量选品?如何做最懂顾客的团长!

精准的用户画像&#xff0c;能够帮助团长个性化推荐&#xff0c;精细化营销&#xff0c;提升消费粘性&#xff0c;秒提下单率。 数据中心 用户画像 用户画像的核心&#xff0c;是为用户打标签。 将用户的每个具体信息抽象成标签&#xff0c;利用这些标签将用户具体化&#…

Docker数据卷使用手册

目录 目标 前言 概念 官方文档 匿名卷&#xff08;Anonymous Volumes&#xff09; 简介 案例 命名卷&#xff08;Named Volumes&#xff09; 简介 案例 目标 掌握Volume命令通过演示案例&#xff0c;理解数据卷种类与各自的用途。 前言 我们在很多网上教程上可以看到…

位数问题c++

题目描述 在所有的N位数中&#xff0c;有多少个数中有偶数个数字3&#xff0c;由于结果可能很大&#xff0c;你只需要输出这个答案对12345取余的值。 输入 读入一个数N(N≤1000) 输出 输出有多少个数中有偶数个数字3。 样例输入 2 样例输出 73样例解释&#xff1a; 1…

【SpringCloud Alibaba】(八)学习 Sentinel 核心技术与配置规则(下)

目录 1. 热点规则1.1 演示热点规则1.2 演示热点高级选项规则 2. 授权规则2.1 演示授权规则 3. 系统规则3.1 演示系统规则 4. SentinelResource 注解4.1 SentinelResource 注解概述4.2 演示 SentinelResource 注解4.2.1 定义限流和降级后的处理方法4.2.2 在外部类中指定限流和异…

Python酷库之旅-第三方库Pandas(098)

目录 一、用法精讲 421、pandas.DataFrame.infer_objects方法 421-1、语法 421-2、参数 421-3、功能 421-4、返回值 421-5、说明 421-6、用法 421-6-1、数据准备 421-6-2、代码示例 421-6-3、结果输出 422、pandas.DataFrame.copy方法 422-1、语法 422-2、参数 …

sheng的学习笔记-AI-半监督学习

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 基础知识 什么是半监督学习 我们在丰收季节来到瓜田&#xff0c;满地都是西瓜&#xff0c;瓜农抱来三四个瓜说这都是好瓜&#xff0c;然后再指着地里的五六个瓜说这些还不好&#xff0c;还需再生长若干天。基于这些信息&a…

前端面试题-场景设计题

1. 如何使用 css 画一个三角形 借助 border 实现&#xff0c;在 width 和 height 都为 0 时&#xff0c;设置 border&#xff0c;便会呈现三角形。想要哪个方向的三角形&#xff0c;设置其他三边为 透明即可。 同时&#xff0c;可以通过调整不同边的宽度&#xff0c;来调整三角…

巨省成本的电子版招生简章越来越流行,你知道是怎么制作的吗?

随着科技的不断发展&#xff0c;传统的纸质招生简章逐渐被电子版招生简章所取代。电子版招生简章不仅能够节省大量成本&#xff0c;还能够提高宣传效果&#xff0c;因此在市场上越来越流行。你知道它是怎么制作的吗&#xff1f; 1.要制作电子杂志,首先需要选择一款适合自己的软…

Milvus在数派数据大模型业务中的实践

01. 写在前面 云南数派数据科技有限公司是一家总部位于美丽春城昆明的大模型创新企业&#xff0c;在深圳和昆明双城并立&#xff0c;设立了两个研发中心。我们的旗舰产品——SUPIEDT大模型开发平台&#xff0c;作为一款全生命周期的异构算力大模型开发平台&#xff0c;集一站式…

推荐3款好用的电脑动态壁纸软件,资源丰富,图片精美

WinDynamicDesktop WinDynamicDesktop是一款将macOS Mojave的动态桌面功能移植到Windows平台上的开源软件。它允许用户根据时间、地点和天气等条件自动更换壁纸&#xff0c;从而实现类似macOS系统中的动态壁纸效果。 该软件的主要特点包括&#xff1a; 动态壁纸&#xff1a;W…

查找1

一、查找的基本概念 二、线性表的查找 1&#xff09;顺序查找&#xff08;线性查找&#xff09; 2&#xff09;折半查找&#xff08;二分或对分查找&#xff09; 3)&#xff08;分块&#xff09;索引查找

具有宽输入电压范围的75V同步降压控制器LM5145

芯品快报:亚德诺(ADI)汽车音频总线AB收发器AD2428 这周末,除非外面下钞票,否则谁也拦不住我玩《黑神话悟空》(附:两款可以玩转悟空的显卡推荐) LM5145是德州仪器推出的一款具有较宽输入电压的75V同步降压控制器,其输入电压范围可达6V~75V,具有0.8V~60V可调整的输出…

【研发日记】嵌入式处理器技能解锁(五)——TI C2000 DSP的中断系统

文章目录 前言 背景介绍 中断框架 外设中断 ePIE模块 CPU中断 中断嵌套 应用实例 总结 参考资料 前言 见《【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法》 见《【研发日记】嵌入式处理器技能解锁(二)——TI C2000 DSP的SCI(串口)通信》 见…

大数据中台建设整体技术方案(中台设计)word完整版

1. 中台概念 2. 推动企业组织模式演进 3. 建设方法 4 .中台内容 5. 数据安全体系 中台内容围绕数据中台建设评估、整体框架、数据采集&#xff0c;结构化、半结构化、非结构化的数据采集&#xff0c;数据计算能力、存储计算引擎、数据架构、数据挖掘、各种不同数据层建设、模型…

ssrf+redis

curl支持很多协议&#xff0c;有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDA dict被禁用了用&#xff08;?urlhttp://172.19.0.3端口&#xff09;来探测一下端口吧 172.19.0.3主机只开放一个80端口 看看内网还有其他服务器没 这里可以看到内网还有一台172.1…

【Python】给动态图片加水印

文章目录 原文&#xff1a;https://blog.c12th.cn/archives/35.html前言部分代码ini文件CMD 完整代码使用教程(打包整理后文件)注意事项 最后 原文&#xff1a;https://blog.c12th.cn/archives/35.html 前言 之前 图片加水印 是对于静态图片&#xff0c;而现在这个是对动态图片…

一个快速简单的工具来分析SSL/TLS协议数据帧 (C/C++代码实现)

SSL/TLS协议是网络安全通信的基石&#xff0c;它通过在客户端和服务器之间建立一个加密的通道&#xff0c;确保数据传输的安全性和完整性。SSL&#xff08;Secure Sockets Layer&#xff09;最初由Netscape公司开发&#xff0c;而TLS&#xff08;Transport Layer Security&…

Renesa Version Board开发RT-Thread 之UART驱动应用

目录 概述 1 硬件介绍 2 软件配置 2.1 RT-Thread Studio配置参数 2.2 FSP配置MCU 3 RT-Thread中UART的接口介绍 3.1 RT-Thread UART简介 3.2 RT-Thread 下的UART接口 4 UART的应用 4.1 应用功能实现 4.2 源代码文件 5 测试 程序下载地址&#xff1a; RenesaVersio…

Open3D 最小点约束的体素滤波(34)

Open3D 最小点约束的体素滤波(34) 一、算法介绍二、算法流程三、算法代码四、实现效果一、算法介绍 体素滤波可以达到快速减少点云数量的目的,而海量点云往往是需要这一步骤才可以进行后续处理的,比如配准时使用千万级别的原始点云配准显然是不合理的,因此体素滤波是比较重…