步驟1:構(gòu)建發(fā)射器
小而光很漂亮。
由于發(fā)射器位于無線電控制的飛機上,我必須保持結(jié)構(gòu)光。我建議在焊接任何電線之前考慮容納盒的最終尺寸。
將調(diào)節(jié)器裝配在一塊帶有平滑電容器的小條板上。連接一對電線供電。如果您使用備用伺服連接作為電源添加一個沒有數(shù)據(jù)線的伺服插座。 NB檢查飛機的接收器是否能夠提供400-500mA。如果您使用的是Lipo平衡插頭,請?zhí)砑右欢螁涡薪宇^(0.1英寸間距),除去0和最大電壓引腳外。然后熱縮以密封。
。
使用合適的2-3S Lipo檢查調(diào)節(jié)器的輸出是明智的
NB 不要反向連接 到脂質(zhì)平衡插頭。您將 吹 調(diào)節(jié)器和壓力傳感器。如果這是一個問題,請使用與正極導(dǎo)聯(lián)串聯(lián)的1n4001二極管。
。
將組件連接到 8MHz 3v3 Pro Mini 按照圖表。保持引線短路并使用優(yōu)質(zhì)電線。
Arduino需要在復(fù)位按鈕的另一端有一個6針單極插頭引腳條。根據(jù)您的FTDI,您可能會發(fā)現(xiàn)90度插頭引腳是更好的選擇。
注意Arduino 6引腳端的標(biāo)記顏色,并與FTDI編程器匹配。我發(fā)現(xiàn)用Tippex標(biāo)記Arduino和編程器特別有用。
在導(dǎo)線離開pcb后,架空導(dǎo)線應(yīng)該 17.3 cm 。我將一個連接到RFM69CW的天線點,第二個連接到arduino上的零電壓點,用于接地RFM69CW。在將地面天線切割成長度之前,我從17.3cm處扣除了從RFM到arduino的地線長度。天線用一根90秒的araldite固定,以防止剪切。
Arduino引腳5和6的開關(guān)可以通過將2針插座焊接到電路板上來構(gòu)建。將單極頭中的兩個引腳焊接在一起,形成跳線連接。最好焊接一小段電線然后拆下并更新塑料連接器。 Araldite開關(guān)頂部的任何裸露金屬用于絕緣。刪除鏈接允許串行輸出。
或者 - 將單極頭的兩個引腳焊接到電路板上并使用0.1英寸跳線。
我使用過巴沙木和薄異氰酸酯膠的碎片制作一個盒子。我把3個組件與小巴沙跑者分開。壓力傳感器是光敏感的,所以我做了一個小托盤來遮擋它。我在外盒上切了一個圓孔直接在矩形傳感器上方,然后用一塊泡沫覆蓋。
切割通風(fēng)孔以確保空氣流通。一根天線導(dǎo)線和導(dǎo)線需要出口孔。我用碳棒固定托盤和調(diào)節(jié)器就位。
。
軟件和準(zhǔn)備
壓力傳感器需要針對壓力和溫度進行校準(zhǔn)。
由于海拔高度是海平面大氣壓力和未知海拔壓力的函數(shù),我們需要估算海平面氣壓。也是溫度的函數(shù),但我們可以留下這個因素o在合理的近似值下。
通過讀取已知高度的壓力 - 基準(zhǔn)水平,可以獲得對海平面氣壓的良好估計。在我的情況下kichen表。因此,查看房屋的高度并調(diào)整變送器的位置。在校準(zhǔn)期間,您還需要可靠的海平面大氣壓值。我使用了互聯(lián)網(wǎng)天氣網(wǎng)站的報告。
下載RFM69_transmitter3.zip 并在Arduino程序文件夾中安裝該文件夾。將RFM69庫文件夾移動到Arduino庫文件夾。
打開Arduino IDE(https://www.arduino.cc/en/Main/Software)
打開文件 RFM69_transmitter3
在工具中將電路板設(shè)置為Ardino Pro或Pro Mini。將處理器設(shè)置為ATmega328P(3.3V,8MHz)
不要使用Lipo為Arduino供電。
移除Arduino-recheck上的引腳5和6上的鏈接 你的 接線。我不負責(zé)!
將FTDI編程器的電壓設(shè)置為3v3。
將Arduino連接到FTDI編程器,檢查它是否正確定位。
使用USB線將FTDI編程器插入計算機。
等待計算機識別USB設(shè)備 - 使用工具端口選擇新獲得的com端口。
。
找到代碼中的審核和修訂部分:
// ________ Review and amend this section ______
// use your own 16 character encryption key!
#define ENCRYPTKEY “DRPattEncryptkey” // exactly the same 16 characters/bytes on all nodes!
#define SERIAL_BAUD 74880
#define DATA_SIZE 20
// set default base altitude
// kitchen table 51.3 m
// cadmac flying field 46-47 m
const float ALTBASIS = 51.3; // base altitude in m
// pressure correction
// Pa 4Pa per bit -512 to +508
const int pcorrection = -64;
// temperature coefficients
// unboxed
float mUB = 0.6;
float ccUB = 0.5;
float aUB = 0.001535;
float bUB = -0.05264;
float cUB = 0.666409;
float dUB = 0.575;
// boxed
float mB = 0.7;
float ccB = 0.30;
float aB = 0.00255;
float bB = -0.11437;
float cB = 1.722786;
float dB = -0.73676;
const boolean isBoxed = true;
const boolean Tcalibrate = false;
const boolean useBase = false;
// true: offset altitude by base height rather than calibrated base height
// false: use calibrated base as altitude offset
// _______________________________________________
。
壓力和溫度校正適用于我的傳感器。您需要更改這些:
將 ENCRYPTKEY 設(shè)置為您自己的16個字符
將 pcorrection 設(shè)置為0
SERIAL_BAUD 不應(yīng)超過74880
將 ALTBASIS 設(shè)置為當(dāng)前位置的海拔高度(小數(shù)點后1位)米)
將 Tcalibrate 設(shè)置為True以保持溫度不校準(zhǔn)
將 isBoxed 設(shè)置為false并期望校準(zhǔn)un-盒裝
。
獲取您所在位置的海平面大氣壓(以帕斯卡為單位)的準(zhǔn)確值。您還需要攝氏溫度。
現(xiàn)在選擇右箭頭上傳代碼!
完全打開串行監(jiān)視器并設(shè)置波特率到上面第2點中指定的 SERIAL_BAUD 。
在顯示器上關(guān)閉自動滾動。
步驟2:變送器校準(zhǔn)
1)壓力
我們使用當(dāng)?shù)氐膲毫秃9烙嫺叨鹊乃綁毫ΑMㄟ^減去基準(zhǔn)高度,我們獲得高于地平面的高度:
float myaltitude = altitude(currpress, seapress) - newbasealt; // get altitude above base
float altitude(float lpressure, float seapressure){
// h = 44330.77( 1 - (p/Po)^ 0.1902632 )
float alt = pow(lpressure / seapressure, 0.1902632);
alt = 44330.77 * (1 - alt);
return alt;
}
要獲得壓力,我們首先寫入傳感器的寄存器0x26:
void oneshotP(){ // Pressure
if(maxoversample){
IIC_Write(0x26, 0b00111001); // bits 3-5 control oversample
IIC_Write(0x26, 0b00111011); // bit 1 toggled- get immediate value
}else{
IIC_Write(0x26, 0b00110001);
IIC_Write(0x26, 0b00110011);
}
}
使用maxoversample true,我們得到最高的準(zhǔn)確度(和最慢的采樣率)。
現(xiàn)在等到STATUS寄存器標(biāo)志數(shù)據(jù)就緒:
if ((IIC_Read(STATUS) & 2) == 2){
float currpress = Baro_Read(); // read the pressure
oneshotP(); // request next reading float Baro_Read(){
//this function takes values from the read buffer and converts them to pressure units
IIC_ReadData(); //reads registers from the sensor
unsigned long m_pressure = IICdata[0];
unsigned long c_pressure = IICdata[1];
float l_pressure = (float)(IICdata[2]》》4)/4; //dividing by 4, since two lowest bits are fractional value
return((float)(m_pressure《《10 | c_pressure《《2)+l_pressure); //shifting 2 to the left to make room for LSB
}
大氣壓通常在天氣現(xiàn)場的海平面上報告。
www.xcweather.co.uk報告今天的壓力為1013mB。
www.wunderground.com報告(更準(zhǔn)確)1013.46 hPa
毫巴(mB)和HectoPascals(hPa)是等效單位。 1hPa = 100Pa
在我所在的位置,今天的壓力是101346帕斯卡。
室溫是23.2℃
。
串行監(jiān)視器連接到變送器顯示:
____________________________________________
初始化變送器
初始化傳感器
傳感器正常。
壓力校準(zhǔn)。..。..
OverSample On
基準(zhǔn)高度51.3 m
使用newbase = xy。 z從串口設(shè)置新的高度
壓力偏移0(每位4 Pa)
氣壓輸入,(高197低231)101326 Pa
溫度偏移(0)0.0000 C(每位0.0625 C)
海拔偏移0(每位1 m)
未校準(zhǔn)46.4 m
平均氣壓100771.3 Pa
海壓101386.4 Pa
(允許溫度)101365.51 Pa
傳感器功能的海拔高度51.3米
海拔高度51.56米
基準(zhǔn)溫度23.6°C
____________________________________________
報告的海平面氣壓為40 Pa比氣象站。對于這種傳感器,我們需要對變量pcorrection應(yīng)用一個小的負校正。 校正必須能被4整除。
我建議您在校準(zhǔn)傳感器之前應(yīng)用類似的正或負校正。
注意未校準(zhǔn)海拔高度值非常好。這是因為今天的壓力接近傳感器在高度計算中使用的大氣壓力默認值(101326Pa)。另一天,內(nèi)部傳感器的高度值將會很好。
出于這個原因,我們用校準(zhǔn)的傳感器建立海平面壓力,然后根據(jù)當(dāng)?shù)貕毫?zhí)行我們自己的高度計算。
。
2)溫度
這有點問題!
根據(jù)制造商的網(wǎng)站,溫度傳感器是從來沒有打算提供環(huán)境溫度值。顯然它提供了“傳感器芯片”的溫度。
由于芯片溫度必須受到大氣溫度的影響,我們應(yīng)該能夠校準(zhǔn)溫度數(shù)據(jù)以提取環(huán)境值。
在建立始終高于環(huán)境溫度的溫度值之前,傳感器似乎在最初的17分鐘內(nèi)自熱。這種加熱必須影響返回壓力值的內(nèi)部溫度補償。我相信這是靜止的MPL3115A2傳感器觀察到的壓力漂移的原因。我們沒有固定這種內(nèi)部校正的方法,但我們可以校準(zhǔn)大氣溫度。
準(zhǔn)備一張時間和溫度表:
時間。. |溫度
0.000 |
13/60 |
1.000 |
2.000 |
。.最多17分鐘。
零時的溫度
變送器以這種格式報告:
D》將是基準(zhǔn)溫度和13秒時報告的第一個值。
P:0.0,0.0,25.0 C(Presure 100767.75 Pa)0:13
D》 P:當(dāng)前海拔高度,最高海拔高度,當(dāng)前溫度(當(dāng)?shù)貕毫Γ┓昼姡好?/p>
讓變送器冷卻。耐心點。模具似乎保持熱量并會影響初始啟動溫度。
。
記錄當(dāng)前的室溫,最好是小數(shù)點后1位。
使用 Serial Inhibit 鏈接將變送器插入PC。
記錄溫度。打開電子表格 calibrateTemp.xlsx
在單元格F3中輸入室溫,在B3到B21中輸入溫度數(shù)據(jù)
。
電子表格將產(chǎn)生溫度校正參數(shù)。
在第一分鐘,我進行了線性校正:
更正= mUB *時間+ ccUB
剩余時間:
更正= aUB *時間^ 3 + bUB *時間^ 2 + cUB *時間+ dUB
。
使用電子表格值編輯RFM69_transmitter3草圖中的溫度系數(shù)
修改未裝箱的部分中的溫度修正值。
上傳修改后的程序。
。
裝箱發(fā)射器
讓它冷卻然后重復(fù)校準(zhǔn)過程。如果這有問題等到你構(gòu)建了接收器并無線校準(zhǔn)。
編輯草圖。
。. isBoxed = true;
。. Tcalibrate = false;
上傳草圖
插入無序列鏈接
Rebox
步驟3:構(gòu)建接收器
如果像我一樣,你想要將接收器維可牢尼龍搭扣安裝在RC發(fā)射器的頂部,你必須要小心思考。
我使用的是一個175 x 50 x 25 mm腹肌盒,與Tardis不同,它的尺寸較小內(nèi)部。
計劃如何在連接之前將所有組件放在適當(dāng)?shù)奈恢谩?/p>
該框?qū)?/p>
Arduino Pro mini 5V0 16 Mhz
電源充電插座
穩(wěn)壓器
2開關(guān)
3 LED
Oled screen
433Mhz收發(fā)器
外部雙極天線
。
我為所有人安排了從盒子上掛下的組件,在盒子的內(nèi)側(cè)底座上用尼龍搭扣防止移動。
the scre en配有4個小型12BA螺栓 - 注意! oled中的安裝孔靠近屏幕。不要試圖使用更大的螺栓。我在內(nèi)部使用堅果作為空間,然后使用額外的堅果來保護。在將屏幕連接到電線之前,標(biāo)記并切割oled屏幕的孔。檢查螺栓位置。鉆孔,將螺栓切成一定長度并固定墊片螺母。
RFM可以與天線頂部成一定角度安裝。我用了兩個短的12BA螺栓和螺母。這樣可以節(jié)省大量空間。
您可能還需要為其他組件鉆蓋子的其余部分。我的盒蓋有一個內(nèi)唇。我將幾個部分切開以擠壓組件。
。
將調(diào)節(jié)器安裝在一小塊條形板上。測試輸出。
按照圖表連接組件。 arduino上的引腳11和13各需要2根電線。
使用質(zhì)量好的短線電線。
將LED添加到arduino中記住使用串聯(lián)電阻。
充電點必須小心連接。 開關(guān)端子用于向arduino電路提供0V電壓。
。
在供應(yīng)之前,脂肪供應(yīng)通過SW1。監(jiān)管機構(gòu)和Arduino。 arduino使用Raw終端從完整的Lipo電壓供電。
RFM由Arduino 5V供電。
oled屏幕需要3V3
注意,開關(guān)電源線上有2個匹配的100K電阻。它們連接到A0以監(jiān)控Lipo電壓。不要讓Lipo電壓降至每個電池3.88V以下(總共7.76V)。 充電時必須關(guān)閉電源開關(guān)。
添加17.3厘米雙極天線,添加一滴Araldite來支撐它們。
我連接了穩(wěn)壓器最后并重新檢查電路(再次。..。..)
關(guān)閉。連接lipo。
步驟4:測試接收器
上傳軟件包RFM69_Receiver。壓縮。
將RFM69_Receiver文件夾添加到Arduino程序文件夾中。將兩個封閉的庫移動到Arduino庫區(qū)域。
打開Arduino IDE。
打開文件RFM69_Receiver。
在工具中將電路板設(shè)置為Ardino Pro或Pro Mini。將處理器設(shè)置為ATmega328P(5V,16MHz)
確保電路已關(guān)閉。將串行開關(guān)設(shè)置為關(guān)閉(關(guān)閉=未連接到0v =串行開啟!)
。
重新檢查接線。我不負責(zé)!
。
將FTDI編程器的電壓設(shè)置為5V。將Arduino連接到FTDI編程器,檢查它是否正確定向。使用USB線將FTDI編程器插入計算機。等待計算機識別USB設(shè)備 - 使用工具端口選擇新獲得的com端口。
上傳RFM69_Receiver程序。
經(jīng)過短暫的延遲后,oled屏幕將顯示00:00后跟一個電壓 - 因為我們在USB引線上它反映了USB電壓 - 如果此時聲明低電量,則改變float vok(布爾顯示)功能中的以下行:
void IIC_ReadData(){ //Read Altitude/Barometer and Temperature data (5 bytes)
//This is faster than reading individual register, as the sensor automatically
//increments the register address, so we just keep reading.。.
byte i=0;
Wire.beginTransmission(SENSORADDRESS);
Wire.write(0x01); // Address of CTRL_REG1
Wire.endTransmission(false);
Wire.requestFrom(SENSORADDRESS,5); //read 5 bytes: 3 for altitude or pressure, 2 for temperature
while(Wire.available()) IICdata[i++] = Wire.read();
}
to:
if ((V 》4.4) && (V 《 7.77)){ // 7.77 for 2 cells
。
隨后出現(xiàn)一個屏幕徽標(biāo) - 可以在HT_SSD1306庫中修改logo.h。
顯示屏現(xiàn)在將顯示“Awaiting Ak”
打開發(fā)射機電源。
大約13秒后顯示屏將會清除。
增加時間將顯示在第一行。這是為了顯示發(fā)射器以及RC平面已經(jīng)通電多長時間。
低于此目前的海拔高度,最高海拔和溫度。
期望看到變化海拔幾米。我把它歸結(jié)為內(nèi)部溫度補償。
嘗試升高發(fā)射器并檢查接收器的高度增加。
綠色指示燈將在收到數(shù)據(jù)時顯示。
。
設(shè)置高度警告
紅色高度警告指示在void printData中設(shè)置(字符串S,int字體):
if ((V 》5.1) && (V 《 7.77)){ // 7.77 for 2 cells
將 121.9 (400英尺)更改為任何首選值。
。
確認測量的Lipo電壓
使用儀表測量內(nèi)部脂質(zhì)的電壓。
比較反對開始時顯示的電壓。如果不準(zhǔn)確,則修改函數(shù)vok中的常量 0.0096997 (布爾顯示):
if(T.toFloat() 》 121.9) digitalWrite(7, HIGH); else digitalWrite(7, LOW);
因為我們在兩個分壓電阻器(R1連接)上應(yīng)用了lipo對于脂質(zhì)陽性且R2連接到脂質(zhì)陰性),由A0讀取的中點電壓由下式給出:
V Lipo = A0 * v參考*(R1 + R2)/(R2 * 1024)
如果R1 = R2 = 100K且vReference = 5
v Lipo = A0 * 0.009765625
正如您所見,我不得不賠償測量值。
。
使用脂質(zhì)充電器檢查充電電路
充電期間請勿打開電池
。
最終裝配
如果一切正常,則組件,注意不要破壞任何電線。如果沒有。.再次檢查電路!
。
我建議使用兩根塑料吸管作為空中保護器 -
將12mm的切口放入一根稻草的末端,將它推入另一根稻草。
切開2個相距約15mm的小孔,小心地將電線以相反的方向推入吸管。
使用Blenderm膠帶將吸管固定在蓋子上。
。
屏幕確實需要屏蔽太陽。我制作了一個薄的鍍錫板護罩并用膠水和攪拌器膠帶將其固定。
將尼龍搭扣添加到接收器底座和RC發(fā)射器上,以便攜帶接收器。
。
為飛行場做好準(zhǔn)備
目前,發(fā)射器正在使用PC桌的默認基準(zhǔn)高度。
刪除發(fā)射器中的No Serial跳線并將其連接到PC。
將Arduino IDE重置為Arduino Pro Mini 3V3 8Mhz并打開串行監(jiān)視器。
以米為單位查找高度為你的領(lǐng)域。
鍵入:newbase = xxx.x(例如 newbase = 123.4 )進入監(jiān)視器并選擇發(fā)送
NB 1小數(shù)位并在米
此值存儲在Eeprom中。它會覆蓋默認的基準(zhǔn)高度,可以重寫用于其他網(wǎng)站。
替換無串行鏈接并重新開箱。
。
安全
433Mhz遠離2.4Ghz電磁頻譜中的35Mhz。
在測試飛行前,我用兩種RC發(fā)射器類型(在不同的平面上)進行了測距。
做同樣的事情是明智的。
。
在現(xiàn)場
為RC發(fā)射器供電
關(guān)閉433Mhz接收器上的串行輸出
為433Mhz接收器供電
為飛機供電
將433Mhz變送器連接到飛機上的脂/備用伺服器 - 觀察極性!
等待13秒進行433Mhz握手
-
發(fā)射器
+關(guān)注
關(guān)注
6文章
849瀏覽量
53485 -
Arduino
+關(guān)注
關(guān)注
188文章
6470瀏覽量
187179
發(fā)布評論請先 登錄
相關(guān)推薦
評論