一、 设计目的
本次项目设计旨在通过综合使用三轴加速度传感器、数码管、蜂鸣器、导航键、按键、振动传感器等元件,基于上位机与下位机之间的通信和数据交互,利用下位机完成对上位机游戏——贪吃蛇的多种方式控制,并在此基础上,可对多种上位机软件进行拓展操作。
在项目整体的设计过程中熟悉“EP1C3学习板”的相关知识,学习三轴加速度、振动传感器以及导航按键的工作原理,依据具体需求进行详细设计,并了解通信协议,在上位机的设计过程中学习串口通信的相关知识。
二、 预期功能及创新
1. 预期功能:
- ① 使用数码管、蜂鸣器等模块进行信息展示,如连接状态显示及提示、当前速度显示、方向指示等;
- ② 利用三轴加速度传感器、振动传感器、导航键等对上位机——贪吃蛇游戏进行控制操作。
2. 创新: - ① 实现下位机与上位机的相互通信及数据交互;
- ② 利用三轴加速度模拟方向控制,实现具体操作。
三、 设计流程
具体原理部分请见下载报告:https://download.youkuaiyun.com/download/forest_one/12248816
五、 实现及关键代码
1. 上位机
上位机原型为贪吃蛇游戏,通过 Java 语言进行设计,其中包含了 Snake、Controller、BottonPanel 等多个类。(项目文件标题处给出了下载地址)
在贪吃蛇游戏的基础上,添加串口通信模块(如下图), 使得上位机与下位机实现相互通信,并在上位机设置串口监听,根据下位机发送的指令完成相应操作。
下位机通信
变量定义
程序函数
关键代码
ucDateTmp 用来存储从上位机发送到下位机的数据,在一定条件下,使用 SendData发送控制指令到上位机。
2. 三轴加速度传感器
2.1 引脚定义
2.2 变量定义
2.3 程序函数
2.4 关键代码
通过Multiple_Read_ADXL345()读出数据并使用display_angle()完成角度的转换,在进行判断时我们需要设定一定的触发区间(X、Y 轴< -40°或 >40°),当角度处于触发区间时,下位机会通过串口通信发送指令到上位机实现方向控制。
3. 导航按键
3.1 变量定义
3.2 程序函数
3.3 关键代码
通过 GetADC()函数查询 A/D 转换的结果,通过转换结果的不同判断导航键哪个方向键被按下,并发送相应指令到上位机,由上位机做出响应,实现控制。
4. 振动传感器
4.1 变量定义
4.2 关键代码
振动传感器的端口为 P3^4,通过对其端口的监控,判断振动传感器的状态,由于存在抖动现象,需要进行延时操作以防止避免多次发送重复指令。
5. 数码管
5.1 引脚定义
5.2 变量定义
5.3 程序函数
5.4 关键代码
在一定条件下,利用 switch 语句进行循环动态扫描点亮数码管的相应位置,进行不同信息的展示。
6. 蜂鸣器
6.1 变量定义
6.2 关键代码
无源蜂鸣器的端口为 P3^4,通过对其端口的操作,高低电平改变频率决定音调,高电平占空比决定音量,实现无源蜂鸣器的发声。
7. 按键
7.1 引脚定义
7.2 变量定义
7.3 关键代码
为了消除按键的抖动,采用计数器的方法,进行消抖处理,且每完成一次操作,对计数变量进行初始化以达到每次操作的消抖。
六、 操作说明
具体操作流程图如下 :
操作说明
该项目下位机存在 4 种状态切换,具体如下:
- ① 下载烧写程序。
- ② 完成下载后,下位机 LED 数码管显示“hold . . . .”。此时,下位机处于待机状态,还未进行与上位机的连接操作,导航键及其他控制键操作无效。
- ③ 打开上位机串口设置——打开串口,下位机 LED 数码管显示“CHOOSE . .”。当前页面要进行控制功能选择,按下 K1 键选定导航键方向控制,按下 K2 键选定三轴加速度传感方向控制。
- ④ 下位机 LED 数码管显示“SPEED8-1”。LED 数码管对速度、方向等信息进行展示,第 6 位显示速度值,第 8 位显示方向。
七、 测试验证
- ① 下载烧写程序。
- ② 完成下载后,下位机 LED 数码管显示“hold . . . .”。
- ③ 打开上位机串口设置——打开串口,下位机 LED 数码管显示“CHOOSE . .”。按下K1 键选定导航键方向控制,按下 K2 键选定三轴加速度传感方向控制。
- ④ 下位机 LED 数码管显示“SPEED8-1”。LED 数码管对速度、方向等信息进行展示,第 6 位显示速度值,第 8 位显示方向。
- ⑤ 上位机操作页面——实现下位机对上位机进行控制