技术标签: STM32
MJKDZ PS2手柄控制OskarBot小车(二):硬件连接与通信时序
【目录】
- 1、PS2硬件连接
- 1.1 硬件连接原理图
- 1.2 硬件接口关系对比
- 2、通信协议
- 2.1 PS2通信硬件接口与信号
- 2.2 PS2通信时序
- 2.3 PS2手柄各数据的意义
- 2.4 PS2手柄数据与MJKDZ手柄:传送数据对比
- 3、PS2手柄代码
- 3.1 PS2手柄按键处理主要内容
- 3.2 手柄命令处理函数的主要修改点
【目标】:OskarBot遥控,原来连接的是PS2手柄控制器,遵循PS2手柄协议,为模拟的SPI通信。
现改为MJKDZ的2.4GHz无线串口模块(BK2461),为串口通信。采用串口2接收MJKDZ手柄的数据,加入原PS2手柄的按键处理程序中。
【参考】:
(1)亚博智能 - 实验十四:C51单片机平台--PS2控制智能小车综合实验
https://www.yahboom.com/build.html?id=1095&cid=161
(2)YFRobot - PS2解码通讯及例程V1.8.zip
http://yfrobot.com/thread-11561-1-1.html
采购信息:OskarBot 奥斯卡机器人舵机小车
小车:
https://item.taobao.com/item.htm?spm=a1z09.2.0.0.67002e8dCycmQ8&id=570479397628&_u=qefkhaj6c7e
STM32控制板: https://item.taobao.com/item.htm?spm=2013.1.0.0.7b9274f8qfCjqB&id=565040857054
1、PS2手柄硬件连接
1.1 硬件连接原理图
(1)PS2接收底座与芯片的管脚连接
(2)MJKDZ的无线串口模块与芯片连接(串口2)
1.2 硬件接口关系对比
(1)引脚功能对比
(2)改造方案
方案1、继续沿用PS2接口的模拟SPI通信,找两个端口当做CLK:硬件太复杂,放弃。
方案2、改用串口通信,修改代码,接收MJKDZ手柄传来的数据,移植到原PS2手柄处理的代码上(这些代码比较复杂,可以后期再优化精简)。
选择方案2.
(3)PS2手柄按键对应关系
2、通信协议
2.1 PS2通信硬件接口与信号
DI/DAT:信号流向,从手柄到主机,此信号是一个 8bit 的串行数据,同步传送于时钟的下降沿。信号的读取在时钟由高到低的变化过程中完成。
DO/CMD:信号流向,从主机到手柄,此信号和 DI 相对,信号是一个 8bit 的串行数据,同步传送于时钟的下降沿。
NC:空端口;
GND:电源地;
VDD:接收器工作电源,电源范围 3~5V;
CS/SEL:用于提供手柄触发信号。在通讯期间,处于低电平;
CLK:时钟信号,由主机发出,用于保持数据同步;
NC:空端口;
ACK:从手柄到主机的应答信号。此信号在每个 8bits 数据发送的最后一个周期变低并且 CS 一直保持低电平,如果 CS 信号不变低,约 60 微秒 PS 主机会试另一个外设。在编程时未使用 ACK 端口。
当主机想读手柄数据时,将会拉低 CS 线电平,并发出一个命令“0x01”;
手柄会回复它的 ID“0x41=模拟绿灯,0x73=模拟红灯”;
在手柄发送 ID 的同时,主机将传送 0x42,请求数据;
随后手柄发送出 0x5A,告诉主机“数据来了”。
2.2 PS2通信时序
时钟频率 250KHz(4us),如果接收数据不稳定,可以适当的增加频率。在通讯过程中,
一串数据通讯完成后 CS 才会由低转高,不是 1 个字节通讯完成后就由低转高,在通讯期间,
一直处于低电平。
在时钟下降沿时,完成数据(1bit)的发送与接收,发送和接收是同时完成的。
(1)当单片机想读手柄数据或向手柄发送命令时,将会拉低 CS 线电平,并发出一个命令“0x01”;
(2)手柄会回复它的 ID“0x41=绿灯模式,0x73=红灯模式”;
(3)在手柄发送 ID 的同时,单片机将传送 0x42,请求数据;
(4)随后手柄发送出 0x5A,告诉单片机“数据来了”。
(5)手柄正式发送数据;
(6)一个通讯周期有 9 个字节(8 位),这些数据是依次按位传送。
idle:数据线空闲,该数据线无数据传送。
2.3 PS2手柄各数据的意义
(1)PS2手柄数据格式
当有按键按下,对应位为“0”,其他位为“1”,例如当键“SELECT”被按下时,Data[3]=1111 1110 B。
MODE 灯的意义?
A:因手柄的供应商不同,模式灯有所区别。现有手柄 MODE 灯意义如下:
1、模式灯是“绿灯模式”和“红灯模式”;
2、ID 值没有改变,“0x41=红灯模式,0x73=绿灯模式”;
红灯模式时:左右摇杆发送模拟值,0x00~0xFF 之间,且摇杆按下的键值值 L3、R3 有效;
绿灯模式时:左右摇杆模拟值为无效,推到极限时,对应发送 UP、RIGHT、DOWN、LEFT、△、○、╳、□,按键 L3、R3 无效。
2.4 PS2手柄数据与MJKDZ手柄:传送数据对比
(1)主机发送数据
PS2手柄,需要主机发送请求,手柄才会传输数据。
而MJKDZ手柄,采用串口中断模式,只要按键值有更新,就发送数据。
Q:后期优化代码:MJKDZ手柄,收到发送请求,发送当前按键值。
(2)主机接收到的数据
PS2手柄发送数据固定:当有按键按下,对应位为“0”,其他位为“1”;
MJKDZ手柄发送数据,可自定义,修改后可保持与PS2手柄的数据一致;
Q:后期优化代码:MJKDZ手柄,追加发送数据的情况:
(1)按键值有更新,发送按键值,摇杆模拟量;
(2)按键值不变,摇杆值更新,不会单独发送数据(PS2手柄支持)。->临时替代方案:需要摇杆数据时,先改摇杆,再将R1键按下。后期再优化。
(3)两个按键同时按下,PS2手柄的按键值可正常响应,而MJKDZ手柄会识别成先后两个键按下。->此使用场景,是否有需求?
PS2手柄,单键按下,只有4个数字:7(0111)、B(1011)、D(1101)、E(1110);PS2双键按下,有多种数字组合。
MJKDZ手柄,双键按下,如何读取数值?
注意事项:
1)都是发送8个字节(8位)数据;
2)头2个字节数据不同:PS2手柄为工作模式,数据Ready;MJKDZ手柄为自定义数据校验码1(0x73),校验码2(0x5A)被当做尾校验;
->数据处理,代码中增加首尾字符校验。
3)PS2手柄遍历所有按键(16个),需占用2个字节,才知道哪个按键被按下。按下的键位0,未按下为1。
MJKDZ手柄,一个字节,就知道哪个键被按下,按键代表的数值为自定义0x00~0x0F;
3、PS2手柄代码
3.1 PS2手柄按键处理主要内容
获取按键值,响应储存数据,处理命令
20ms读一次按键值
3.2 手柄命令处理函数的主要修改点
原PS2按键响应函数只需要赋值给下一步消息处理的函数,
现在需要增加判断一帧数据(MJKDZ发的8位数据)接收完毕,赋值给数组psx_buf[8](原来为psx_buf[9])。
数组的顺序与原来不同,但处理消息函数 收到的数据要保持不变 void parse_psx_buf(unsigned char *buf, unsigned char mode)
文章浏览阅读1.1k次。从图的邻接表表示转换成邻接矩阵表示typedef struct ArcNode{ int adjvex;//该弧指向的顶点的位置 struct ArcNode *next;//下一条弧的指针 int weight;//弧的权重} ArcNode;typedef struct{ VertexType data;//顶点信息 ArcNode *firstarc;} VNode,AdList[MAXSIZE];typedef struct{ int vexnum;//顶点数 int _typedef struct arcnode{int adjvex;
文章浏览阅读635次,点赞18次,收藏26次。14、fabric是基于Python实现的SSH命令行工具,简化了SSH的应用程序部署及系统管理任务,它提供了系统基础的操作组件,可以实现本地或远程shell命令,包括命令执行,文件上传,下载及完整执行日志输出等功能。7、pycurl 是一个用C语言写的libcurl Python实现,功能强大,支持的协议有:FTP,HTTP,HTTPS,TELNET等,可以理解为Linux下curl命令功能的Python封装。Scipy是Python的科学计算库,对Numpy的功能进行了扩充,同时也有部分功能是重合的。
文章浏览阅读4.9k次,点赞3次,收藏25次。看网上教程,跟着配置,然后装完anaconda之后,大家都继续安装pycharm,然后傻吊的以为Ubuntu下的anaconda是没有图形化界面的,只有win下面 装完anaconda之后,可以直接在jupyter下面写代码今天突然发现Ubuntu下anaconda也是有图像化界面的$ conda --version /* 查看版本 */$ conda create --name my_en..._ubuntu安装anaconda后怎么运行图形化节目
文章浏览阅读771次,点赞22次,收藏11次。只记得我在一个昏暗潮湿的地方喵喵地哭泣着。——夏目漱石《我是猫》到目前为止,我们看到的神经网络都是前馈型神经网络。(feedforward)是指网络的传播方向是单向的。具体地说,先将输入信号传给下一层(隐藏层),接收到信号的层也同样传给下一层,然后再传给下一层……像这样,信号仅在一个方向上传播。虽然前馈网络结构简单、易于理解,而且可以应用于许多任务中。不过,这种网络存在一个大问题,就是不能很好地处理时间序列数据(以下简称为“时序数据”)。
文章浏览阅读2.5k次。1本地数据传输类似cp的复制,实现文件,目录的增量复制。#语法模式rsync命令 参数 src源文件/目录 dest目标文件/目录1.本地文件复制# 复制hosts文件[root@chaogelinux ~]# rsync /etc/hosts /tmp/2.复制目录内容-r, --recursive 对子目录以递归模式处理# 复制/data下所有内容到/tmp[root@lb01 ~]# rsync -r /data/ /tmp/# 复制/data整个文件夹到/tmp_rsync本地拷贝
文章浏览阅读1.4k次,点赞3次,收藏11次。约瑟夫环问题: 问题描述:设有编号为1,2,3……n的n个人顺时针方向围坐一圈,每人有一密码(正整数)。开始时给出一初始密码m,从编号为1的人开始报数,报m的人出列;以后将出列者的密码作为新的m,从顺时针方向紧挨着他的下一个人开始报数……直至所有人出列。试编算法,求出出列顺序。要求:用不带头结点的单向循环链表实现从键盘输入n,m各人的密码由计算机随机产生(1~10的正整数,也可以自定义_py约瑟夫环问题n,k,m要求由键盘输入值,每个人持有的密码随机生成。 2、每个函数完
文章浏览阅读109次。监听耗时仅代表了 AHAS ARMS Listener(即调用链收集器)在收集并处理当前请求的调用信息时所需要的时间。它不包括网络传输、处理请求、执行操作、处理响应等其他阶段的时间,仅代表 Listener 所需的时间。通常这个时间会很短,只有几毫秒甚至更短。接口实际耗时包括了整个请求/响应周期中的所有时间,包括网络传输、处理请求、执行操作、处理响应等阶段消耗的时间。它代表了该请求在客户端发起到最终服务器响应完成所花费的总时间。_arms调用链路耗时看不懂
文章浏览阅读2.5k次。一、 SQL注入1.原理:SQL注入就是把SQL命令插入到Web表单然后提交到所在页面请求(查询字符串),从而达到欺骗服务器执行恶意的SQL命令。它是利用现在已有的应用程序,将SQL语句插入到数据库中执行,执行一些并非按照设计者意图的SQL语句。2.原因:根据相关技术原理,SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所致;后者主要是由于程序员对输入..._web 应用中常见的漏洞及其危害有哪些
离散数学中的命题逻辑,包括命题的表示和联结词的运用,推理理论和常用的证明方法,如真值表法和直接证明法。还介绍了附加前提证明法或CP规则。
文章浏览阅读8.6k次。Spring Expression Language(SpEL)spring的一种表达式。用来动态的获取,值、对象等。 样式: #{ …} 使用既定的规则放置在花括号中。式中的规则得以运行,可以反馈结果。理论上可以返回任何类型。 说说两种方式去设置SpELAnnotation注解。@Value()方便快捷。 你可以在里面方式任何符合SpEL规范的语句,并把它的返回值注..._spring expression language
文章浏览阅读1.7k次。ansible最大并发 Ansible是一种功能强大的无代理(但易于使用且轻巧)的自动化工具,自2012年推出以来一直稳步流行。这种流行在一定程度上是由于其简单性。 默认情况下,Ansible的最基本依赖项(Python和SSH)几乎在所有地方都可用,这使得Ansible可以轻松用于各种系统:服务器,工作站,Raspberry Pi,工业控制器,Linux容器,网络设备等。 Ansible可..._ansible 提升 高并发
文章浏览阅读479次。应我的客户要求,需要找到一款可以在极短时间识别二维条码的软件以应对他们现在极其迅速的货品入库需求。正好听说过一款Dynamsoft Barcode Reader的开发包,根据其官网介绍最新版对条码检测速度比以前的版本快2倍以上。根据对Dynamsoft Barcode Reader8.8SDK包拆解,其中含了JavaScript Package /.NET Package /C/C++ Package /Python Package /Java Package /iOS Package /A..._barcode reader