使用氣象氣球,您可以將 Arduino、相機、大蒜面包或其他任何您想要的東西送到三分之一的太空!盡管它是通往太空的三分之一,但幾乎 99% 的大氣層都不存在,所以我們稱之為“太空邊緣”。接下來,讓我們來看看如何做到這一點。
根據您的需求和技能水平,你可以在三條路徑中自行選擇。不過由于平流層中令人難以承受的風,這三種途徑都需要一些焊接技能。但并不是哪條路徑更好,只是都各具特色,它可能基于你更擅長或感興趣的部分。
路徑 1:使用原型板、各種傳感器創建一個簡單的數據記錄器,幾乎沒有焊接技能。
路徑 2:使用預先設計的 PCB 屏蔽(印刷電路板)來制作干凈漂亮的電路板,由我們設計和測試。
路徑 3:在程序中制作自己的 PCB。本文不會深入探討如何設計和制作自己的 PCB,但會介紹一些指導方針供您思考。
我們將詳細介紹每條路徑,但這里有一些提示可以幫助您選擇:
路徑 1 將是最簡單的,并且將允許一些靈活性。您可以選擇電路板上的傳感器、電路板和功能。您將需要一些焊接技能,以確保在飛行過程中一切都保持在一起。
路徑 2 將是最嚴格的,這意味著您將必須使用一組指定的傳感器,一個特定的 Arduino 板,但您將擁有一個看起來非常干凈的 PCB,不必擔心焊接或編碼,對于學習PCB來說,這是一個很好的開始。
路徑 3 將是最難的,需要很多技能。您將需要知道(或學習)如何制作自己的 PCB 或 Arduino PCB 屏蔽板,知道如何對整個事物進行編碼以及焊接電路板。如果您知道如何做所有這些事情,您可能可以自己做這個項目,但是本文可以幫助您解決一些非常重要的限制和細節。
但在我們開始之前,您需要牢記一些非常重要的規則。請務必閱讀這些規則,因為在氣象氣球中發送物品可能會受到您居住地的限制。本文不會詳細介紹如何選擇合適的氣球、建造有效載荷艙以及如何填充氣球,但是在網上有很多關于如何做到這一點的指南。以下是您需要牢記的事項:
1. 您的有效載荷艙不能有任何手機信號。如果您出于任何原因在飛機上攜帶手機,則它必須處于飛行模式。
2. 如果您使用 GPS 尋找氣球,您需要獲得 HAM 無線電許可證(需要測試和收費)。
3. 如果您的有效載荷的重量尺寸比超過 3.0 盎司/平方英寸,那么總有效載荷重量必須小于 4 磅。
4. 任何單獨的有效載荷/包裹必須小于 6 磅。
5. 如果您有兩個有效載荷,則總有效載荷重量必須小于 12 磅。
路徑 1 - 原型板
在開始設計之前,您需要牢記幾個注意事項。首先,你想要什么。在提供的示意圖中,您將擁有一個簡單的溫度和濕度傳感器、一個氣壓傳感器、一個 IMU 和一個 SD 卡模塊。對于大多數項目來說,這應該足夠了,但如果你想用你的 Arduino 找到你的有效載荷艙,你會想要包括一個 GPS 模塊。有幾種恢復選項:
1. SPOT GPS 模塊。這些都有其優點和缺點。這些將非常易于使用,范圍不受限制(它們使用衛星將坐標發送到您的手機),電池壽命長,而且很容易獲得。但是,它們價格昂貴,不能倒置工作,而且信號會被厚物體阻擋。
這是我們使用的方法,但我們為它設計并 3D 打印了一個云臺以使其保持直立。我們推薦SPOT 3 Satellite Messenger ,但這完全取決于您,只要您對此進行研究并了解不同類型的好處。
2. APRS 電臺。這將是最可靠的,你可以用它做很多事情。您可以將模塊連接到 Arduino 并讓無線電發回數據、坐標等。這也可以讓您獲得準確的高度測量。
但這不會包含在接線圖中,因此您必須學會自己接線。此外,您需要獲得 HAM 無線電許可證,您需要參加測試并支付少量費用。這個許可證非常有用,所以它可能是值得的。
3. 手機。我不建議使用這種方法。因為不僅需要想辦法在飛行后讓手機退出飛行模式,而且手機本身可能比普通 SPOT 更貴。之所以上榜,是因為很多人使用手機作為備份,但它確實不是你應該使用的東西。
到這想必你已經決定如何恢復您的有效載荷,您將想要了解飛行的樣子。例如,如果你想讓你的 Arduino 遠程部署降落傘,你應該想辦法做到這一點。你還應該檢查您將使用哪些傳感器(溫度可以降至 -40C (-40F),因此需要考慮這一點。
同時你還需要考慮如何為 Arduino 供電。低溫會降低許多電池的性能,因此您可能需要一個大電源,以及一個諸如聚苯乙烯泡沫塑料盒之類的外殼,以保持物品舒適,同時保持在重量限制之下。
我建議您根據您想要獲取的數據類型、您是否將在船上安裝相機以及您計劃在船上安裝什么來制作某種清單。制作有效載荷托架也是一個好主意,然后根據有效載荷設計數據記錄器。在實際設計之前,有很多事情需要考慮和確保,因此請確保您花很長時間仔細檢查所有內容。
好吧,如果你走第一條路經,這里是傳感器的示意圖和接線圖:
Mega 對于這些傳感器來說是超級大材小用,但如果你也想使用我們的代碼,你將不得不使用 Mega。如果您打算使用 Nano 之類的設備,請將 MicroSD 卡模塊的引腳分配更改為電路板的 SPI 引腳。
這是零件清單:
SparkFun ADXL337
頭針
微型 SD 卡模塊
DHT22 濕度傳感器
DS18B20 溫度傳感器
原型板
Arduino Mega
您可以添加另一個 DS18B20 來讀取內部溫度,并添加您想要的任何傳感器,但如果您想使用提供的代碼,請使用上面的接線圖。
//DHT22 Setup
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
//SD Card Setup
#include
#include
File sdcard_file;
int CS_pin = 10;
//DS18B20 Temperature sensor
#include
#include
#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int scale = 3; // 3 (±3g) for ADXL337, 200 (±200g) for ADXL377
boolean micro_is_5V = true; // Set to true if using a 5V microcontroller such as the Arduino Uno, false if using a 3.3V microcontroller, this affects the interpretation of the sensor data
void setup() {
Serial.begin(9600);
sensors.begin();
dht.begin();
pinMode(CS_pin, OUTPUT);//declaring CS pin as output pin
if (SD.begin()){
Serial.print("SD Card found!");
} else
{
Serial.print("Error finding SD Card");
return;
}
sdcard_file = SD.open("data.csv", FILE_WRITE);
if (sdcard_file) { //If the file is found
}
else {
Serial.print("error initializing SD card");
}
sdcard_file.print("DS18B20");
sdcard_file.print(",");
sdcard_file.print("DHT22 Temp");
sdcard_file.print(",");
sdcard_file.print("Hum");
sdcard_file.print(",");
sdcard_file.print("H.InX");
sdcard_file.print(",");
sdcard_file.print("rawX");
sdcard_file.print(",");
sdcard_file.print("rawY");
sdcard_file.print(",");
sdcard_file.print("rawZ");
sdcard_file.print(",");
sdcard_file.print("scaledX");
sdcard_file.print(",");
sdcard_file.print("scaledY");
sdcard_file.print(",");
sdcard_file.print("scaledZ");
sdcard_file.print(",");
sdcard_file.println(" ");
}
void loop() {
delay(222);
//Accelerometer
int rawX = analogRead(A0);
int rawY = analogRead(A1);
int rawZ = analogRead(A2);
float scaledX, scaledY, scaledZ;
if (micro_is_5V) //scaling data if voltage is 5V (it is)
{
scaledX = mapf(rawX, 0, 675, -scale, scale);
scaledY = mapf(rawY, 0, 675, -scale, scale);
scaledZ = mapf(rawZ, 0, 675, -scale, scale);
}
else //scaling data if voltage is 3.3V
{
scaledX = mapf(rawX, 0, 1023, -scale, scale);
scaledY = mapf(rawY, 0, 1023, -scale, scale);
scaledZ = mapf(rawZ, 0, 1023, -scale, scale);
}
//DS18B20 Temp
sensors.requestTemperatures();
int etemp=sensors.getTempCByIndex(0);
//DS18B20 Humidity Sensor
float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);
// Check if any reads failed and exit early for DHT
if (isnan(h) || isnan(t) || isnan(f)) {
return;
}
// Compute heat index in Fahrenheit (the default)
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false)
float hic = dht.computeHeatIndex(t, h, false);
sdcard_file.print(etemp);
sdcard_file.print(",");
sdcard_file.print(t);
sdcard_file.print(",");
sdcard_file.print(h);
sdcard_file.print(",");
sdcard_file.print(hic);
sdcard_file.print(",");
sdcard_file.print(rawX);
sdcard_file.print(",");
sdcard_file.print(rawY);
sdcard_file.print(",");
sdcard_file.print(rawZ);
sdcard_file.print(",");
sdcard_file.print(scaledX);
sdcard_file.print(",");
sdcard_file.print(scaledY);
sdcard_file.print(",");
sdcard_file.print(scaledZ);
sdcard_file.print(",");
sdcard_file.print(" ");
sdcard_file.println(" ");
sdcard_file.close();
delay(223);
}
float mapf(float x, float in_min, float in_max, float out_min, float out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
如果有任何問題,請務必檢查接線,并使用每個傳感器的代碼來隔離問題。確保您的 SD 或 MicroSD 卡已格式化為 FAT16 或 FAT32,并且為 16GB 或更少。
此外,最好連接 LED 以顯示數據記錄器的狀態指示。請避免在數據記錄器未運行的情況下發送氣球,因此請確保對所有內容進行三重檢查。
如果您一直遇到 SD 卡模塊問題,請嘗試更換電源。經過大量測試,我們發現有些模塊對電源非常敏感,所以要找一個可靠的電源。
到這一步數據記錄器已完成。它應該讀取溫度、濕度和加速度計數據,并將其記錄到 SD 卡上。如果您想要高度讀數,則必須使用 GPS。90% 的基于氣壓傳感器的高度計在 30, 000 英尺以外無法工作。如果您的氣球超過了這個閾值,您將無法使用氣壓計。
路徑 2 - 預先設計的 PCB
你正計劃使用預先設計的 PCB。這種預先設計的 PCB 可讓您獲得內部溫度、外部溫度、濕度和加速度計讀數。您將需要焊接技能,以及這些組件:
5050貼片LED
SparkFun ADXL337
很多頭針
微型 SD 卡模塊
DHT22 濕度傳感器
2X DS18B20 溫度傳感器
Arduino
PCB 的 Gerber 文件位于本文下方的 GitHub 存儲庫中。
我們在飛行中使用了這個PCB,所以我們做了很多測試,并且我們在飛行后做了改進,讓我們開始吧。
好的,讓我們開始下載 Gerber 文件。轉到GitHub 存儲庫,下載 ZIP 文件,然后復制并粘貼 Gerber Eclipse 文件。保持 gerber 壓縮文件的 ZIP 文件很重要,因為在線服務將它們作為 ZIP。
可以開始尋找 PCB 了。在搜索引擎中,查找 PCB 服務。
之后您已經選擇了一項服務,上傳壓縮的 gerber 文件,然后選擇以下設置:
單板
1.6mm厚
您想要的任何顏色
HASL(帶鉛)用于表面光潔度。如果您使用無鉛焊料,您可能需要更改此設置
1盎司銅重
生產檔案確認
全面測試飛針測試
無齒孔
你想要的任何數量
大多數這些設置都已經設置好了,所以你只需要改變顏色。
現在是組裝 PCB 的時候了。由于我們使用帶有分線板的傳感器,并且由于該 PCB 將充當屏蔽層,因此這將非常容易。下面為您提供焊接相關內容。
此外,將所有插頭引腳焊接到 PCB 的側面。這些將適合 Arduino Mega 的頂部,并會為您完成所有接線。
重要的是要知道這個 PCB 是如何工作的,這樣你就知道如果東西壞了如何修復它。在 PCB 內,有非常小的 0.35mm 導線穿過它。這些電線將從每個傳感器延伸到 PCB 中的某些插頭引腳,然后連接到 Arduino。這使得構建干凈,并且比傳統的原型板和面包板更可靠。
將 PCB 焊接起來,將其放在 Arduino Mega 上,然后將其插入計算機。打開Arduino IDE并打開包含在GitHub 存儲庫中的 1.6 代碼,您可以從中獲取 PCB 文件。
將 microSD 卡格式化為 FAT16 或 FAT32。microSD卡模塊需要16GB以下,否則無法使用。即使是 2GB 的 microSD 相機也足以滿足兩個小時的飛行。
現在將 SD 卡插入模塊,并上傳 1.6 代碼。在串行監視器中,您應該會收到 SD 卡工作的成功消息,并且應該立即開始數據記錄。
等待十秒鐘,然后取出 SD 卡并將其插入計算機。應該有一個包含所有數據的 .csv 文件!
這是 GitHub 存儲庫不起作用的代碼:
//DHT22 Setup
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
//SD Card Setup
#include
#include
File sdcard_file;
int CS_pin = 10;
//DS18B20 Temperature sensor
#include
#include
#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
//MPL3115A2 Altimeter Setup
#include
#include
Adafruit_MPL3115A2 baro = Adafruit_MPL3115A2();
int scale = 3;
boolean micro_is_5V = true;
//LED
int Blue = 7;
int Red = 6;
int Green = 5;
void setup() {
pinMode(23, INPUT); //detects if a switch is turned on to stop the sdcard writing and to save the data
sensors.begin();
pinMode(Blue, OUTPUT);
pinMode(Red, OUTPUT);
pinMode(Green, OUTPUT);
digitalWrite(Green, HIGH);
dht.begin();
pinMode(CS_pin, OUTPUT);//declaring CS pin as output pin
if (SD.begin()){
digitalWrite(Green, LOW);
digitalWrite(Green, HIGH);
digitalWrite(Green, LOW);
digitalWrite(Green, HIGH);
digitalWrite(Green, LOW);
digitalWrite(Green, HIGH);
} else
{
digitalWrite(Green, LOW);
digitalWrite(Red, HIGH);
delay(5000);
return;
}
sdcard_file = SD.open("data.csv", FILE_WRITE);
if (sdcard_file) { //If the file is found
digitalWrite(Red, LOW);
digitalWrite(Blue, LOW);
digitalWrite(Green, HIGH);
}
else {
digitalWrite(Green, LOW);
digitalWrite(Red, HIGH);
delay(1000);
digitalWrite(Red, LOW);
digitalWrite(Blue, HIGH);
delay(1000);
digitalWrite(Green, LOW);
digitalWrite(Red, HIGH);
delay(1000);
digitalWrite(Red, LOW);
digitalWrite(Blue, HIGH);
delay(1000);
digitalWrite(Red, HIGH);
digitalWrite(Blue, LOW);
}
sdcard_file.print(",");
sdcard_file.print("DS18B20");
sdcard_file.print(",");
sdcard_file.print("DHT22 Temp");
sdcard_file.print(",");
sdcard_file.print("Hum");
sdcard_file.print(",");
sdcard_file.print("H.InX");
sdcard_file.print(",");
sdcard_file.print("Int. Temp");
sdcard_file.print(",");
sdcard_file.print("Pres. Pasc.");
sdcard_file.print(",");
sdcard_file.print("alt.");
sdcard_file.print(",");
sdcard_file.print("rawX");
sdcard_file.print(",");
sdcard_file.print("rawY");
sdcard_file.print(",");
sdcard_file.print("rawZ");
sdcard_file.print(",");
sdcard_file.print("scaledX");
sdcard_file.print(",");
sdcard_file.print("scaledY");
sdcard_file.print(",");
sdcard_file.print("scaledZ");
}
void loop() {
delay(222);
digitalWrite(Green, LOW);
digitalWrite(Blue, HIGH);
if(! baro.begin()) {
}
float pascals = baro.getPressure();
float altm = baro.getAltitude();
float tempC = baro.getTemperature();
//Accelerometer
int rawX = analogRead(A0);
int rawY = analogRead(A1);
int rawZ = analogRead(A2);
float scaledX, scaledY, scaledZ;
if (micro_is_5V) //scaling data if voltage is 5V (it is)
{
scaledX = mapf(rawX, 0, 675, -scale, scale);
scaledY = mapf(rawY, 0, 675, -scale, scale);
scaledZ = mapf(rawZ, 0, 675, -scale, scale);
}
else //scaling data if voltage is 3.3V
{
scaledX = mapf(rawX, 0, 1023, -scale, scale);
scaledY = mapf(rawY, 0, 1023, -scale, scale);
scaledZ = mapf(rawZ, 0, 1023, -scale, scale);
}
//DS18B20 Temp
sensors.requestTemperatures();
//DS18B20 Humidity Sensor
float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);
// Check if any reads failed and exit early for DHT
if (isnan(h) || isnan(t) || isnan(f)) {
return;
}
// Compute heat index in Fahrenheit (the default)
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false)
float hic = dht.computeHeatIndex(t, h, false);
sdcard_file.println(sensors.getTempCByIndex(0));
sdcard_file.print(",");
sdcard_file.print(t);
sdcard_file.print(",");
sdcard_file.print(h);
sdcard_file.print(",");
sdcard_file.print(hic);
sdcard_file.print(",");
sdcard_file.print(tempC);
sdcard_file.print(",");
sdcard_file.print(pascals);
sdcard_file.print(",");
sdcard_file.print(altm);
sdcard_file.print(",");
sdcard_file.print(rawX);
sdcard_file.print(",");
sdcard_file.print(rawY);
sdcard_file.print(",");
sdcard_file.print(rawZ);
sdcard_file.print(",");
sdcard_file.print(scaledX);
sdcard_file.print(",");
sdcard_file.print(scaledY);
sdcard_file.print(",");
sdcard_file.print(scaledZ);
sdcard_file.print(",");
delay(223);
sdcard_file.close();
}
float mapf(float x, float in_min, float in_max, float out_min, float out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
你的數據記錄器已完成。它應該讀取溫度、濕度和加速度計數據,并將其記錄到 SD 卡上。如果您想要高度讀數,則必須使用 GPS。90% 的基于氣壓傳感器的高度計在 30, 000 英尺以外無法工作。如果您的氣球超過了這個閾值,您將無法使用氣壓計。
路徑 3 - 制作自己的 PCB
這一條路徑不會向您展示如何制作自己的 PCB。因此,在繼續之前,您應該知道如何制作 PCB,或者學習如何制作。這部分只會介紹一些基本準則。
首先,你必須集思廣益,寫下你想從這次飛行中得到的東西。
以下是標準包括的一些內容:
溫度
濕度
高度
空氣質量
輻射
全球定位系統
您可以包含任何您想要的內容,但請確保您查看了所有內容。溫度傳感器的讀數應能低至 -50C (-58F),并盡可能準確。由于來自太陽的太陽輻射,溫度讀數在非常高的溫度下會不準確,因此看起來會比實際溫度高一點!
另一個設計考慮因素是重量。如本文介紹中所述,根據有效負載類型,您的有效負載需要低于 12 磅、6 磅或 4 磅。此外,您將無法使用氣壓計來獲取高度讀數,因為它們中的大多數都超過了 30, 000 英尺。
最后的考慮是電源。平流層的溫度將變得非常低。電池會失效,你的 Arduino 也很有可能會失效。您將需要找到解決此問題的方法。可以說,最好的策略是將數據記錄器放在泡沫塑料盒中。這將保持室內溫度與室溫一樣高。您可能還需要考慮太陽能電池板或暖手器。
好的!到這你已經考慮了所有內容,仔細檢查了您想要的傳感器,并寫下了所有內容。是時候制作原理圖和PCB了。對于原理圖和 PCB,您可能想要像以前一樣制作 PCB 屏蔽,或者制作完整的 PCB。
構建 PCB/屏蔽后,仔細檢查一切以查看它是否有效,并確保您遵循指南。
到此你的數據記錄器已完成。它應該讀取溫度、濕度和加速度計數據,并將其記錄到 SD 卡上。如果您想要高度讀數,則必須使用 GPS。90% 的基于氣壓傳感器的高度計在 30, 000 英尺以外無法工作。如果您的氣球超過了這個閾值,您將無法使用氣壓計。
結論
氣象氣球是將東西送到平流層的一種非常酷且簡單的方式。您可以將相機(在我們的例子中是 360 度相機)發送到高海拔地區,獲得很棒的鏡頭和數據,而無需太多的規定。但有一件事!
請確保遵守所有規則,并在飛行前添加雷達偏轉器并提交航行通告(通知飛行員)。您的氣球有效載荷很有可能撞到飛機,您不想損壞或冒生命危險。盡你所能減少損壞的風險,確保一切都堅固,這樣你就不會掉落任何東西。
-
數據記錄器
+關注
關注
0文章
53瀏覽量
12680 -
Arduino
+關注
關注
187文章
6464瀏覽量
186671 -
ADXL335
+關注
關注
1文章
15瀏覽量
10505
發布評論請先 登錄
相關推薦
評論