山东大学 课程设计报告 · 2019. 9. 19. · 1 山东大学 课程设计报告...

14
1 山东大学 课程设计报告 设计题目: 基于 Arduino 并通过陀螺仪控制的贪吃蛇游戏 姓名:邱童 毛子旗 刘思凯 年级:2013 2015 6 2

Transcript of 山东大学 课程设计报告 · 2019. 9. 19. · 1 山东大学 课程设计报告...

Page 1: 山东大学 课程设计报告 · 2019. 9. 19. · 1 山东大学 课程设计报告 设计题目: 基于Arduino并通过陀螺仪控制的贪吃蛇游戏 姓名:邱童 毛子旗

1

山东大学

课程设计报告

设计题目:

基于 Arduino 并通过陀螺仪控制的贪吃蛇游戏

姓名:邱童 毛子旗 刘思凯

年级:2013

2015 年 6 月 2 日

Page 2: 山东大学 课程设计报告 · 2019. 9. 19. · 1 山东大学 课程设计报告 设计题目: 基于Arduino并通过陀螺仪控制的贪吃蛇游戏 姓名:邱童 毛子旗

2

目录

摘要 ................................................................................................................................................... 3

ABSTRACT ........................................................................................................................................... 3

设计概况 ........................................................................................................................................... 4

一、设计目的 ...................................................................................................................................... 4

二、设计用途、功能 .......................................................................................................................... 4

硬件设计 ........................................................................................................................................... 5

一、所需硬件 ...................................................................................................................................... 5

二、硬件原理 ...................................................................................................................................... 5

三、硬件使用方法 .............................................................................................................................. 6

(1)陀螺仪模块使用方法 ............................................................................................................ 6

(2)0.96 寸 OLED 模块使用方法 ................................................................................................. 7

软件设计 ........................................................................................................................................... 7

一、软件功能 ...................................................................................................................................... 7

二、软件流程图 .................................................................................................................................. 8

三、软件各函数功能(代码见附录) .............................................................................................. 9

(1)UI() ........................................................................................................................................ 9

(2)printScore(int x, int y, int s) .................................................................................. 9

(3)key() ...................................................................................................................................... 9

(4)snakeGame() .......................................................................................................................... 9

(5)setup() .................................................................................................................................. 9

(6)loop() .................................................................................................................................... 9

系统测试过程及测试数据 ............................................................................................................... 10

一、陀螺仪敏感度测试 .................................................................................................................... 10

二、陀螺仪复位过程所需时间测试 ................................................................................................ 10

参数指标 ......................................................................................................................................... 10

参考资料 ......................................................................................................................................... 10

附:代码 ......................................................................................................................................... 11

Page 3: 山东大学 课程设计报告 · 2019. 9. 19. · 1 山东大学 课程设计报告 设计题目: 基于Arduino并通过陀螺仪控制的贪吃蛇游戏 姓名:邱童 毛子旗

3

摘要

Arduino 由一块单板的微控制器和一套开发软件组成。相比其他开发平台,

Arduino的优越性在于其易用性。本设计是一个基于 Arduino Uno 平台的简易贪

吃蛇游戏。本品创新型地改变了传统贪吃蛇游戏的操作方法,该系统通过陀螺仪

传感器测量角速度实现对游戏的控制,并使用 OLED 屏幕显示游戏,极大地增强

了贪吃蛇游戏的可玩性。

关键词:Arduino 贪吃蛇游戏 陀螺仪传感器

Abstract

Arduino is made up of a development kit and a software system. Compared

with other development kits, Arduino has its great accessibility. This

design is a snack game which is based on Arduino Uno. By using gyroscope

to measure angular acceleration which is used to control the snack, we

changed the traditional snack game and enhanced its playability.

Key words:Arduino; Snack game; Gyroscope

Page 4: 山东大学 课程设计报告 · 2019. 9. 19. · 1 山东大学 课程设计报告 设计题目: 基于Arduino并通过陀螺仪控制的贪吃蛇游戏 姓名:邱童 毛子旗

4

设计概况

一、设计目的

1、当今市面的 Xbox、 PlayStation等主流游戏机中,很少应用陀螺仪技术。我

们创新性地将陀螺仪应用到贪吃蛇游戏中,极大的提高了游戏的可玩性与趣味性。

2、通过课程设计,了解、掌握单片机的基本原理与使用方法。学习用单片机设

计产品的步骤与方法,提高创新思维,动手能力与团队合作意识。

二、设计用途、功能

本品通过含有陀螺仪传感器游戏手柄,检测用户倾斜手柄的方向,从而控制贪吃

蛇游戏中蛇的行进方向。实物图如下。

Page 5: 山东大学 课程设计报告 · 2019. 9. 19. · 1 山东大学 课程设计报告 设计题目: 基于Arduino并通过陀螺仪控制的贪吃蛇游戏 姓名:邱童 毛子旗

5

硬件设计

一、所需硬件

Arduino Uno开发板、电线若干、面包板、MPU6050陀螺仪、0.96 寸 OLED

二、硬件原理

本设计使用集成陀螺仪与 OLED 模块,硬件设计较为简单。具体原理图如下。

