一、任务
自行设计并制作一模拟电磁曲射炮(以下简称电磁炮),炮管水平方位及垂 直仰角方向可调节,用电磁力将弹丸射出,击中目标环形靶(见图 3),发射周 期不得超过 30 秒。电磁炮由直流稳压电源供电,电磁炮系统内允许使用容性储 能元件。
二、要求
电磁炮与环形靶的位置示意如图 1 及图 2 所示。电磁炮放置在定标点处,炮管初始水平方向与中轴线夹角为 0°、垂直方向仰角为 0°。环形靶水平放置在地面,靶心位置在与定标点距离 200cm≤d≤300cm,与中心轴线夹角a≤±30°的范围内。
1. 基本要求
(1) 电磁炮能够将弹丸射出炮口。
(2) 环形靶放置在靶心距离定标点 200~300cm 间,且在中心轴线上的位置,键盘输入距离 d 值,电磁炮将弹丸发射至该位置,距离偏差的绝
对值不大于 50cm。
(3) 环形靶放置在中心轴线上,用键盘给电磁炮输入环形靶中心与定标点的距离 d,一键启动后,电磁炮自动瞄准射击,按击中环形靶环数计
分;若脱靶则不计分。
2. 发挥部分
(1) 环形靶位置参见图 2,用键盘给电磁炮输入环形靶中心与定标点的距离 d 及与中心轴线的偏离角度a,一键启动后,电磁炮自动瞄准射击,按击中环形靶环数计分;若脱靶则不计分。
(2) 在指定范围内任给环形靶(有引导标识,参见说明 2)的位置,一键启动后,电磁炮自动搜寻目标并炮击环形靶,按击中环形靶环数计分,完成时间≤50s。
(3) 其他。
三、说明
1. 电磁炮的要求
(1) 电磁炮炮管长度不超过 20cm,工作时电磁炮架固定置于地面。
(2) 电磁炮口内径在 10-15mm 之间,弹丸形状不限。
(3) 电磁炮炮口指向在水平夹角及垂直仰角两个维度可以电动调节。
(4) 电磁炮可用键盘设置目标参数。
(5) 可检测靶标位置,自动控制电磁炮瞄准与射击。
(6) 电磁炮弹丸射高不得超过 200cm。
2. 测试要求与说明
(1) 环形靶由 10 个直径分别为 5cm、10cm、15cm、… 50cm 的同心圆组成,外径 50cm,靶心直径 5cm,参见图 3。
(2) 环形靶引导标识为直径 20cm 的红色圆形平板,在距靶心 30cm 处与靶平面垂直固定安装,圆心距靶平面高度 30cm。放置时引导标识在
距定标点最远方向。参见图 1。
(3) 弹着点按现场摄像记录判读。
(4) 每个项目可测试 2 次,选择完成质量好的一次记录并评分。
(5) 制作及测试时应佩带防护眼镜及安全帽等护具,并做好防护棚(炮口前用布或塑料布搭制有顶且两侧下垂到地面的棚子,靶标后设置防反弹布帘)等安全措施。电磁炮加电状态下严禁现场人员进入炮击区域。
GPT-4o给出的设计方案:
设计并制作一套能够自动调整电磁炮射击角度的系统,使炮管水平向左30°和右30°的范围内灵活调整。依靠电磁力将弹丸射出,击中目标环靶。电磁炮具有精准的角度控制和启动机制,在 30 秒内完成一次射击。
机械结构设计
控制系统
设计与选型
机械结构设计
电路设计
控制系统编程
系统集成与调试
调试过程
功能验证
以下为实现角度调整和电磁炮控制的关键代码示例,使用C语言编写,适用于Arduino平台。
#include <Servo.h>
Servo motor; // 定义伺服电机
int targetAngle = 0;
int currentAngle = 0;
int kp = 1, ki = 0, kd = 0; // PID 参数
void setup() {
motor.attach(9); // 将伺服电机连接到数字9端口
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
targetAngle = Serial.parseInt(); // 接收目标角度
if(targetAngle >= -30 && targetAngle <= 30) {
adjustAngle(targetAngle); // 调整角度
fireCannon(); // 发射炮弹
}
}
}
void adjustAngle(int angle) {
int error, previousError = 0;
int integral = 0;
while(currentAngle != targetAngle) {
error = targetAngle - currentAngle;
integral += error;
int derivative = error - previousError;
int adjustment = kp*error + ki*integral + kd*derivative;
currentAngle = constrain(currentAngle + adjustment, -30, 30);
motor.write(map(currentAngle, -30, 30, 0, 180));
previousError = error;
delay(100);
}
}
void fireCannon() {
// 模拟电磁炮发射的代码,实际应用中需根据具体情况编写
delay(1000);
Serial.println("Firing!");
}
本题目考察的知识点
该项目设计主要考察了以下关键知识点: