激光枪自动射击报靶装置.docx
《激光枪自动射击报靶装置.docx》由会员分享,可在线阅读,更多相关《激光枪自动射击报靶装置.docx(62页珍藏版)》请在冰豆网上搜索。
![激光枪自动射击报靶装置.docx](https://file1.bdocx.com/fileroot1/2023-2/9/78e8b974-6e61-44b0-9ca1-03695e8f242a/78e8b974-6e61-44b0-9ca1-03695e8f242a1.gif)
激光枪自动射击报靶装置
[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