做一个可实现软着陆的“火箭” ,逐梦太空!
时间:2021-09-06 15:20:10
手机看文章![](https://img.21ic.com/qrcode/qrcode.php?url=https://www.21ic.com/article/900348.html)
扫描二维码
随时随地手机看文章
[导读]大家好,我是张巧龙,今天给大家带来一个自制的“火箭”项目。在这个项目中,我们将建造一个带有自动降落伞弹射机制的水火箭,以及一个数据传输系统,这样我们就可以监测火箭在空中时候的方向(根据加速度计和陀螺仪数据估计)。水火箭是一种模型火箭,它使用压力室(通常是一个PET瓶,也就是碳酸饮...
大家好,我是张巧龙,今天给大家带来一个自制的“火箭”项目。在这个项目中,我们将建造一个带有自动降落伞弹射机制的水火箭,以及一个数据传输系统,这样我们就可以监测火箭在空中时候的方向(根据加速度计和陀螺仪数据估计)。
水火箭是一种模型火箭,它使用压力室(通常是一个PET瓶,也就是碳酸饮料瓶)内的水和压缩空气作为推力发动机。火箭的运行可以用牛顿第三定律来解释,压缩室中的水被压缩空气抛出,因为它试图释放压力释放积累的势能,所以在相反的方向会产生一个推动火箭的力。
▲ 效果演示
切开大的长方形,在中间切线,切成两个大小相同的长方形,如(6)所示;对于每一个长方形纸板,通过标记线切割纸板的顶层,以便我们可以折叠它们;在其中一个圆圈的标记线上涂上热熔胶,并将其中一个折叠的长方形纸板粘起来,然后将另一个长方形纸板粘在前一个长方形纸板的后面以加固它;我们需要为扎带开孔,所以在距离长方形两端约15毫米处标出一条线,并在这条线上画出4个高约3毫米、宽约5毫米的长方形,如(9)所示,它们之间的距离大约相等;将另一个圆粘在上面;切断小矩形,并测试一下扎带是否能穿过小孔。
把用硬纸板做的支架放在这个瓶子里。支架在里面,在瓶子上标出一个矩形,覆盖支架的正面(支架的正面是我们为扎带打孔的那一面,或者是空间最大的那一面),这个矩形在每个水平端应该有20毫米的额外空间。现在取下纸板支架,用切割机切割矩形,如(12)、(13)和(14)所示,小心地将矩形从瓶子里切出来,因为这部分以后将用于固定里面的降落伞。然后在长方形的一端上开个洞,用橡皮筋穿过,如(15)所示,最后用胶带把长方形固定在瓶子的右边(就是把瓶子竖起来的时候),这样就可以当一个盖子了,如(16)所示。
现在切开这个长方形的小孔,插入电机。如(19)和(20)所示,用螺钉或热熔胶把电机固定在支架上。PS: 如果纸板有点薄,螺丝可能会不起作用,对螺丝用力过猛也会导致安装松动,在这种情况下,热胶更容易、更安全。在纸板支架的左侧,开一个小孔,让电机的电线通过,尽量靠右放,如(19)所示。
如(21)所示,从一个未使用的瓶子上剪下一个230毫米×96毫米的矩形(用卷尺测量)作为降落伞“弹簧”。在剪下来的正方形塑料片的每个短端,在离边界约10毫米处划一条线,将标记线与纸板支架两端的孔的边缘对齐(在纸板支架的背面),并在每个孔上做一个标记,如(22)所示。用切割器或电烙铁在每个标记的矩形上打一个孔。如(23)所示,用扎带将“弹簧”固定在纸板支架上。如(24)所示,必要时用钳子将扎带穿过(如果“弹簧”碍事,你也可以将它弯曲)。将纸板插入瓶中,使“弹簧”位于孔的一侧;为了把纸板支架推入,可能需要先把“弹簧”推到支架上,然后再把支架推到瓶子里面去;在电机的顶部画一个长方形,并把它剪下来,这个孔是橡皮筋穿过的地方,它将被连接到电机上,保持盖子关闭,降落伞被压缩在“弹簧”上。在下面GIF里,你可以看到如何将降落伞放入火箭内部。
我们在电路板上为无线电模块放置了一些母头,并使用长的公头到母头的电缆连接它。
对于伺服电机,我们放了一些公头。稳压器用于为NRF24L01 提供电源,因为我们发现Arduino的3.3V输出不能提供足够的电压,程序有时会失败。你可以使用任何你想要的方法连接元件,但请记住纸板支架内的空间是有限的。要把电路板安装到纸板支架上,首先,把它从瓶子里拿出来(1),把电路板放在纸板支架的左侧上面,并在左上角和右下角做标记,如(2)所示。取出电路板,在每个角上标记并切出2个相距约10毫米的小矩形,如(3)所示。对于每一对孔,从纸板支架的背面把一条小线穿过孔(可能需要推动“弹簧”使线穿过),用线将线路板固定在纸板上,如图(4)。在最后一张图片上,我们展示了固定其中一个角的结果,电线的一端穿过纸板上的一个孔,然后我们扭动它,使它保持在原位。
然后将电源线连接到充电宝,将NRF24L01 连接到电路板,如(6)和(7)所示。最后将元件固定在纸板上(8)。我们用胶带将无线电模块固定住,用双面胶带将充电宝固定住,并用胶带加固。请记住,为了使纸板支架适合于瓶内,它上面的元件不应越过圆圈的边界,所以要把所有东西放在圆圈内。在把纸板支架放进瓶子里之前,把程序
Requires the following libraries:
RF24 by TMRh20, Avamander
MPU6050 by Electronic Cats
Connections:
Shown in the schematic
*/
#include
#include "RF24.h"
// Radio Transmitter - NRF24L01
RF24 radio(7, 8); // using pin 7 for the CE pin, and pin 8 for the CSN pin
uint8_t rocketAddress[] = "ROCKT";
const int payloadSize = 12; // *
union{
struct {
int16_t acc[3];
int16_t gyr[3];
} raw;
char bytes[payloadSize];
} data;
// Sensor - Accelerometer and Gyroscope - MPU6050
#include "I2Cdev.h"
#include "MPU6050.h"
#include "Wire.h"
MPU6050 accelgyro;
#define THRESHOLD 1000
// Actuator - Servomotor
#include
Servo servo;
#define START_ANGLE 110
#define END_ANGLE 30
void setup() {
Serial.begin(115200);
Serial.println("Started");
// Configure Radio Transmitter - NRF24
if (!radio.begin()) {
Serial.println(F("Radio hardware not responding"));
while (1) {}; // hold in infinite loop
}
if (radio.isChipConnected()){
Serial.println("NRF24L01 connection successful");
}
else{
Serial.println("NRF24L01 connection failed");
while (1) {};
}
radio.setPALevel(RF24_PA_LOW);
radio.setAutoAck(false);
radio.setDataRate(RF24_250KBPS);
// This node sends data
radio.openWritingPipe(rocketAddress);
// Configure Sensor - Accelerometer and Gyroscope - MPU6050
Wire.begin();
accelgyro.initialize();
if(accelgyro.testConnection()){
Serial.println("MPU6050 connection successful");
}
else{
Serial.println("MPU6050 connection failed");
while (1) {};
}
// Configure Actuator - Servo
servo.attach(3);
servo.write(START_ANGLE);
// Wait for devices to be ready
delay(500);
}
void loop() {
// Get sensor data
accelgyro.getMotion6(
水火箭是一种模型火箭,它使用压力室(通常是一个PET瓶,也就是碳酸饮料瓶)内的水和压缩空气作为推力发动机。火箭的运行可以用牛顿第三定律来解释,压缩室中的水被压缩空气抛出,因为它试图释放压力释放积累的势能,所以在相反的方向会产生一个推动火箭的力。
▲ 效果演示
冷知识:
PET:Polyethylene Terephthalate(聚对苯二甲酸乙二醇酯)矿泉水瓶用的塑料就是聚对苯二甲酸乙二醇酯,翻转矿泉水的瓶子,可以看见下面有个小小的符号,三角形中写了数字“1”,这是最常见的塑料材质之一,绝大多数的矿泉水、饮料瓶采用这种材料。具质轻、透明度高、耐冲击不易碎裂等特性;耐热至70℃,只适合装暖饮或冻饮,装高温液体、或加热则易变形,有对人体有害的物质融出。
材料
火箭机身
- 3个PET瓶,3L大小(重要的是,至少有一个瓶子是用来储存苏打水的,因为它必须能够承受高压力)
- 4x Balsa木板 200 * 25mm
- 8x 螺钉
- 1x 喷漆
- 1x 橡皮筋
- 1x 降落伞(我们用了一把旧伞,在布的每个尖端都系上了绳子)
- 1x PC板 250 * 250mm
电子部分
- 4根扎带
- 纸板
- 1个面包板
- 1x 加速器(我们使用MPU6050,它有一个加速器和陀螺仪)
- 2个Arduino板(我们使用了Arduino nano和Arduino mega)
- 1个3.3V电压调节器(我们使用LM317可调电压调节器)如果使用LM317的电压调节器电路,则还需要:
- 1x 电阻器(390欧姆)
- 1x 电阻器(240欧姆)
- 1x 伺服电机 (我们使用的是普通的SG90)
- 2x NRF24L01 模块
- 1x 电池,为电路板供电(我们使用了一个充电宝)。将充电宝连接到电路板需要:
- 1x USB-A连接器
- 母头和公头
- 胶带
- 双面胶带
- 热熔胶
工具
- 热熔胶枪
- 剪刀
- 记号笔
- 电烙铁
- 镊子
- 测量带
- 订书机
- 水火箭发射器(我们在这个说明中没有解释如何制作火箭发射器,但你可以查看这篇水火箭的文章,自己制作一个http://aircommandrockets.com/rocket_launcher.htm)
步骤一:降落伞制作
计算瓶子的半径
如(1)所示,测量周长,然后应用公式r=c/(2*pi)
来计算半径,在我们的例子中,半径是60毫米。根据这些信息,在纸板上标出2个半径为瓶子半径减去1毫米的圆(在我们的例子中是59毫米),并将其剪下,如(2)和(3)所示。对每个圆,按(4)所示画线。为此,我们首先画出一条穿过圆心的线,这条线将被称为线1;在线1的一端测量40毫米,然后画一条与圆的边界相接触的垂直线,这条线将被称为线2;在线1的另一端测量20毫米,画一个点;现在在该点和线2的两端之间各画一条虚线,这条虚线的长度记为L。步骤二
根据上述测量值(L),在纸板上画一个高110毫米,宽(L)×4毫米的长方形,每隔(L)毫米划一条垂直线(5);切开大的长方形,在中间切线,切成两个大小相同的长方形,如(6)所示;对于每一个长方形纸板,通过标记线切割纸板的顶层,以便我们可以折叠它们;在其中一个圆圈的标记线上涂上热熔胶,并将其中一个折叠的长方形纸板粘起来,然后将另一个长方形纸板粘在前一个长方形纸板的后面以加固它;我们需要为扎带开孔,所以在距离长方形两端约15毫米处标出一条线,并在这条线上画出4个高约3毫米、宽约5毫米的长方形,如(9)所示,它们之间的距离大约相等;将另一个圆粘在上面;切断小矩形,并测试一下扎带是否能穿过小孔。
步骤三
在火箭顶部的降落伞弹射系统的空腔中,如(11)所示,在距离瓶子底部约50毫米处划出一个圆圈,并切开它,这就成了一个没有底部的瓶子。把用硬纸板做的支架放在这个瓶子里。支架在里面,在瓶子上标出一个矩形,覆盖支架的正面(支架的正面是我们为扎带打孔的那一面,或者是空间最大的那一面),这个矩形在每个水平端应该有20毫米的额外空间。现在取下纸板支架,用切割机切割矩形,如(12)、(13)和(14)所示,小心地将矩形从瓶子里切出来,因为这部分以后将用于固定里面的降落伞。然后在长方形的一端上开个洞,用橡皮筋穿过,如(15)所示,最后用胶带把长方形固定在瓶子的右边(就是把瓶子竖起来的时候),这样就可以当一个盖子了,如(16)所示。
步骤四
从背面看纸板支架,在右侧标记一个长方形,大约在中心位置标记伺服电机底部的尺寸,对于我们使用的那个电机(SG90),尺寸是22毫米高,12毫米宽,如(18)所示。现在切开这个长方形的小孔,插入电机。如(19)和(20)所示,用螺钉或热熔胶把电机固定在支架上。PS: 如果纸板有点薄,螺丝可能会不起作用,对螺丝用力过猛也会导致安装松动,在这种情况下,热胶更容易、更安全。在纸板支架的左侧,开一个小孔,让电机的电线通过,尽量靠右放,如(19)所示。
步骤五
接下来我们将要制作降落伞“弹簧”,并把它固定在纸板箱上。如(21)所示,从一个未使用的瓶子上剪下一个230毫米×96毫米的矩形(用卷尺测量)作为降落伞“弹簧”。在剪下来的正方形塑料片的每个短端,在离边界约10毫米处划一条线,将标记线与纸板支架两端的孔的边缘对齐(在纸板支架的背面),并在每个孔上做一个标记,如(22)所示。用切割器或电烙铁在每个标记的矩形上打一个孔。如(23)所示,用扎带将“弹簧”固定在纸板支架上。如(24)所示,必要时用钳子将扎带穿过(如果“弹簧”碍事,你也可以将它弯曲)。将纸板插入瓶中,使“弹簧”位于孔的一侧;为了把纸板支架推入,可能需要先把“弹簧”推到支架上,然后再把支架推到瓶子里面去;在电机的顶部画一个长方形,并把它剪下来,这个孔是橡皮筋穿过的地方,它将被连接到电机上,保持盖子关闭,降落伞被压缩在“弹簧”上。在下面GIF里,你可以看到如何将降落伞放入火箭内部。
步骤六 电子部分
电子装置主要由Arduino Nano、MPU6090加速器 陀螺仪、设置为3.3V的LM317稳压电路、一个充电宝、一个无线电模块NRF240L01 和一个伺服电机组成,下面的原理图rocket.pdf
显示了连接图。我们在电路板上为无线电模块放置了一些母头,并使用长的公头到母头的电缆连接它。
对于伺服电机,我们放了一些公头。稳压器用于为NRF24L01 提供电源,因为我们发现Arduino的3.3V输出不能提供足够的电压,程序有时会失败。你可以使用任何你想要的方法连接元件,但请记住纸板支架内的空间是有限的。要把电路板安装到纸板支架上,首先,把它从瓶子里拿出来(1),把电路板放在纸板支架的左侧上面,并在左上角和右下角做标记,如(2)所示。取出电路板,在每个角上标记并切出2个相距约10毫米的小矩形,如(3)所示。对于每一对孔,从纸板支架的背面把一条小线穿过孔(可能需要推动“弹簧”使线穿过),用线将线路板固定在纸板上,如图(4)。在最后一张图片上,我们展示了固定其中一个角的结果,电线的一端穿过纸板上的一个孔,然后我们扭动它,使它保持在原位。
步骤7
在电路板的顶部,如(5)所示,在纸板支架上标记并切割一个大约10 * 30毫米的矩形。将电源和无线电模块(NRF24L01 )的电缆穿过该孔。然后将电源线连接到充电宝,将NRF24L01 连接到电路板,如(6)和(7)所示。最后将元件固定在纸板上(8)。我们用胶带将无线电模块固定住,用双面胶带将充电宝固定住,并用胶带加固。请记住,为了使纸板支架适合于瓶内,它上面的元件不应越过圆圈的边界,所以要把所有东西放在圆圈内。在把纸板支架放进瓶子里之前,把程序
rocket.ino
上传到Arduino上,用下面的测试程序检查程序的运行情况。/*Requires the following libraries:
RF24 by TMRh20, Avamander
MPU6050 by Electronic Cats
Connections:
Shown in the schematic
*/
#include
#include "RF24.h"
// Radio Transmitter - NRF24L01
RF24 radio(7, 8); // using pin 7 for the CE pin, and pin 8 for the CSN pin
uint8_t rocketAddress[] = "ROCKT";
const int payloadSize = 12; // *
union{
struct {
int16_t acc[3];
int16_t gyr[3];
} raw;
char bytes[payloadSize];
} data;
// Sensor - Accelerometer and Gyroscope - MPU6050
#include "I2Cdev.h"
#include "MPU6050.h"
#include "Wire.h"
MPU6050 accelgyro;
#define THRESHOLD 1000
// Actuator - Servomotor
#include
Servo servo;
#define START_ANGLE 110
#define END_ANGLE 30
void setup() {
Serial.begin(115200);
Serial.println("Started");
// Configure Radio Transmitter - NRF24
if (!radio.begin()) {
Serial.println(F("Radio hardware not responding"));
while (1) {}; // hold in infinite loop
}
if (radio.isChipConnected()){
Serial.println("NRF24L01 connection successful");
}
else{
Serial.println("NRF24L01 connection failed");
while (1) {};
}
radio.setPALevel(RF24_PA_LOW);
radio.setAutoAck(false);
radio.setDataRate(RF24_250KBPS);
// This node sends data
radio.openWritingPipe(rocketAddress);
// Configure Sensor - Accelerometer and Gyroscope - MPU6050
Wire.begin();
accelgyro.initialize();
if(accelgyro.testConnection()){
Serial.println("MPU6050 connection successful");
}
else{
Serial.println("MPU6050 connection failed");
while (1) {};
}
// Configure Actuator - Servo
servo.attach(3);
servo.write(START_ANGLE);
// Wait for devices to be ready
delay(500);
}
void loop() {
// Get sensor data
accelgyro.getMotion6(