激光枪自动射击报靶装置.docx

上传人:b****8 文档编号:10285096 上传时间:2023-02-09 格式:DOCX 页数:62 大小:160.47KB
下载 相关 举报
激光枪自动射击报靶装置.docx_第1页
第1页 / 共62页
激光枪自动射击报靶装置.docx_第2页
第2页 / 共62页
激光枪自动射击报靶装置.docx_第3页
第3页 / 共62页
激光枪自动射击报靶装置.docx_第4页
第4页 / 共62页
激光枪自动射击报靶装置.docx_第5页
第5页 / 共62页
点击查看更多>>
下载资源
资源描述

激光枪自动射击报靶装置.docx

《激光枪自动射击报靶装置.docx》由会员分享,可在线阅读,更多相关《激光枪自动射击报靶装置.docx(62页珍藏版)》请在冰豆网上搜索。

激光枪自动射击报靶装置.docx

激光枪自动射击报靶装置

[1]沈建华等著,MSP430系列16位超低功耗单片机原理与实践[M],北京:

北京航空航社,2010

[2]华成英,童诗白著,模拟电子技术[M],北京:

高等教育出版社,2006年

[3]阎石著,数字电子技术基础[M],北京:

高等教育出版社,1997年

[4]沈建华等.MSP430系列16位超低功耗单片机实践.清华大学出版社,2005.4

[5]刘刚,彭荣群著.ProtelDXP2004SP2原理图与PCB设计[M].北京:

电子工业出版社2007

[6]鹿玉红,戴彦,江培蕾.基于PROTEUS的DS18B20数字温度计的仿真实现[J].福建电脑,2010,

(1):

117-118.

2012年TI杯四川省电子设计竞赛

激光枪自动射击报靶装置(E题)

【本科组】

 

 

时间:

8.5-8.7

编号:

XS-13-本-E

 

摘要:

本设计采用MSP430F169单片机和MSP430G2553单片机作为控制核心,系统主要包括电源模块、步进电机驱动模块、摄像头采集模块、激光发射模块、LCD12864报靶装置和按键控制模块显示装置电路。

主要控制整个系统实现了按键控制及自动定位打靶,从任意位置迅速击中靶心,并使用摄像头采集打靶数据,通过单片机以处理后,用LCD12864显示打靶环数,图像和方位。

通过实验表明:

该系统达到了设计的各项要求。

关键词:

MSP430F169单片机;MSP430G2553单片机;步进电机电机;OV6620FIFO摄像头;激光头;独立按键键盘;LCD12864

1.系统方案设计,比较与论证

根据题目基本要求,设计任务完成按键控制打靶,自动定位打靶,摄像头对打靶情况采集,并用单片机处理后,在LCD12864液晶显示屏上显示打靶结果。

为完成相应功能,,系统由MSP430G2553单片机,电源模块,电机驱动模块,激光头打靶模块,摄像头模块及LCD12864显示模块构成,系统方案如图1所示

 

 

图1系统框图

1.1控制模块方案论证

方案一:

采用TI公司的msp430f169,msp430g2553单片机作为控制器。

相对于本设计题目设计来说,由于采集和打靶硬件问题,我们需要用到两个单片机。

msp430f169单片机工作频率高,功耗低,I/O口多,性价比高,相对于本设计题目来说,需要较多IO口,及优越的Flash,m430g2553单片机,使用超低功耗,符合题目设计要求。

方案二:

采用TI公司的AT89S52单片机,但51单片机处理速度慢,功耗相对较高,且不符合题目要求。

通过上述描述表明,方案一优于方案二,我们选择第一种方案。

1.2电源模块的方案论证

方案一:

双电源供电。

电动机驱动电源采用12V稳压电池,单片机及其外围电路电源采用5V钮扣电池供电,两路电源完全分开,这样做可以将电动机驱动所造成的干扰彻底消除,提高了系统稳定性。

但是造成了电池资源的浪费,使花费增大。

方案二:

所有器件采用单一电源(12V)供电,通过7812稳压输出提供给需要12V的地方,通过2596稳压输出提供给需要5V的地方,通过LM1117输出3.3V电压给无线模块。

这样供电简单方便,而且使电池充分的应用,节约了资源。

我们认为本设计的性价比和方便性更为重要,故拟采用方案二。

1.3电机驱动模块。

方案一:

中功率三级管直接搭建

在电机驱动要求不高的地方可以由三极管直接搭建一个驱动电路,使用三级关搭建的电机驱动电路电路简单,但功率和性能一般。

