完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
前言
你好学弟!这里是学长向你展示他们在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用于主控以及交互。这边先讲解如何交互,然后再简略讲解一下代码结构。整个工程我也会放上来。 交互操作 所有操作都在这个正点原子电阻屏上完成。一开始进入时需要进行屏幕校准,一般情况下屏幕校准只需要进行一次即可,结果会存到Flash里。这边有一个我们一直没能解决的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(" 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()) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 STM32 开发环境: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 */ 开发环境: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.cctiic.cmyiic.ctouch.cft5206.cgt9147.cott2001.c*/ 相关资料 工程链接: 百度云:https://pan.baidu.com/s/1Z5I1Z38kK1VSa_iRjeXQYQ 提取码:wbrp CSDN:https://download.csdn.net/download/qq_43243338/11938761 模块资料: 找淘宝店家要… |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1810 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1631 浏览 1 评论
1098 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
737 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1687 浏览 2 评论
1944浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
748浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
583浏览 3评论
604浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
565浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-29 05:50 , Processed in 0.668617 second(s), Total 50, Slave 43 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号