做一個可實現(xiàn)軟著陸的“火箭”?,逐夢太空!
時間:2021-09-06 15:20:10
手機看文章
掃描二維碼
隨時隨地手機看文章
[導讀]大家好,我是張巧龍,今天給大家?guī)硪粋€自制的“火箭”項目。在這個項目中,我們將建造一個帶有自動降落傘彈射機制的水火箭,以及一個數(shù)據(jù)傳輸系統(tǒng),這樣我們就可以監(jiān)測火箭在空中時候的方向(根據(jù)加速度計和陀螺儀數(shù)據(jù)估計)。水火箭是一種模型火箭,它使用壓力室(通常是一個PET瓶,也就是碳酸飲...
大家好,我是張巧龍,今天給大家?guī)硪粋€自制的“火箭”項目。在這個項目中,我們將建造一個帶有自動降落傘彈射機制的水火箭,以及一個數(shù)據(jù)傳輸系統(tǒng),這樣我們就可以監(jiān)測火箭在空中時候的方向(根據(jù)加速度計和陀螺儀數(shù)據(jù)估計)。
水火箭是一種模型火箭,它使用壓力室(通常是一個PET瓶,也就是碳酸飲料瓶)內(nèi)的水和壓縮空氣作為推力發(fā)動機。火箭的運行可以用牛頓第三定律來解釋,壓縮室中的水被壓縮空氣拋出,因為它試圖釋放壓力釋放積累的勢能,所以在相反的方向會產(chǎn)生一個推動火箭的力。
▲? 效果演示
切開大的長方形,在中間切線,切成兩個大小相同的長方形,如(6)所示;對于每一個長方形紙板,通過標記線切割紙板的頂層,以便我們可以折疊它們;在其中一個圓圈的標記線上涂上熱熔膠,并將其中一個折疊的長方形紙板粘起來,然后將另一個長方形紙板粘在前一個長方形紙板的后面以加固它;我們需要為扎帶開孔,所以在距離長方形兩端約15毫米處標出一條線,并在這條線上畫出4個高約3毫米、寬約5毫米的長方形,如(9)所示,它們之間的距離大約相等;將另一個圓粘在上面;切斷小矩形,并測試一下扎帶是否能穿過小孔。
把用硬紙板做的支架放在這個瓶子里。支架在里面,在瓶子上標出一個矩形,覆蓋支架的正面(支架的正面是我們?yōu)樵鷰Т蚩椎哪且幻?,或者是空間最大的那一面),這個矩形在每個水平端應該有20毫米的額外空間。現(xiàn)在取下紙板支架,用切割機切割矩形,如(12)、(13)和(14)所示,小心地將矩形從瓶子里切出來,因為這部分以后將用于固定里面的降落傘。然后在長方形的一端上開個洞,用橡皮筋穿過,如(15)所示,最后用膠帶把長方形固定在瓶子的右邊(就是把瓶子豎起來的時候),這樣就可以當一個蓋子了,如(16)所示。
現(xiàn)在切開這個長方形的小孔,插入電機。如(19)和(20)所示,用螺釘或熱熔膠把電機固定在支架上。PS: 如果紙板有點薄,螺絲可能會不起作用,對螺絲用力過猛也會導致安裝松動,在這種情況下,熱膠更容易、更安全。在紙板支架的左側,開一個小孔,讓電機的電線通過,盡量靠右放,如(19)所示。
如(21)所示,從一個未使用的瓶子上剪下一個230毫米×96毫米的矩形(用卷尺測量)作為降落傘“彈簧”。在剪下來的正方形塑料片的每個短端,在離邊界約10毫米處劃一條線,將標記線與紙板支架兩端的孔的邊緣對齊(在紙板支架的背面),并在每個孔上做一個標記,如(22)所示。用切割器或電烙鐵在每個標記的矩形上打一個孔。如(23)所示,用扎帶將“彈簧”固定在紙板支架上。如(24)所示,必要時用鉗子將扎帶穿過(如果“彈簧”礙事,你也可以將它彎曲)。將紙板插入瓶中,使“彈簧”位于孔的一側;為了把紙板支架推入,可能需要先把“彈簧”推到支架上,然后再把支架推到瓶子里面去;在電機的頂部畫一個長方形,并把它剪下來,這個孔是橡皮筋穿過的地方,它將被連接到電機上,保持蓋子關閉,降落傘被壓縮在“彈簧”上。在下面GIF里,你可以看到如何將降落傘放入火箭內(nèi)部。
我們在電路板上為無線電模塊放置了一些母頭,并使用長的公頭到母頭的電纜連接它。
對于伺服電機,我們放了一些公頭。穩(wěn)壓器用于為NRF24L01 提供電源,因為我們發(fā)現(xiàn)Arduino的3.3V輸出不能提供足夠的電壓,程序有時會失敗。你可以使用任何你想要的方法連接元件,但請記住紙板支架內(nèi)的空間是有限的。要把電路板安裝到紙板支架上,首先,把它從瓶子里拿出來(1),把電路板放在紙板支架的左側上面,并在左上角和右下角做標記,如(2)所示。取出電路板,在每個角上標記并切出2個相距約10毫米的小矩形,如(3)所示。對于每一對孔,從紙板支架的背面把一條小線穿過孔(可能需要推動“彈簧”使線穿過),用線將線路板固定在紙板上,如圖(4)。在最后一張圖片上,我們展示了固定其中一個角的結果,電線的一端穿過紙板上的一個孔,然后我們扭動它,使它保持在原位。
然后將電源線連接到充電寶,將NRF24L01 連接到電路板,如(6)和(7)所示。最后將元件固定在紙板上(8)。我們用膠帶將無線電模塊固定住,用雙面膠帶將充電寶固定住,并用膠帶加固。請記住,為了使紙板支架適合于瓶內(nèi),它上面的元件不應越過圓圈的邊界,所以要把所有東西放在圓圈內(nèi)。在把紙板支架放進瓶子里之前,把程序
??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瓶,也就是碳酸飲料瓶)內(nèi)的水和壓縮空氣作為推力發(fā)動機。火箭的運行可以用牛頓第三定律來解釋,壓縮室中的水被壓縮空氣拋出,因為它試圖釋放壓力釋放積累的勢能,所以在相反的方向會產(chǎn)生一個推動火箭的力。
▲? 效果演示
冷知識:
PET:Polyethylene Terephthalate(聚對苯二甲酸乙二醇酯)礦泉水瓶用的塑料就是聚對苯二甲酸乙二醇酯,翻轉礦泉水的瓶子,可以看見下面有個小小的符號,三角形中寫了數(shù)字“1”,這是最常見的塑料材質之一,絕大多數(shù)的礦泉水、飲料瓶采用這種材料。具質輕、透明度高、耐沖擊不易碎裂等特性;耐熱至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電壓調節(jié)器(我們使用LM317可調電壓調節(jié)器)如果使用LM317的電壓調節(jié)器電路,則還需要:
- 1x 電阻器(390歐姆)
- 1x 電阻器(240歐姆)
- 1x 伺服電機 (我們使用的是普通的SG90)
- 2x NRF24L01 模塊
- 1x 電池,為電路板供電(我們使用了一個充電寶)。將充電寶連接到電路板需要:
- 1x USB-A連接器
- 母頭和公頭
- 膠帶
- 雙面膠帶
- 熱熔膠
工具
- 熱熔膠槍
- 剪刀
- 記號筆
- 電烙鐵
- 鑷子
- 測量帶
- 訂書機
- 水火箭發(fā)射器(我們在這個說明中沒有解釋如何制作火箭發(fā)射器,但你可以查看這篇水火箭的文章,自己制作一個http://aircommandrockets.com/rocket_launcher.htm)
步驟一:降落傘制作
計算瓶子的半徑
如(1)所示,測量周長,然后應用公式r=c/(2*pi)
來計算半徑,在我們的例子中,半徑是60毫米。根據(jù)這些信息,在紙板上標出2個半徑為瓶子半徑減去1毫米的圓(在我們的例子中是59毫米),并將其剪下,如(2)和(3)所示。對每個圓,按(4)所示畫線。為此,我們首先畫出一條穿過圓心的線,這條線將被稱為線1;在線1的一端測量40毫米,然后畫一條與圓的邊界相接觸的垂直線,這條線將被稱為線2;在線1的另一端測量20毫米,畫一個點;現(xiàn)在在該點和線2的兩端之間各畫一條虛線,這條虛線的長度記為L。步驟二
根據(jù)上述測量值(L),在紙板上畫一個高110毫米,寬(L)×4毫米的長方形,每隔(L)毫米劃一條垂直線(5);切開大的長方形,在中間切線,切成兩個大小相同的長方形,如(6)所示;對于每一個長方形紙板,通過標記線切割紙板的頂層,以便我們可以折疊它們;在其中一個圓圈的標記線上涂上熱熔膠,并將其中一個折疊的長方形紙板粘起來,然后將另一個長方形紙板粘在前一個長方形紙板的后面以加固它;我們需要為扎帶開孔,所以在距離長方形兩端約15毫米處標出一條線,并在這條線上畫出4個高約3毫米、寬約5毫米的長方形,如(9)所示,它們之間的距離大約相等;將另一個圓粘在上面;切斷小矩形,并測試一下扎帶是否能穿過小孔。
步驟三
在火箭頂部的降落傘彈射系統(tǒng)的空腔中,如(11)所示,在距離瓶子底部約50毫米處劃出一個圓圈,并切開它,這就成了一個沒有底部的瓶子。把用硬紙板做的支架放在這個瓶子里。支架在里面,在瓶子上標出一個矩形,覆蓋支架的正面(支架的正面是我們?yōu)樵鷰Т蚩椎哪且幻?,或者是空間最大的那一面),這個矩形在每個水平端應該有20毫米的額外空間。現(xiàn)在取下紙板支架,用切割機切割矩形,如(12)、(13)和(14)所示,小心地將矩形從瓶子里切出來,因為這部分以后將用于固定里面的降落傘。然后在長方形的一端上開個洞,用橡皮筋穿過,如(15)所示,最后用膠帶把長方形固定在瓶子的右邊(就是把瓶子豎起來的時候),這樣就可以當一個蓋子了,如(16)所示。
步驟四
從背面看紙板支架,在右側標記一個長方形,大約在中心位置標記伺服電機底部的尺寸,對于我們使用的那個電機(SG90),尺寸是22毫米高,12毫米寬,如(18)所示。現(xiàn)在切開這個長方形的小孔,插入電機。如(19)和(20)所示,用螺釘或熱熔膠把電機固定在支架上。PS: 如果紙板有點薄,螺絲可能會不起作用,對螺絲用力過猛也會導致安裝松動,在這種情況下,熱膠更容易、更安全。在紙板支架的左側,開一個小孔,讓電機的電線通過,盡量靠右放,如(19)所示。
步驟五
接下來我們將要制作降落傘“彈簧”,并把它固定在紙板箱上。如(21)所示,從一個未使用的瓶子上剪下一個230毫米×96毫米的矩形(用卷尺測量)作為降落傘“彈簧”。在剪下來的正方形塑料片的每個短端,在離邊界約10毫米處劃一條線,將標記線與紙板支架兩端的孔的邊緣對齊(在紙板支架的背面),并在每個孔上做一個標記,如(22)所示。用切割器或電烙鐵在每個標記的矩形上打一個孔。如(23)所示,用扎帶將“彈簧”固定在紙板支架上。如(24)所示,必要時用鉗子將扎帶穿過(如果“彈簧”礙事,你也可以將它彎曲)。將紙板插入瓶中,使“彈簧”位于孔的一側;為了把紙板支架推入,可能需要先把“彈簧”推到支架上,然后再把支架推到瓶子里面去;在電機的頂部畫一個長方形,并把它剪下來,這個孔是橡皮筋穿過的地方,它將被連接到電機上,保持蓋子關閉,降落傘被壓縮在“彈簧”上。在下面GIF里,你可以看到如何將降落傘放入火箭內(nèi)部。
步驟六 電子部分
電子裝置主要由Arduino Nano、MPU6090加速器 陀螺儀、設置為3.3V的LM317穩(wěn)壓電路、一個充電寶、一個無線電模塊NRF240L01 和一個伺服電機組成,下面的原理圖rocket.pdf
顯示了連接圖。我們在電路板上為無線電模塊放置了一些母頭,并使用長的公頭到母頭的電纜連接它。
對于伺服電機,我們放了一些公頭。穩(wěn)壓器用于為NRF24L01 提供電源,因為我們發(fā)現(xiàn)Arduino的3.3V輸出不能提供足夠的電壓,程序有時會失敗。你可以使用任何你想要的方法連接元件,但請記住紙板支架內(nèi)的空間是有限的。要把電路板安裝到紙板支架上,首先,把它從瓶子里拿出來(1),把電路板放在紙板支架的左側上面,并在左上角和右下角做標記,如(2)所示。取出電路板,在每個角上標記并切出2個相距約10毫米的小矩形,如(3)所示。對于每一對孔,從紙板支架的背面把一條小線穿過孔(可能需要推動“彈簧”使線穿過),用線將線路板固定在紙板上,如圖(4)。在最后一張圖片上,我們展示了固定其中一個角的結果,電線的一端穿過紙板上的一個孔,然后我們扭動它,使它保持在原位。
步驟7
在電路板的頂部,如(5)所示,在紙板支架上標記并切割一個大約10 * 30毫米的矩形。將電源和無線電模塊(NRF24L01 )的電纜穿過該孔。然后將電源線連接到充電寶,將NRF24L01 連接到電路板,如(6)和(7)所示。最后將元件固定在紙板上(8)。我們用膠帶將無線電模塊固定住,用雙面膠帶將充電寶固定住,并用膠帶加固。請記住,為了使紙板支架適合于瓶內(nèi),它上面的元件不應越過圓圈的邊界,所以要把所有東西放在圓圈內(nèi)。在把紙板支架放進瓶子里之前,把程序
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(