对输入信号要求较高,输出性能只能满足一般要求。

方案二:

使用专用电机驱动芯片ULN2003

ULN2003的驱动能力强,输入电压可变化范围大,是一块专用直流电机驱动芯片。

其各项性能都较好,且价格便宜,体积小,性能优越。

综上考虑,两个步进电机使用方案二。

1.4数据采集电路的论证与选择

方案一:

摄像头采集图像信号进行图像分析

由摄像头采集图像信号,通过采集到的图像信号进行图像分析,然后计算出击中光点所在位该方案具有信息精确度高、抗干扰性强等优点。

方案二:

使用光敏电阻对击中区检测

由光敏电阻加上一些辅助电路实现击中光斑的识别。

由于靶场由白底和黑色的引导线组成,光敏元件可以在黑色和白色区发光区域识别,检测到光,电阻值变小。

该方案具有电路简单,成本低廉,但干扰较大,信息精度低。

通过比较,本设计采用方案一。

1.5报靶电路模块的论证与选择

方案一:

采用语音方式报靶

通过喇叭及一些辅助电路通过单片机控制,根据摄像头采集,控制芯片处理得出的数据,用喇叭方式进行语音报靶,但这种方式硬件制作相对复杂。

方案二:

使用LCD12864显示报靶

由单片机控制LCD12864,根据采集处理到的数据,在12864上画图显示,并报靶,该方案具有电路简单,成本相对语音方式低廉,且显示结果精准。

通过比较,本设计采用方案二。

1.6按键控制模块的论证与选择

方案一:

采用独立按键控制激光笔的转动,以实现准确打靶。

独立按键,使用方便,且电路简单。

方案二:

采用矩阵键盘控制,但根据实际需要,矩阵相对资源浪费,且编程相对复杂。

综上比较,我们选择方案一。

2.理论分析与计算

2.1定位打靶及控制分析

2.1.1按键控制打靶

使用一个独立按键键盘,控制两个步进电机的转动,以第一个电机实现激光笔的上下,第二个电机实现左右移动,通过激光笔的转动,实现打靶位置的移动,最终实现按键控制打靶,同时分配一个独立按键,实现模式切换,实现自动定位打靶。

2.1.2自动定位打靶

通过按键先控制,确定任意打靶位置,并进行定位,实现15秒内瞄准击中靶心。

2.1.3摄像头的数据采集

使用OV6620FIFO摄像头对打靶情况进行数据采集,并将采集所得数据存入fifoAL422B,再从fifo传送给msp430g2553单片机进行处理,其中,OV6620可以每秒采集25帧,一帧两场,那么每秒就有50场,意味着20MS就有一幅图像产生。

356x292pixels,理解为:

有292行,一行有356个点,但根据实际情况,我们只采集一帧。

并采用二值化方式,是输出图像为黑白灰度形式,根据采集的图像灰度来进数据分析,用于在单片机上处理,以确定任意打靶坐标和正确显示打靶结果。

2.1.4打靶结果显示

采集数据通过单片机MSP430F169处理后,用LCD12864对结果进行显示。

主要显示打靶画面,以及弹着点的环数与方位信息。

2.1.5节能分析

使用低功耗的msp430f169和超低功耗的msp430g2553控制芯片,并使用28BYJ步进电机,功耗相对低,精度高,最大限度的节约能源,降低功耗。

3.电路与程序设计

3.1硬件电路设计

3.1.1电源

由于控制芯片小系统,显示电路,步进电机运转驱动激光笔打靶,摄像头各模块需要的电压不同,为了实现单电池供电,我们将7812、2596和LM1117做到一个板子上,实现了12V电压、5V和3V电压实现输出功能。

具体电路如图2:

图2电源电路

3.1.2驱动电路

驱动电路包括一片ULN2003芯片,该驱动芯片带负载能力强,温度范围宽,起保护作用,避免电流过大而损坏驱动芯片,具体电路如图3所示。

图3驱动电路

3.1.3摄像模块电路

摄像模块电路由AL422B和ov6620组成,AL422B输入端与摄像头0v6620相连,输出端与单片机相连,具体电路如图4所示。

图4摄像头模块电路

3.1.4报靶显示模块电路

报靶部分使用LCD12864显示,主要显示摄像头采集到的打靶图像,打中环数及其打中区域,具体电路如图5所示。

图5LCD12864报靶显示模块电路

3.2软件设计

3.2.1主程序流程图

图6主程序流程图

 

3.2.2摄像头采集处理显示程序流程图

图7摄像头模块流程图

 

