大四还有最后一个课程设计,在暑假电赛的现场跟老师吹嘘了一下,就把H题的电磁炮拿来作课程设计,结果…所以说,没事不要吹牛,吹了就要负责任。因为大四时间比较紧张,各种事务杂乱繁忙,只能砍去打炮之外的其他功能。所以本文主要介绍如何制作一个简易的线圈炮。
读者须知
不知道读者阅读此文的目的是什么,都需要做到以下保证:
① 不伤害他人。科技是双刃剑,拿来害人终究会害了自己。
② 遵守中国法律法规。严格控制功率,不要做犯法的事情。
③ 不可售卖。本文的初衷是技术的记录与交流,而非支持第三方商业活动。
④ 注意安全!实验时可能会发生安全事故,请读者做好防护工作,本人不对任何安全事件负责。
电磁炮
制作一样工具都需要先了解这样工具是什么。电磁炮其实属于一个大类,细分之下还有轨道炮、线圈炮、电热炮、重接炮四大炮种。其原理都绕不开电磁感应。其高中物理学过:平行垂直磁场下,通电导线将做直线运动。这就是轨道炮的最基本原理。但本文不做轨道炮,而是第二种,线圈炮。形状如下图右上方。
上图来自百度百科电磁炮的截图
线圈炮形如其名,通过给线圈通电的方式产生磁场,利用磁极同性相斥原理将磁性炮弹打出。所以,线圈炮的制作难点在于:
① 应该给线圈通什么电?
② 怎样给线圈通电?
③ 通电电压应该多大? 通电多长的时间?
线圈通直流电,只有直流电才有唯一的电流方向,才能产生唯一的磁场方向,这是根据右手定则确定的。给线圈通电的方式有很多种,但是需要思考明白的是,这个电肯定是一瞬间的事情,就像积攒了大量的雨水然后打开水坝水闸的样子,子弹才会瞬间获得力量喷射出去。而这个力量取决于电压的大小,电压越大,释放的电量越足,电流也就越大,瞬间磁场也就越强,子弹喷射的距离也就越远。这样子,给线圈通电的方式也就很明了,那就是用电容放电的方式给线圈进行通电。
电容
电容在电路中起着各式各样的作用,但是它最本质的作用是储能,它是一种能够存储电荷的元件。
电容充电
电容的两极只要产生压差就能进行充电。电容的充电电路十分简单,只要将电源正极接到电容正极,电源负极接到电容负极即可,最好外加一个开关。
需要注意的是,电容的正负极不要反接。在不明电容内部材料的情况下进行反接,短时间小电压接触下不会对电容器产生大的损害,但是长时间如此内部可能会发生氧化还原反应(高中化学),造成电容不可逆的损害,从而损坏电容。严重时还有可能发生爆炸(内部化学反应产生气体),造成安全事故。
或许你会疑惑,电源直接接上电容会不会瞬间产生爆炸,或者瞬间电流过大损害电容,或者电压过大造成人体触电。需要强调的是,这都是可能的事情。所以接电路之前,需要观察电容的极限电压与电容大小。以及千万要注意保证自身的安全。
为了方便观察电容的充电过程,上述电路的基础上,增加一个发光二极管。为了防止电流的倒流,增加一个二极管。为了防止电流过大而损坏元件,增加电阻。
这里R3的大小可根据实际需要进行更换。若VCC=50V,R3可取的范围是300~1K,电阻越小充电电流越大,充电速度越快,电阻损耗速度越快;电阻越大充电电流越小,充电速度越慢,电路安全性越高。由于充电过程对电阻来说是进行功率损耗,所以电阻需要选择支持高功耗的,如1/2W、1W。
电容放电
当LED熄灭的时候,说明此时电容的电压已经接近电源电压,可以近似理解为电容充满电。这时将电容两端的导线断开,换成如下的电路。
此时的电容相当于一个电源,当构成回路时,电容持续放电,直到电容两极的电压为零。
理解电容的充放电原理之后,可以降低内心对电容的恐惧。如果把电容放电的负载换成线圈,其实就已经是一个线圈炮了。只不过这样的结构十分简陋,充电放电的操作麻烦且不安全,所以需要对其进行改进。
原理图
充放电电路
上图就是线圈炮中电容的充放电电路,其基本原理已经在上文电容充放电作出解释,这里就其原理进行扩充与应用。观察此电路图,需要懂得基本的三极管开关电路,继电器工作原理的知识,这里为免累赘就不作解释了,可以自行百度或者留言本博客等待解答。
充电(charge)
充电的思路是,让高电压到达电容正极,低电压(地)到达电源的负极,从而构成充电回路,对电容进行充电。这里用两个继电器替代上文的两个自锁开关,继电器的通断取决于PNP三极管(S8550)基极的电压,而此电压取决于单片机GPIO引脚的输出电压。此时,单片机应该输出的是:
GPIO | 输出电压 |
---|---|
charge | 0v |
discharge | 5v |
因此,左边继电器没有电压,无法工作,开关5打在常闭触点2上,50v高压对电容正极进行充电。相反,右边继电器接收到工作电压,开关5跳到触点1上,电容负极与地连接,地对电容负极进行充电。此时LED灯发光。
继电器上电瞬间,开关5跳变的过程会发出声音,你将在听到滴答声后看到LED灯发光。
当LED灯熄灭时,电容趋于满电,准备放电。
放电(discharge)
放电的思路是,让电容的正极与负极相接,构成闭合电路。与充电相反,此时单片机的输出应该是:
GPIO | 输出电压 |
---|---|
charge | 5v |
discharge | 0v |
此时,左边继电器开始工作,开关5跳变打到触点1上,电容正极接入线圈一端。右边继电器停止工作,开关5回到常闭状态,与触点2连接,电容负极接入线圈另一端。线圈是一根长导线,将电容正负极相连。
在电容放电的一瞬间,线圈内部流过电流,产生磁场,此时若线圈前方有磁石,若磁石与线圈相对面是异极,那么磁石将被线圈吸引;若磁石与线圈相对面是同极,磁石被线圈排斥,瞬间巨大的排斥力将会把磁石击飞。
听闻导磁体也可以产生同样的效果,可当放入螺丝时,无论怎么放都会被线圈吸引。而放入磁石的效果比较良好。
升压电路
升压电路非常简单,因为是直接用的DCDC升压模块。这个模块可以在淘宝搜盛科电子搜到,性价比较高。输入电压5V,输出电压可以为6~50V,蓝色部分为滑动变阻器,改变阻值可以改变输出电压。当然也可以自己设计升压电路。
主控电路
主控还是采用51单片机,用到两个GPIO口,两个外部中断,串口通讯。
其他电路
通讯电路用到了蓝牙模块HC-06,配合App实现远程遥控打炮。
PCB设计
材料选购
单片机最小系统
材料 | 数量 |
---|---|
单片机锁紧座 40脚 | 1 |
11.0592M晶振 | 1 |
22pF瓷片电容 | 2 |
四脚按键 | 2 |
电源
材料 | 数量 |
---|---|
DC005-2.0插座 | 1 |
自锁开关 | 1 |
DCDC升压模块 | 1 |
控制
材料 | 数量 |
---|---|
电容22000uF | 2 |
继电器5V | 2 |
三极管S8550 | 2 |
其他
材料 | 数量 |
---|---|
接线端子2P | 3 |
红色LED | 1 |
电阻1K(1W) | 2 |
电阻2.5K(1/4W) | 1 |
1N4007二极管 | 1 |
排母4P | 1 |
PCB之外
材料 | 数量 |
---|---|
线圈400匝 | 1 |
PC圆管 | 1 |
磁铁 | 若干 |
HC-06 蓝牙模块 | 1 |
这里不赘述材料链接,具体型号尺寸的链接将会以清单形式放在压缩包中。
画板
上图就是线圈炮的PCB图。单片机插座由于丝印反向,所以焊接的时候需要把插座反向放置,但是单片机还是得保持正向放置才不会烧坏。其次,DCDC升压模块的两个焊盘需要穿螺丝,螺丝型号尽量选M2.5,以防空间不足。最后是继电器,继电器的封装也是偏小,焊接之前要掰一下引脚,上锡的时候多融点锡即可。希望读者能自己画一块PCB板,根据手头的材料重新画一下封装。
代码
单片机
单片机代码十分简单,仅用到外部中断与串口通讯,这里简单带过。
外部中断修改flag变量。
//充电
void Int0(void) interrupt 0
{
DelayMs(300);
flag = 1;
}
//发射
void Int1(void) interrupt 2
{
DelayMs(300);
flag = 0;
}
单片机串口接收来自蓝牙模块的串口数据,从而触发串口接收中断。不知道是何种原因,SBUF的数据直接传入变量会造成最后一位数据的丢失,所以采用先左移一位,再右移复原的方式保证数据的完整。当接收到的数据为 0x01 或者 0xff 时修改flag变量。
void Timer1_Usart(void) interrupt 4
{
uchar rD;
ES = 0;
T0 = 0;
if(RI)
{
receiveData = ((uint)SBUF)<<1;
rD = (uchar)(receiveData>>1);
while(RI == 0);
RI=0;
switch(rD)
{
case 0x01://发射
flag = 0;
break;
case 0xff://充电
flag = 1;
break;
}
}
T0 = 1;
ES = 1;
}
主函数不断扫描flag变量,flag为1时触发充电,为0时触发放电(发射)。
void main()
{
External_Inter_Init();
Usart_Init();
charge = 1;
discharge = 1;
while(1)
{
if(flag)
{
charge = 0;
discharge = 1;
}else{
charge = 1;
discharge = 0;
}
}
}
设置定时器1产生波特率,波特率为4800。PS 置1是使串口接收中断的优先级更高。
void Usart_Init(void)
{
SCON=0X70; //设置为工作方式1
TMOD=0X20; //设置计数器1为工作方式2
PCON=0X80; //波特率加倍
TH1=0xf4; //计数器初始值设置,注意波特率是4800的
TL1=0xf4;
ES=1; //打开接收中断
PS=1; //设置串口中断的优先级更高
TR1=1; //打开计数器
}
外部中断的配置以及延时函数在此不赘述。除此之外,还可以增加串口的发送函数,将蓝牙模块所需要的AT指令配置写入主函数当中。但这里没有写的原因是,蓝牙模块处在不同波特率下是无法通讯的,需要用电脑串口软件进行修改设置。与其如此,这里直接省去。
App
App的代码是基于蓝牙协议下,蓝牙串口软件修改而来。重点在于sendData(String)函数的理解与应用,按键监听函数OnClickListener()的修改。
首先是sendData(String)函数,需要传参为String字符串类型。传入的指将被截取传入ss变量,经过for循环的检索,如果内容不为空,即长度不为零,那么将变量以int型16进制形式传入bs变量,最终发送出去。
/*
** 发送指令函数
** 每次只能发送一个字节即八位,且以16进制发送
*/
private void sendData(String Send_code)
{
if (mConnectService==null||mConnectService.getState()!=BluetoothService.CONNECTED) {
Toast.makeText(this,"未连接到任何蓝牙设备", Toast.LENGTH_SHORT).show();
return;
}
byte[] bs;
String[] ss=Send_code.split(" ");
bs=new byte[1];
for(String s:ss){
if(s.length()!=0){
bs[0]=(byte)(int)Integer.valueOf(s, 16);
mConnectService.write(bs);
}
}
}
然后是按键的监听。当btn_charge按键被按下,那么将code_number赋值为255(即0xff);code_number &= 0xff 这一步是必须的,按位相与,虽然看起来没什么变化,但是实际上内部发生了变化。之后调用 sendData(String) 函数,将255以String类传入。btn_discharge按键被按下后的代码大同小异,只不过把code_number的值替换成1(即0x01)即可。
private OnClickListener ButtonClickListener = new OnClickListener() {
public void onClick(View v) {
switch(v.getId()){
case R.id.btn_charge:
int code_number0 ;
code_number0 = 255;
code_number0 &= 0xff;
sendData(Integer.toHexString( code_number0 ));
Toast.makeText(getApplicationContext(),"充电中..",Toast.LENGTH_SHORT).show();
//延时
for(int b = 19;b > 0;b--)
{
for(int a = 130;a > 0;a--);
}
break;
case R.id.btn_discharge:
int code_number1;
code_number1 = 1;
code_number1 &= 0xff;
sendData(Integer.toHexString( code_number1 ));
Toast.makeText(getApplicationContext(),"已发射!",Toast.LENGTH_SHORT).show();
//延时
for(int b = 19;b > 0;b--)
{
for(int a = 130;a > 0;a--);
}
break;
}
}
};
实物
正面照
反面照
演示
按键触发
App触发
下载
原理图,PCB,代码,清单的压缩包下载:
https://download.csdn.net/download/qq_43419705/11932903
由于大四事物繁多,只能挤着时间更新,细节地方没有很深入讲解,在此对读者说一声抱歉。有任何问题,可以在下方评论留言,我会尽力解答。
转载自原文链接, 如需删除请联系管理员。
原文链接:简易线圈炮制作,转载请注明来源!