你好学弟!这里是学长向你展示他们在2019年夏天搭出来的破烂是如何运行的。老师让我们把这堆破烂留给你们(有些零件缺了你们要自己买 -_-),这边怕你们不懂,完全自愿的给你们写了一篇教程,规避一些我们走过的弯路,也希望你们能把这份精神传承下去,替下下届的接班人们开山铺路。话不多说,先上个实物图。
我们搭的这个玩意主要分为两个部分,电磁炮电路部分和控制电路部分,还有一块电源部分,当然其实测试现场是提供学生电源的,我们纯粹是吃饱了撑的。
我们基本是照着这个电路搭建的:
原理很简单,主要就是控制一个电容的充放电,电磁炮用的是450V/1000uF的高压电容,所以需要用一个升压模块,充电开关就接在电池与升压模块之间。至于放电,把线圈接在电容两边就行了,但是放电开关不能直接接回路里(会烧的),所以加了一个可控硅,也就是一个开关管,当G置高的时候,K&A端就导通了,最后加了一个续流二极管给线圈放电。
现在说起来很简单,当初可是想破了头。。。
上实物图:
这边贴出详细物料清单:
注意事项:
其实基本模型就是中学的抛体公式:
假设炮弹初速度为V,炮口相对于地面倾角为α,炮口相对于地面的竖直落差为h,重力加速度为g,取g = 9.8N/kg。
将炮弹的速度分解为水平与竖直两个方向上的分速度,分别为Vx=V *Cosα和Vy = V * Sinα。此时炮弹落地所需时间为:
t = − V y + ( V y 2 + 2 g h ) g t= \frac{-V_y+\sqrt {(V_y^2+2gh)}}{g} t=g−Vy+(Vy2+2gh)
炮弹在水平方向的距离方程为:
s = V ∗ c o s α ∗ t s =V *cosα * t s=V∗cosα∗t
炮弹在竖直方向的距离方程为:
y = V s i n α − 1 2 g t 2 y=V sinα-\frac{1}{2} gt^2 y=Vsinα−21gt2
由此可得出射角度α与距离s的关系式:
− h = s ∗ t a n α − 1 2 g ( s V c o s α ) 2 ( ∗ ) -h=s*tanα- \frac{1}{2} g(\frac{s}{V cosα })^2(*) −h=s∗tanα−21g(Vcosαs)2(∗)
这边当时我们通过调节升压模块上的可调电阻得到一个确定的电压(90~100V左右)与炮口初速,然后通过调节仰角α来改变距离s。
这边有两种思路:
器件清单:
代码分为OpenMV部分和STM32部分,OpenMV用于进行色块识别,STM32用于主控以及交互。这边先讲解如何交互,然后再简略讲解一下代码结构。整个工程我也会放上来。
所有操作都在这个正点原子电阻屏上完成。一开始进入时需要进行屏幕校准,一般情况下屏幕校准只需要进行一次就可,然而这边有一个我们一直没能解决的BUG,开发板上默认是不带24C02的,所以我们焊了一个上去,然而这个24C02在代码里始终无法初始化成功,不知道怎么回事。
进入程序界面:可选择操作模式,其中模式一用于指定角度与距离的射击,模式二用于识别红色标靶与距离并进行射击,模式三用于摆动射击。下方为调试信息。
模式一:上方两排分别对应百十个位的加减;Swtch用于切换设置距离或角度;Negti用于设置角度的正负,以炮口正对向前为0度;Start键开始射击;Retrn返回,有时候不太灵,需要重启一下。
模式二:有两个Start,分别对应摄像头测距与超声波测距,点左边那个。红色靶就按题目中给定的做。
模式三:就一个Start,点击过后会开始从-20°到+20°开始搜寻标靶,当搜寻到时会立即射出炮弹。
安装OpenMV IDE以及快速入门:参考链接
#提示包未安装的自己找教程安装一下-_-
import sensor, image, time, math
from pyb import UART
import json
import ustruct
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.skip_frames(time = 2000)
#sensor.set_auto_gain(False) # must be turned off for color tracking
#sensor.set_auto_whitebal(False) # must be turned off for color tracking
#sensor.set_auto_exposure(False,2000); #控制曝光时间,单位为us
sensor.set_hmirror(True); #控制水平镜像翻转
sensor.set_vflip(True); #控制水平镜像翻转
#sensor.set_windowing((22,7,110,105));
clock = time.clock()
uart = UART(3,115200) #定义串口3变量 P4 TX<-->PA10 P5 RX<-->PA9
uart.init(115200, bits=8, parity=None, stop=1) # init with given parameters
#binary_threshold = (0, 156)
find_threshold = (51, 77, 34, 67, -33, 50)
K = 12800; #自己选取一个合适的校准值
def find_max(blobs): #定义寻找色块面积最大的函数
blobs.sort(key=lambda x:x.pixels(),reverse=True);
max_blob={} #默认为空字典
length=len(blobs);
if length>0:
max_blob=blobs[0];
return max_blob;
def sending_data(cx_max,cy_max):
global uart;
#frame=[0x2C,18,cx%0xff,int(cx/0xff),cy%0xff,int(cy/0xff),0x5B];
#data = bytearray(frame)
data = ustruct.pack(", #格式为俩个字符俩个短整型(2字节)
0x2C, #帧头1
0x12, #帧头2
int(cx_max), # up sample by 4 #数据1
int(cy_max), # up sample by 4 #数据2LCD_ShowStringLCD_ShowString
0x5B);
uart.write(data); #必须要传入一个字节数组
while(True):
clock.tick()
img = sensor.snapshot()#.lens_corr(1.45);
#img.binary([binary_threshold], invert = 1)
blobs = img.find_blobs([find_threshold],area_threshold=150)
if blobs: #如果找到的话
max_blob=find_max(blobs)
img.draw_rectangle(max_blob.rect(),color=(0,0,255))
img.draw_cross(max_blob.cx(), max_blob.cy(),color=(0,0,255))
img.draw_cross(160, 120,color=(0,0,255)) # 在中心点画标记
img.draw_line((160,120,max_blob.cx(),max_blob.cy()), color=(0,0,255));
phi = (max_blob.w() + max_blob.h())/2;
length = K/phi; #获得距标靶距离
#print('position:',max_blob.cx(),max_blob.cy())
if(max_blob.pixels()>1000): #滤除像素过小的干扰
sending_data(max_blob.cx(),length); #发送点位坐标
#print(max_blob.pixels())
print("Length=",length);
else:
sending_data(10000,10000);
#print(clock.fps())
开发环境:Keil v5以及相应的F4XX器件包,Keil v4不知道会不会报错。
//这里就简要的说明一下各个文件的内容
//具体工程我放到百度云里了-_-
/*
main.c:
包含所有的变量定义,所有的初始化,
主循环while(1)用于模式切换以及数据通信
主要控制逻辑中断函数void TIM3_IRQHandler(void)频率50Hz,用于处理各个模式下的具体执行
usart2.c:
用于处理与OpenMV的通信
timer.c:
定时器3的初始化
pwm.c:
定时器14,11,4的初始化
Control.c:
对串口2接收的数据进行处理
对舵机的PID控制函数
Interface.c:
各个模式交互界面的编写
jidianqi.c:
继电器的初始化
US100.c:
超声波的所有相关
24cxx.c
ctiic.c
myiic.c
touch.c
ft5206.c
gt9147.c
ott2001.c
*/
工程链接:
百度云:https://pan.baidu.com/s/1Z5I1Z38kK1VSa_iRjeXQYQ 提取码:wbrp
CSDN:https://download.csdn.net/download/qq_43243338/11938761
模块资料:
找淘宝店家要…