3.2.3打靶模块程序流程图

图8打靶程序流程图

 

4系统测试

4.1测试方法

自制胸环靶,靶心直径10cm,各靶环间距5cm,共六环,由激光笔代替激光枪,实现打靶。

打靶方式包括:

按键控制打靶,自动打靶,摄像头按坐标自动打靶。

打靶内容包括打靶环数,打靶方位,如中心、正上、正下、正左、正右、左上、左下、右上、右下以及在15秒内将激光束光斑从胸环靶上的指定位置迅速瞄准并击中靶心(即10环区域),并检测打靶是否正确,及偏移量,由12864显示打靶结果。

4.2测试结果与分析

4.2.1按键控制打靶测试,测试数据如下:

次数

设定环数

实际环数

1

10

10

2

9

9

3

8

8

4.2.2摄像头识别打靶,测试数据如下:

次数

设定环数

设定方向

实际环数

实际方向

1

7

右上

7

右上

2

8

左上

8

正左

3

9

正下

9

正下

4.2.3液晶显示打靶环数及弹着点,测试结果如下:

次数

设定打靶环数

设定方位

显示是否正确

1

8

左上

2

9

正右

3

7

右下

 

4.2.4从任意位置击中靶心测试,测试结果如下:

次数

指定环数

方位

是否击中靶心

1

7

左上

2

8

右下

3

9

正上

分析:

大部分打靶,及显示都正常执行,但部分摄像头识别打靶有不精准情况,由于摄像头采集及一些硬件的不稳定,形成一定误差。

5结束语

经过三天的辛勤努力,我们基本上实现了题目的要求,在编程和调试的过程中,我们遇到很多问题。

由于时间紧,工作量大,但本次竞赛锻炼了我们各方面的能力,虽然我们遇到了很多困难和障碍,但总体上成功与挫折交替,困难与希望并存,我们将继续努力争取更大的进步。

当然,我们的设计还存在着一些缺陷,有待于在将来设计中进一步提高,在此恳请各位老师批评指正。

全部程序  

           

#include"io430.h"

#include"in430.h"

#include"12864.c"

#include"12864.h"

#include"nbc430.h"

#defineucharunsignedchar

#defineuintunsignedint

#defineS_AP10//定义步进电机A相

#defineS_BP11//定义步进电机B相

#defineS_CP12//定义步进电机C相

#defineS_DP13//定义步进电机D相

#definejg1P60//定义激光闪烁

#definejg2P61//定义激光闪烁

 

#defineS_A2P14//定义步进电机A相

#defineS_B2P15//定义步进电机B相

#defineS_C2P16//定义步进电机C相

#defineS_D2P17//定义步进电机D相

#defineS17P27//shang

#defineS18P26//you

#defineS19P25//启动/暂停

#defineS20P24//zuo

#defineS21P23//xia

//#defineDataportP5//数据口定义

uchartable0[]={"方位:

环数:

"};//液晶显示内容"位置"与“环数:

uchartable1[]={"正上右上正右右下正下左下正左左上中心"};//每两个字显示一个方位

uchartable2[]={"10环9环8环7环6环5环脱靶"};//显示环数

//**********************10环*****9环*******8环******7环******6环*****5环******脱靶********方向***********

uchartbzhsh[7][2]={{96,29},{96,23},{96,19},{96,13},{96,9},{96,3},{96,0}};//正上

uchartbzhxia[7][2]={{96,33},{96,39},{96,44},{96,49},{96,54},{96,59},{96,63}};//正下

uchartbzhzuo[7][2]={{93,31},{88,31},{83,31},{78,31},{73,31},{68,31},{64,31}};//正左

uchartbzhyou[7][2]={{99,31},{103,31},{109,31},{113,31},{119,31},{123,31},{127,31}};//正右

uchartbzuosh[7][2]={{94,27},{91,24},{87,22},{84,19},{80,15},{77,12},{73,8}};//左上

uchartbzuoxia[7][2]={{94,33},{91,36},{87,40},{84,43},{80,47},{77,50},{73,54}};//左下

uchartbyoush[7][2]={{98,27},{101,24},{105,22},{108,19},{112,15},{115,12},{119,8}};//右上

uchartbyouxia[7][2]={{98,33},{101,36},{105,40},{108,43},{112,47},{115,50},{119,54}};//右下

 

ucharstop,speed,sh,xh,zh,yh,x,sh1,xh1,zh1,yh1,a,b,q,h;

ucharkeyValue;

uchardis[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

//01234567

0x80,0x90};//0~F的段码

//89

ucharzhuan[8]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90};//右转8节拍地址

