Skip to content

Latest commit

 

History

History
199 lines (73 loc) · 6.49 KB

README.md

File metadata and controls

199 lines (73 loc) · 6.49 KB

基于颜色传感器的体感游戏

一、实验内容

通过颜色传感器的感知颜色控制板子移动以便接住小球(如:黑色向左移动,白色向右移动)可通过对于颜色摆放位置实现体感游戏。

注意事项:此游戏应在光线明亮的环境下进行。

使用说明:下板后应先将颜色传感器倒置于一张白纸上以便进行白平衡。如下图所示

clip_image004

白平衡后,vga开始显示画面,按下FPGA板上的N17按钮即可开始游戏。开始游戏后,通过颜色传感器对颜色的感知来控制板子的移动(白色向左,黑色向右)。若没有接住小球,则游戏失败,失败后则返回初始状态,按N17按钮重新开始。

游戏过程中,按N17按钮可以暂停游戏。

二、 数字系统模块

白平衡子系统

颜色传感器在使用之前必须要先经过白平衡才能使用。所谓白平衡,就是要告诉传感器什么是白色。从理论上讲,白色是由等量的红色、绿色和蓝色混合而成的;但实际上,白色中的三原色并不完全相等,并且对于 TCS3200 的光传感器来说,它对这三种基本色的敏感性是不相同的,导致 TCS3200 的 RGB 输出并不相等,因此在测试前必须进行白平衡调整,使得 TCS3200 对所检测的“白色”中的三原色是相等的。

我在实现此系统的时候采用的是定数计时的方法,即依次选通三种颜色的滤波器,然后对 TCS230的输出脉冲依次进行计数。当计数到255 时停止计数,分别计算每个通道所用的时间。这些时间对应于实际测试时TCS230 每种滤波器所采用的时间基准,在这段时间内所测得的脉冲数就是所对应的R 、G 和B 的值。

测得RGB对应的基准时间后,便将此基准时间传递给颜色识别模块并且给它一个ready信号,表示可以开始识别颜色了,并且不再进行白平衡。

颜色识别别子系统

​ 在收到白平衡模块的信号后,颜色识别模块开始工作。RGB的滤波器分别开启对应的基准时间长,然后记录此段时间中测得的脉冲的个数,由此便得到了该颜色的RGB值。

游戏逻辑子系统

​ 此模块负责小球的移动和板子位置的变化以及砖块的消除。通过输入的颜色信号判断板子向左还是向右,或者是不动。若是要移动便将板子对应的位置参数加或者减。对于小球来说,其移动不受颜色控制,每个时钟上升沿通过其水平和竖直速度改变其位置即可,同时如果碰到墙壁或板子会让速度方向反向。同时如果检测到小球碰到砖块则砖块会消失。最后该系统会将小球和板子的位置信号以及砖块的存在条件传给VGA显示系统。

VGA****显示子系统

显示器扫描方式分为逐行扫描和隔行扫描:逐行扫描是扫描从屏幕左上角 一点开始,从左像右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一 行的起始位置,在这期间,CRT 对电子束进行消隐,每行结束时,用行同步 信号进行同步;当扫描完所有的行,形成一帧,用场同步信号进行场同步, 并使扫描回到屏幕左上方,同时进行场消隐,开始下一帧。隔行扫描是指电 子束扫描时每隔一行扫一线,完成一屏后在返回来扫描剩下的线。

行场消隐信号:是针对老式显像管的成像扫描电路而言的。电子枪所发出 的电子束从屏幕的左上角开始向右扫描,一行扫完需将电子束从右边移回到 左边以便扫描第二行。在移动期间就必须有一个信号加到电路上,使得电子 束不能发出。不然这个回扫线会破坏屏幕图像的。这个阻止回扫线产生的信 号就叫作消隐信号,场信号的消隐也是一个道理。

此模块负责根据游戏逻辑传给它的位置等信息在VGA上显示游戏中需要的各个物体。

clip_image009

三、 子系统模块建模

白平衡模块

module white_balance(

input clk,

input frequncy,

output reg[63:0]R_time,

output reg[63:0]G_time,

output reg[63:0]B_time,

output ready,

output reg [1:0] filter_select

);

接口信号从上到下依次为

时钟,传感器传回的频率,红色,绿色,蓝色滤波器基准时间,白平衡完成信号,滤波器选通信号。

颜色识别模块

module identify_color(

input ready,

input clk,

input frequncy,

input [63:0] r_time,

input [63:0] g_time,

input [63:0] b_time,

output reg [9:0] red,

output reg [9:0] green,

output reg [9:0] blue,

output reg [1:0] filter_select

​ );

接口信号从上到下依次为

白平衡结束信号,时钟,传感器传回的频率,红色,绿色,蓝色滤波器基准时间,RGB值,滤波器选通信号。

VGA****及游戏逻辑模块

module VGA_display(

​ input clk,

​ input pause,

​ input to_left,

​ input to_right,

​ input [3:0] bar_move_speed,

​ output reg hs,

​ output reg vs,

​ output reg [2:0] Red,

​ output reg [2:0] Green,

​ output reg [1:0] Blue,

​ output reg lose

​ );

接口信号从上到下依次为

时钟,暂停信号,板子左移信号,板子右移信号,游戏速度,VGA行同步信号,

VGA场同步信号,VGA颜色信号,游戏失败信号。

功能框图: 生成水平计数器和竖直计数器,每个时钟脉冲水平计数器加一,当计数到VGA宽度限制后,归零且竖直计数器加一,高度达到限制后竖直计数器也归零 通过水平和竖直计数器产生HS与VS信号。 在对应小球,板子,方块位置输出对应颜色,达到画图的目的给小球,板子位置设置初始值,并给小球赋初始速度。 小球根据速度,每个周期位置变化,若碰到墙壁或板子,则水平或竖直速度反向,若小球位置低于板子,则游戏结束,重新开始,若小球碰到方块速度反向并消除方块 将位置等数据传给上面的模块

四、 效果

clip_image025

clip_image027