Page 6: 山东大学 课程设计报告 · 2019. 9. 19. · 1 山东大学 课程设计报告 设计题目: 基于Arduino并通过陀螺仪控制的贪吃蛇游戏 姓名:邱童 毛子旗

6

三、硬件使用方法

(1)陀螺仪模块使用方法

MPU6050 整合了 3 轴陀螺仪、3 轴加速器,以数字信号实现输出,使用 3.3V

电压供电。本设计使用 IIC通信,只需使用 MPU6050的 SDA口和 SCL口。我们将

MPU6050焊接在一小块塑料板上,制成简易游戏手柄,获取控制贪吃蛇所需的 X,

Y轴角速度。硬件原理图如下。

使用 MPU6050 专用头文件"MPU6050.h"可大大简化软件设计流程,设计中所用到

的库函数及其用途如下。

Page 7: 山东大学 课程设计报告 · 2019. 9. 19. · 1 山东大学 课程设计报告 设计题目: 基于Arduino并通过陀螺仪控制的贪吃蛇游戏 姓名:邱童 毛子旗

7

accelgyro.initialize( ) 初始化陀螺仪

accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz) 获取 MPU6050测量的数据,并分别存储

到变量 ax、ay、az、gx、gy、gz中(本品只需要使用 x轴角加速度 gx和 y轴角速度 gy)

(2)0.96 寸 OLED模块使用方法

OLED模块接线方法如下(略去底线与电源) Arduino OLED

D9 MOSI

D10 SCK

D11 A0

D12 CS

D13 RES

引入库 u8glib 在屏幕上绘制图形,简化软件设计流程,使用到的库函数功能如下。

U8GLIB_SSD1306_128X64 u8g( ) 定义引脚

u8g.drawBitmapP( ) 显示位图

u8g.drawFrame( ) 绘制矩形

u8g.setFont( ) 设置字体

u8g.drawStr( ) 显示字符

u8g.setPrintPos( ) 设置字符位置

u8g.print( ) 显示字符

u8g.firstPage( ) 开始图像循环

u8g.nextPage( ) 结束图像循环

软件设计

一、软件功能

1、显示贪吃蛇游戏:蛇身碰到食物增长一节,碰到边框在对面边框出现。

2、计算成绩并显示。

3、检测并处理陀螺仪传回的数据,并依此改变蛇的方向。

Page 8: 山东大学 课程设计报告 · 2019. 9. 19. · 1 山东大学 课程设计报告 设计题目: 基于Arduino并通过陀螺仪控制的贪吃蛇游戏 姓名:邱童 毛子旗

8

二、软件流程图

Page 9: 山东大学 课程设计报告 · 2019. 9. 19. · 1 山东大学 课程设计报告 设计题目: 基于Arduino并通过陀螺仪控制的贪吃蛇游戏 姓名:邱童 毛子旗

9

三、软件各函数功能(代码见附录)

(1)UI()

此函数用于绘制游戏界面。通过调用两次 drawFrame 函数绘制双层矩形边界,用 setFont 与

drawStr 函数设置文字字体并显示”LEVEL“、“SCORE”。

(2)printScore(int x, int y, int s)

调用 setFont 设置字体,调用 setPrintPos 设置坐标(x,y),显示 s。

(3)key()

此函数用于获取并处理陀螺仪数据。用 getMotion6 函数获取数据,使用 if语句

对陀螺仪传回角速度数值进行处理,当其达到角速度一定程度即可判定用户倾斜

方向。考虑到用户倾斜陀螺仪后的复位过程也会产生角速度,程序通过调用

millis 函数进行逻辑运算,以忽略此过程。判断用户操作后,将倾斜方向传递

给 snake.dir。

(4)snakeGame()

本函数首先根据 key()传回的数据改变蛇头坐标,如果蛇头碰到边框,即使其出

现在碰到边框的对面。为实现蛇的移动,首先确定一个蛇头的坐标,蛇头每移动

一次,蛇头后的每一节为前一节的旧坐标。如果碰到食物,蛇身长度变量加 1,

并改变成绩与级别变量。

(5)setup()

Arduino编译器自带初始化函数,在本程序中用来初始化陀螺仪。

(6)loop()

Arduino编译器自带循环函数,在本程序中用了向显示器输出信号并包含上述自

定义函数。

Page 10: 山东大学 课程设计报告 · 2019. 9. 19. · 1 山东大学 课程设计报告 设计题目: 基于Arduino并通过陀螺仪控制的贪吃蛇游戏 姓名:邱童 毛子旗

10

系统测试过程及测试数据

一、陀螺仪敏感度测试

用户在握持手柄时难免发生抖动,通过对组员握持及倾斜习惯测试,我们确定当

gx/131>150时移动方向向右,gx/131<-150 时移动方向向左,gy/131>20 时移动

方向向上,gy/131<-20时移动方向向下。(gx和 gy为陀螺仪传回的原始数据)

二、陀螺仪复位过程所需时间测试

用户在倾斜陀螺仪后需要将其复位到原始位置,由于陀螺仪只能检测角加速度,