ucharzhuan1[8]={0x90,0x80,0xc0,0x40,0x60,0x2,0x30,0x10};//左转8节拍地址

ucharzhuan2[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//上转8节拍地址

ucharzhuan3[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};//下转8节拍地址

uchardis1[8]={0xFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F};//位选

//01234567

//***********************************************************************************

//延时

//***********************************************************************************

voiddelay(uinttime)

{

uinti,j;

for(i=0;i

{

for(j=0;j<30;j++);

}

}

//***********************************************************************************

//IO初始化操作

//***********************************************************************************

voidIO_init(void)

{

P1DIR=0xff;//设置P1为输出

P1=0xff;//设置P1初始化为高电平

P2DIR=0X00;

P2=0x00;

//P3DIR=0xff;//设置P3为输出

//P3=0xff;//设置P3初始化为高电平

//P4DIR=0xff;//设置P4为输出

//P4=0xff;//设置P4初始化为高电平

//P5DIR=0xff;//设置P5为输出

//P5=0xff;//设置P5初始化为高电平

P6DIR=0xff;

P6=0xff;

}

//**************************************************************************************************

//数码管显示函数

//**************************************************************************************************

/*

voidsmg_show(ucharsh,ucharxh,ucharzh,ucharyh)

{

P4=dis1[4];

Dataport=dis[sh];

delay(10);

P4=dis1[6];

Dataport=dis[xh];

delay(10);

P4=dis1[2];

Dataport=dis[zh];

delay(10);

P4=dis1[0];

Dataport=dis[yh];

delay(10);

}

*/

//***********************************************************************************

//1*5按键扫描函数

//***********************************************************************************

voidkeyScan()

{

if((P2IN&0xf8)!

=0xf8)//判断是否有按键按下

{

delay(100);//延时肖抖

if((P2IN&0xf8)!

=0xf8)//再次判断是否有按键按下

keyValue=(P2IN&0xf8);//读取扫描结果

while((P2IN&0xf8)!

=0xf8);//等待按键松开

}

}

voidkeyScan1()

{

if((P2IN&0xf8)!

=0xf8)//判断是否有按键按下

{

delay(100);//延时肖抖

if((P2IN&0xf8)!

=0xf8)//再次判断是否有按键按下

keyValue=(P2IN&0xf8);//读取扫描结果

delay(300);

}

}

//**************************************************************************************************

//步进电机控制

//**************************************************************************************************

voidyouzh()

{

uinty;

for(y=0;y<8;y++)

{

P1=zhuan[y];

delay(speed);

}

}

voidzuozh()

{

uinty;

for(y=0;y<8;y++)

{

P1=zhuan1[y];

delay(speed);

}

}

voidshangzh()

{

uinty;

for(y=0;y<8;y++)

{

P1=zhuan2[y];

delay(speed);

}

}

voidxiazh()

{

uinty;

for(y=0;y<8;y++)

{

P1=zhuan3[y];

delay(speed);

}

}

//**************************************************************************************************

//1*5按键扫描结果处理函数

//**************************************************************************************************

keyHandle()

{

switch(keyValue)

{

case0xb8:

//如果S18按键按下时下转

{

shangzh();

delay(50);

break;

}

case0xe8:

//如果S20按键按下时上转

{

xiazh();

delay(50);

break;

}

case0x78:

//如果S17按键按下时右转

{

youzh();

delay(50);

break;

}

case0xf0:

//如果S21按键按下时左转

{

zuozh();

delay(50);

break;

}

case0xd8:

//如果S19按键按下时切换模式

{

x++;

delay(50);

break;

}

default:

break;

}

}

keyHandle1()

{

switch(keyValue)

{

case0xe8:

//如果S20按键按下时上转xh下

{

xh++;//smg_show(sh,xh,zh,yh);

if(xh==12)

xh=0;

delay(100);

break;

}

case0xf0:

//如果S21按键按下时左转zh下

{

zh++;//smg_show(sh,xh,zh,yh);

if(zh==12)

zh=0;

delay(100);

break;

}

case0xd8:

//如果S19按键按下时切换模式

{

x++;

delay(100);

break;

}

case0x78:

//如果S17按键按下时右转yh下

{

yh++;//smg_show(sh,xh,zh,yh);

if(yh==12)

yh=0;

delay(100);

break;

}

case0xb8:

//如果S18按键按下时下转sh下

{

sh++;//smg_show(sh,xh,zh,yh);

if(sh==12)

sh=0;

dela

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1