激光枪自动射击打靶装置.docx
《激光枪自动射击打靶装置.docx》由会员分享,可在线阅读,更多相关《激光枪自动射击打靶装置.docx(14页珍藏版)》请在冰豆网上搜索。
![激光枪自动射击打靶装置.docx](https://file1.bdocx.com/fileroot1/2023-1/29/e1a34ddc-597e-46da-a797-eb838de1a447/e1a34ddc-597e-46da-a797-eb838de1a4471.gif)
激光枪自动射击打靶装置
激光枪自动射击打靶装置
摘要:
系统以MSP430和STM32为控制核心。
MSP430控制两个步进电机42BYGHM604在不同的两个坐标轴上转动以带动激光枪左右和上下移动,从而准确实现激光枪的瞄准和打靶。
STM32对摄像头模块OV7670传输的图像信息进行采集、分析处理,然后在彩屏显示器ILI9325LCD上显示胸环靶的相应图形,并闪烁显示弹着点;另外,STM32通过无线通信模块nRf24L01将信息发送至单片机MSP430,单片机进行分析、处理并在12864点阵液晶显示模块上显示弹着点环数及方位信息,同时由语音模块WTV020对环数进行播报。
经调试,该系统较好的实现了基础部分要求的各项功能及发挥部分要求的第一项功能,基本完成了发挥部分要求的第二项、第三项功能。
另外系统采用语音播报弹着点环数,清晰明了,具有一定的创新性。
关键词:
MSP430STM32步进电机摄像头彩屏显示器液晶显示器
1系统方案论证
1.1激光枪自动控制方案论证
方案一:
舵机带动激光笔瞄准。
利用两个舵机,在一个舵机的轴上固定另一个舵机,采用PWM波直接调节两个舵机的偏移角度,从而实现双轴瞄准。
但是,对于测控系统而言,5mV以上的控制电压的变化就会引起舵机的抖动,因此要达到精度要求有一定难度。
方案二:
直流电机带动激光笔瞄准
利用两个直流电机,采用全桥PWM控制直流电机正、反转,从而达到动态瞄准。
但该方案有许多不足之处,直流电机不易受单片机控制,旋转角度无法由程序有效控制且精度不高,对于固定角度旋转比较困难。
方案三:
步进电机带动激光笔瞄准
给步进电机加一个脉冲信号,电机则转过一个步距角,加上步进电机只有周期性的误差而无累积误差等特点,使得在速度、位置等控制领域采用步进电机控制变的非常的简单,且定位精确,稳定,可靠。
采用双桥电机驱动芯片L298N可实现瞄准机构旋转角度的精确控制。
经试验比较,我们采用第三种方案。
1.2控制方案论证
根据控制对象的特点,比较PID控制、模糊控制和模糊PID控制这三种控制策略发现,常规PID(比例,积分,微分)控制具有简单、稳定性好、可靠性高的特点,但是,常规的PID控制存在一些问题。
首先,常规PID控制器不能在线整定参数;并且,常规PID控制器对于非线性、时变的系统和模型不清楚的系统就不能很好的控制,其PID参数不是整定困难就是根本无法整定,因此不能得到预期的控制效果。
简单模糊控制由于不具有积分环节,因而在模糊控制的系统中又很难消除稳态误差,而且在变量分级不够多的情况下,常常在平衡点附近会有小的振荡现象。
但模糊控制器对复杂的和模型不清楚的系统都能进行简单而有效的控制,所以如果把两者结合起来,就可以构成兼有着两者优点的模糊PID(Fuzzy-PID)控制器。
所以,针对被控对象的特性我们选择利用模糊控制方式来给PID控制器在线自整定(或自校正,自调整)PID参数,组成模糊自整定(或自调整)参数PID控制器的控制策略。
1.3系统总体方案
基于以上方案的比较选择,系统总体设计框图如图1所示。
图1系统总体设计框图
整个设计以MSP430和STM32为核心,MSP430控制两个步进电机在不同的两个坐标轴上转动,从而带动激光枪进行左右和上下精确定位,实现打靶和和瞄准。
STM32通过摄像头模块进行图像信息采集,经过分析处理后在彩屏显示器上显示胸环靶的相应图形,并闪烁显示弹着点。
MSP430与STM32之间通过无线通信模块进行数据交换,配合实现系统要求。
2分析与计算
2.1激光枪自动控制原理
本设计使用了两个0.9度的步进电机来实现激光枪瞄准,将一个步进电机安装在另一个步进电机的轴上,从而构成一个双轴结构的激光枪,采用四项八拍的控制方式对两个步进电机转动角度进行精确定位,上下两个电机分别实现激光束横轴和纵轴方向的移动。
2.2弹着点检测原理
摄像头采集信息经过处理后将图像显示在TFT彩屏上,TFT上每个像素都有一个RGB数据值,由于弹着点为红色激光光斑,其RGB值与其周围靶面的RGB值相差很大,所以可以设定一个范围,当RGB值在这个范围之内时认为是有效光斑。
检测时,由TFT左上角第一个点开始从左向右、从上向下进行扫描,当扫描到RGB值在设定范围内的点时,将其记作P1(Xp,Yp),然后计算出O点坐标O(XO,YO),其中XO=Xp+2,YO=Yp+2,再找到O点周围的四个点A(XA,YA)、B(XB,YB)、C(XC,YC)、D(XD,YD)。
其中XA=XO,YA=YO+2,XB=XO+2,YB=YO,XC=XO,YC=YO+2,XD=XO-2,YD=YO。
如果A、B、C、D四点均为有效光斑,即可认为O点为弹着点中心;若A、B、C、D四点中任意一点不是有效光斑,则继续从P1点开始继续扫描,直到确定弹着点中心为止。
弹着点检测原理如图2所示。
图2弹着点检测原理图
3硬件设计
3.1激光枪及瞄准机构设计
3.1.1光源控制模块
单片机开断信号经过两个并联的100Ω功率电阻加到三极管S8050基极,激光头接于S8050集电极,通过单片机控制可实现激光枪的开通与关断。
光源控制电路如图3所示。
图3光源控制电路
3.1.2瞄准机构电机驱动模块
电路主要由光电耦合器TLP521-4和TLP521-2以及电机驱动芯片L298组成。
IN1、IN2控制电机正反转方向,ENA使能,同理,IN3、IN4和ENB实现对另一电机的控制。
单片机控制端与L298之间采用光耦隔离以减少信号干扰。
瞄准机构电机驱动电路如图4所示。
图4瞄准机构电机驱动电路
3.2弹着点检测
3.2.1摄像头模块
系统采用OV7670图像传感器来采集胸环靶及弹着点信息,OV7670通过SCCB总线控制,可以输出整帧、子采样、取窗口等方式的各种分辨率8位影响数据,VGA图像最高达到30帧/秒。
所有图像处理功能过程包括伽玛曲线、白平衡、饱和度、色度等都可以通过SCCB接口编程。
应用独有的传感器技术,通过减少或消除光学及电子缺陷可以输出高清晰度、高稳定性的彩色图像。
3.2.2无线通讯模块
本设计通过nRF24L01无线射频通讯模块实现STM324和MSP430之间的双机通信。
nRF24L01是一款工作在2.4~2.5GHz的通用ISM频段的单片无线收发器芯片,输出功率、频道选择和协议的设置可以通过SPI接口进行设置,具有低功耗,受干扰小,稳定性高的特性。
nRF24L01无线通信模块接口电路如图5所示。
图5nRF24L01无线通信模块接口电路
3.3显示及播报
3.3.1显示模块
本设计使用了FTF彩屏和LCD12864液晶显示屏构成系统的显示模块。
基于FTF具有较高的对比度和荧屏更新频率的特性,用它来显示胸环靶的相应图形,并闪烁显示弹着点;而LCD12864是一种具有4位/8行、2线或3线串行多种接口方式的点阵图形液晶显示模块,其显示分辨率为128*64,可以显示8*4行16*16点阵的汉字,用来显示弹着点环数及方位。
3.3.2语音模块
设计中使用WTV020这一款功能强大的可编程语音芯片来播报弹着点环数及方位,WTV020内嵌高速DSP内核处理器,支持WAV、MP3两种常用的音频格式,具有DAC和PWM两种输出方式,内置功放输出可直接驱动0.5W喇叭。
WTV020语音芯片引脚图如图6所示。
图6WTV020语音芯片引脚图
4软件设计
本次设计采用了两套控制系统,以MSP430为核心的单片机控制系统用于控制激光枪二维平面位置及瞄准发射,以STM32为核心的ARM控制系统则进行图像信息采集与分析处理。
MSP430程序流程图如图7所示,STM32程序流程图如图8所示。
主要控制程序见附录。
图7MSP430程序流程图图8STM32程序流程图
5测试数据与结果分析
5.1测试仪器
(1)精度0.1cm的卷尺和直尺;
(2)精度0.01s秒表。
5.2测试方法
(1)基础部分测试
用键盘设置激光束在靶纸上上下、左右移动,通过摄像头识别激光枪投射在胸环靶上的弹着点光斑,并显示弹着点的环数与方位信息。
经过多次反复测试得到测试数据如表1所示。
表1测试数据
测试次数
实际环数
显示环数
播报环数
实际方位
显示方位
播报方位
1
10
10
10
中心
中心
中心
2
9
9
9
左上
左上
左上
3
8
8
8
右上
右上
右上
4
6
6
6
右下
右下
右下
5
5
5
5
正上
正上
正上
从测试数据反映,系统对弹着点的环数及方位检测准确度高。
(2)发挥部分测试
自动控制激光枪,使激光束光斑从胸环靶上的指定位置迅速瞄准并击中靶心,并记录所用时间。
经过多次反复测试得到测试数据如表2所示。
表2测试数据
测试次数
指定点对应环数
瞄准误差(mm)
所用时间(S)
1
9
1
3
2
8
1.2
3
3
7
1.5
4
4
6
0.9
5
5
5
1.6
6
任意设定环数,控制激光枪瞄准击中胸环靶上相应位置,并记录所用时间。
经过多次反复测试得到测试数据如表3所示。
表3测试数据
测试次数
指定环数
瞄准误差(mm)
所用时间(S)
1
10
1
5
2
9
1.5
7
3
8
1.2
9
4
6
1.6
12
5
5
1.3
15
从测试数据反映,系统瞄准精度较好,瞄准速度还有待进一步提高、完善。
6结论
通过测试,激光枪自动射击装置较好的实现了控制激光枪击发、自动报靶及自动瞄准等功能,能准确检测、显示和播报弹着点环数及方位。
整个系统功能完善,检测与瞄准精度较好,自适应能力较强,且有一定的创新性。
参考文献
[1]瞿安连.电子电路-分析与设计.华中科技大学出版社,2010.
[2]王兆安,黄俊.电力电子技术.第四版.西安交通大学:
机械工业出版社,2006.
[3]刘树棠等.基于运算放大器和模拟集成电路的设计.西安交通大学出版社,2004.
[4]张天钟,姜宝钧,邓兴成.基于MCS-51单片机的光源跟踪.实验科学与技术,2006,(01):
39-40.
[5]张日希等.MSP430系列单片机实用C语言程序设计.人民邮电出版社,2005.
附录系统主要控制程序
基于MSP430的电机控制程序:
voidcir_x_y()//运动到圆心
{
Run_Time1=0;
IO_send();
num_x=179;
num_y=119;
get_dir();
cycle_num=10;
point_to_point(num_x,num_y,ox,oy);
}
voidcir_run(floatx,floaty)//x,y轴所运动的长度
{
uintthe_numstep_x,the_numstep_y;
num_x=x;
num_y=y;
the_numstep_x=(int)(num_x/little_length_x);
the_numstep_y=(int)(num_y/little_length_y);
if((the_numstep_x>=the_numstep_y)&(the_numstep_y!
=0))
{
together_step=(int)(the_numstep_y/little_length_y);
per=(int)(the_numstep_x/(the_numstep_y));
along_step=((int)the_numstep_x)%((int)((the_numstep_y)));
while(per--)
{
a=0;
while(a!
=together_step)
{
TACCTL0|=CCIE;
}
a=0;
dir_up=0;
}
while(a!
=along_step)
{
TACCTL0|=CCIE;
}
a=0;
dir_down=0;
}
if((the_numstep_x=0))
{
together_step=(int)(the_numstep_x/little_length_x);
per=(int)((the_numstep_y)/(the_numstep_x));
along_step=(((int)(the_numstep_y))%((int)(the_numstep_x)));
while(per--)
{
a=0;
while(a!
=together_step)
{
TACCTL0|=CCIE;
}
a=0;
dir_down=0;
}
while(a!
=along_step)
{
TACCTL0|=CCIE;
}
a=0;
dir_up=0;
}
}
基于STM32的弹着点检测程序:
/*寻找射击点*/
ErrorStatusGUI_LoctaionShootPoint(u16*PointX,u16*PointY)
{
u16x,y;
//u16PointX,PointY;
u16Xlimit;//每个Y行对应的X极限长度
intdelta=0;
//u8PonitLen=4;//点的直径
//十字星
//GUI_Line(39,119,279,119,0x0000);//横
//GUI_Line(159,0,159,239,0x1234);//竖
//ili9320_ClearScreen(0xffff);//清屏此代码放于main函数开头
for(y=0;y<240;y+=2)
{
if(y<120)
delta=120-y;
else
delta=y-119;
Xlimit=sqrt(120*120-delta*delta);
for(x=159-Xlimit;x<159+Xlimit;x+=2)//X开始在圆内
{
*PointX=x;
*PointY=y;
if((ili9320_GetPoint(*PointX,*PointY)&0xF800)>58000)//注意:
这个值应该在某个范围
{
*PointX+=1;
*PointY+=1;
if((ili9320_GetPoint(*PointX,*PointY)&0xF800)>58000)//仍然在圆斑内
{
if(((ili9320_GetPoint(*PointX+1,*PointY)&0xF800)>58000)&&
((ili9320_GetPoint(*PointX,*PointY+1)&0xF800)>58000)&&
((ili9320_GetPoint(*PointX-1,*PointY)&0xF800)>58000)&&((ili9320_GetPoint(*PointX,*PointY-1)&0xF800)>58000))//仍然在圆斑内
{
GUI_ShowShootPoint(PointX,PointY);//打点
//显示坐标
GUI_ShowRGB(0,0,*PointX,0x0000,0xffff);
GUI_ShowRGB(0,16,*PointY,0x0000,0xffff);
returnSUCCESS;
}
}
}
}
}
/*中心位置处理*/
for(y=118;y<120;y++)
{
for(x=144;x<174;x++)
{
if((ili9320_GetPoint(x,y)&0xF800)>25000)
{
if((ili9320_GetPoint(x+1,y)&0xF800)>25000)
{
*PointY=y;
*PointX=x+1;
GUI_ShowShootPoint(PointX,PointY);//打点
//显示坐标
GUI_ShowRGB(0,0,1,0x0000,0xffff);
GUI_ShowRGB(0,16,*PointY,0x0000,0xffff);
returnSUCCESS;}
}
}
}
for(x=158;x<160;x++)
{
for(y=104;y<134;y++)
{
if((ili9320_GetPoint(x,y)&0xF800)>25000)
{
if((ili9320_GetPoint(x+1,y)&0xF800)>25000)
{
*PointY=y+1;
*PointX=x;
GUI_ShowShootPoint(PointX,PointY);//打点
//显示坐标
GUI_ShowRGB(0,0,1,0x0000,0xffff);
GUI_ShowRGB(0,16,*PointY,0x0000,0xffff);
returnSUCCESS;}
}
}
}
*PointX=0;
*PointY=0;//脱靶
returnERROR;
}