复位过程会干扰游戏。经过测试,我们认为如果忽略掉倾斜后 1 秒时间的数据,

既可以解决该问题,又不会影响下一次操作。

参数指标

系统可使用电脑 usb 电压供电,1秒内可检测 1次用户操作。

参考资料

[1]《MPU-6000 and MPU-6050 Product Specification Revision 3.1》

InvenSense公司

[2]《Arduino 从基础到实践》 Michael McRoberts

[3]《Arduino+OLED 简易贪吃蛇教程》 论坛极客工坊

Page 11: 山东大学 课程设计报告 · 2019. 9. 19. · 1 山东大学 课程设计报告 设计题目: 基于Arduino并通过陀螺仪控制的贪吃蛇游戏 姓名:邱童 毛子旗

11

附:代码

#include "U8glib.h"

#include "Wire.h"

#include "I2Cdev.h"

#include "MPU6050.h"

MPU6050 accelgyro;

int16_t ax, ay, az;

int16_t gx, gy, gz;

#define RIGHT 0

#define UP 1

#define LEFT 2

#define DOWN 3

unsigned long currenttime=millis();

/*

SW SPI COM:

SCK = 10, MOSI = 9 , CS = 12, A0 = 11, RES = 13

*/

U8GLIB_SSD1306_128X64 u8g(10, 9, 12, 11, 13);

int score = 0;

int level = 1;

int gamespeed = 100;

int i;

//组成单位,4X4 像素点的方块。

const uint8_t ele[] PROGMEM = {

0xf0, //B1111000

0xb0, //B1011000

0xd0, //B1101000

0xf0, //B1111000

};

//蛇

void element(int x, int y) {

u8g.drawBitmapP(x,y, 1,4, ele);

}

struct FOOD {

int x;

int y;

int yes;

Page 12: 山东大学 课程设计报告 · 2019. 9. 19. · 1 山东大学 课程设计报告 设计题目: 基于Arduino并通过陀螺仪控制的贪吃蛇游戏 姓名:邱童 毛子旗

12

};

FOOD food = {25, 30, 1};

struct SNAKE {

int x[200];

int y[200];

int node;

int dir;

int lefe;

};

SNAKE snake = {{9,5}, {30,30}, 2, RIGHT, 0};

//游戏基本界面

void UI() {

u8g.drawFrame(0,1, 102,62); //内边界

u8g.drawFrame(0,0, 102,64); //外边界

u8g.setFont(u8g_font_5x7); //设置字体

u8g.drawStr(104,12, "LEVEL"); //等级提示

u8g.drawStr(104,40, "SCORE"); //分数提示

}

void printScore(int x, int y, int s) {

u8g.setFont(u8g_font_6x10);

u8g.setPrintPos(x, y);

u8g.print(s);

}

void key() {

accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

if(gx/131>150&&millis()-currenttime>1000)

{

snake.dir =RIGHT;

currenttime=millis();

}

if(gx/131<-150&&millis()-currenttime>1000)

{

snake.dir = LEFT;

currenttime=millis();

}

if(gy/131>20&&millis()-currenttime>1000)

{

Page 13: 山东大学 课程设计报告 · 2019. 9. 19. · 1 山东大学 课程设计报告 设计题目: 基于Arduino并通过陀螺仪控制的贪吃蛇游戏 姓名:邱童 毛子旗

13

snake.dir =UP;

currenttime=millis();

}

if(gy/131<-20&&millis()-currenttime>1000)

{

snake.dir = DOWN;

currenttime=millis();

}

}

void snakeGame() {

switch(snake.dir) {

case RIGHT:

snake.x[0] += 4;

if(snake.x[0]>=101) {

snake.x[0] = 1;

} break;

case UP:

snake.y[0] -= 4;

if(snake.y[0]<=1) {

snake.y[0] = 58;

} break;

case LEFT:

snake.x[0] -= 4;

if(snake.x[0]<=0) {

snake.x[0] = 97;

} break;

case DOWN:

snake.y[0] += 4;

if(snake.y[0]>=62) {

snake.y[0] = 2;

} break;

}

if((snake.x[0] == food.x) && (snake.y[0] == food.y)) {

snake.x[0] = food.x;

snake.y[0] = food.y;

snake.node++;

food.yes = 1;

score += 2;

Page 14: 山东大学 课程设计报告 · 2019. 9. 19. · 1 山东大学 课程设计报告 设计题目: 基于Arduino并通过陀螺仪控制的贪吃蛇游戏 姓名:邱童 毛子旗

14

level = score/10+1;

}

for(i=snake.node-1;i>0;i--) {

snake.x[i] = snake.x[i-1];

snake.y[i] = snake.y[i-1];

}

}

void setup() {

accelgyro.initialize();

}

void loop() {

u8g.firstPage();

do {

UI();

for(i=0; i<snake.node;i++) {

element(snake.x[i], snake.y[i]);

}

element(food.x, food.y);

printScore(103, 62, food.x);

printScore(116, 62, food.y);

printScore(109, 22, level);

printScore(109, 50, score);

}while(u8g.nextPage());

key();

snakeGame();

delay(gamespeed);

}