步驟1:構建發射器
小而光很漂亮。
由于發射器位于無線電控制的飛機上,我必須保持結構光。我建議在焊接任何電線之前考慮容納盒的最終尺寸。
將調節器裝配在一塊帶有平滑電容器的小條板上。連接一對電線供電。如果您使用備用伺服連接作為電源添加一個沒有數據線的伺服插座。 NB檢查飛機的接收器是否能夠提供400-500mA。如果您使用的是Lipo平衡插頭,請添加一段單行接頭(0.1英寸間距),除去0和最大電壓引腳外。然后熱縮以密封。
。
使用合適的2-3S Lipo檢查調節器的輸出是明智的
NB 不要反向連接 到脂質平衡插頭。您將 吹 調節器和壓力傳感器。如果這是一個問題,請使用與正極導聯串聯的1n4001二極管。
。
將組件連接到 8MHz 3v3 Pro Mini 按照圖表。保持引線短路并使用優質電線。
Arduino需要在復位按鈕的另一端有一個6針單極插頭引腳條。根據您的FTDI,您可能會發現90度插頭引腳是更好的選擇。
注意Arduino 6引腳端的標記顏色,并與FTDI編程器匹配。我發現用Tippex標記Arduino和編程器特別有用。
在導線離開pcb后,架空導線應該 17.3 cm 。我將一個連接到RFM69CW的天線點,第二個連接到arduino上的零電壓點,用于接地RFM69CW。在將地面天線切割成長度之前,我從17.3cm處扣除了從RFM到arduino的地線長度。天線用一根90秒的araldite固定,以防止剪切。
Arduino引腳5和6的開關可以通過將2針插座焊接到電路板上來構建。將單極頭中的兩個引腳焊接在一起,形成跳線連接。最好焊接一小段電線然后拆下并更新塑料連接器。 Araldite開關頂部的任何裸露金屬用于絕緣。刪除鏈接允許串行輸出。
或者 - 將單極頭的兩個引腳焊接到電路板上并使用0.1英寸跳線。
我使用過巴沙木和薄異氰酸酯膠的碎片制作一個盒子。我把3個組件與小巴沙跑者分開。壓力傳感器是光敏感的,所以我做了一個小托盤來遮擋它。我在外盒上切了一個圓孔直接在矩形傳感器上方,然后用一塊泡沫覆蓋。
切割通風孔以確保空氣流通。一根天線導線和導線需要出口孔。我用碳棒固定托盤和調節器就位。
。
軟件和準備
壓力傳感器需要針對壓力和溫度進行校準。
由于海拔高度是海平面大氣壓力和未知海拔壓力的函數,我們需要估算海平面氣壓。也是溫度的函數,但我們可以留下這個因素o在合理的近似值下。
通過讀取已知高度的壓力 - 基準水平,可以獲得對海平面氣壓的良好估計。在我的情況下kichen表。因此,查看房屋的高度并調整變送器的位置。在校準期間,您還需要可靠的海平面大氣壓值。我使用了互聯網天氣網站的報告。
下載RFM69_transmitter3.zip 并在Arduino程序文件夾中安裝該文件夾。將RFM69庫文件夾移動到Arduino庫文件夾。
打開Arduino IDE(https://www.arduino.cc/en/Main/Software)
打開文件 RFM69_transmitter3
在工具中將電路板設置為Ardino Pro或Pro Mini。將處理器設置為ATmega328P(3.3V,8MHz)
不要使用Lipo為Arduino供電。
移除Arduino-recheck上的引腳5和6上的鏈接 你的 接線。我不負責!
將FTDI編程器的電壓設置為3v3。
將Arduino連接到FTDI編程器,檢查它是否正確定位。
使用USB線將FTDI編程器插入計算機。
等待計算機識別USB設備 - 使用工具端口選擇新獲得的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 設置為您自己的16個字符
將 pcorrection 設置為0
SERIAL_BAUD 不應超過74880
將 ALTBASIS 設置為當前位置的海拔高度(小數點后1位)米)
將 Tcalibrate 設置為True以保持溫度不校準
將 isBoxed 設置為false并期望校準un-盒裝
。
獲取您所在位置的海平面大氣壓(以帕斯卡為單位)的準確值。您還需要攝氏溫度。
現在選擇右箭頭上傳代碼!
完全打開串行監視器并設置波特率到上面第2點中指定的 SERIAL_BAUD 。
在顯示器上關閉自動滾動。
步驟2:變送器校準
1)壓力
我們使用當地的壓力和海估計高度的水平壓力。通過減去基準高度,我們獲得高于地平面的高度:
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,我們得到最高的準確度(和最慢的采樣率)。
現在等到STATUS寄存器標志數據就緒:
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
}
大氣壓通常在天氣現場的海平面上報告。
www.xcweather.co.uk報告今天的壓力為1013mB。
www.wunderground.com報告(更準確)1013.46 hPa
毫巴(mB)和HectoPascals(hPa)是等效單位。 1hPa = 100Pa
在我所在的位置,今天的壓力是101346帕斯卡。
室溫是23.2℃
。
串行監視器連接到變送器顯示:
____________________________________________
初始化變送器
初始化傳感器
傳感器正常。
壓力校準。..。..
OverSample On
基準高度51.3 m
使用newbase = xy。 z從串口設置新的高度
壓力偏移0(每位4 Pa)
氣壓輸入,(高197低231)101326 Pa
溫度偏移(0)0.0000 C(每位0.0625 C)
海拔偏移0(每位1 m)
未校準46.4 m
平均氣壓100771.3 Pa
海壓101386.4 Pa
(允許溫度)101365.51 Pa
傳感器功能的海拔高度51.3米
海拔高度51.56米
基準溫度23.6°C
____________________________________________
報告的海平面氣壓為40 Pa比氣象站。對于這種傳感器,我們需要對變量pcorrection應用一個小的負校正。 校正必須能被4整除。
我建議您在校準傳感器之前應用類似的正或負校正。
注意未校準海拔高度值非常好。這是因為今天的壓力接近傳感器在高度計算中使用的大氣壓力默認值(101326Pa)。另一天,內部傳感器的高度值將會很好。
出于這個原因,我們用校準的傳感器建立海平面壓力,然后根據當地壓力執行我們自己的高度計算。
。
2)溫度
這有點問題!
根據制造商的網站,溫度傳感器是從來沒有打算提供環境溫度值。顯然它提供了“傳感器芯片”的溫度。
由于芯片溫度必須受到大氣溫度的影響,我們應該能夠校準溫度數據以提取環境值。
在建立始終高于環境溫度的溫度值之前,傳感器似乎在最初的17分鐘內自熱。這種加熱必須影響返回壓力值的內部溫度補償。我相信這是靜止的MPL3115A2傳感器觀察到的壓力漂移的原因。我們沒有固定這種內部校正的方法,但我們可以校準大氣溫度。
準備一張時間和溫度表:
時間。. |溫度
0.000 |
13/60 |
1.000 |
2.000 |
。.最多17分鐘。
零時的溫度
變送器以這種格式報告:
D》將是基準溫度和13秒時報告的第一個值。
P:0.0,0.0,25.0 C(Presure 100767.75 Pa)0:13
D》 P:當前海拔高度,最高海拔高度,當前溫度(當地壓力)分鐘:秒
讓變送器冷卻。耐心點。模具似乎保持熱量并會影響初始啟動溫度。
。
記錄當前的室溫,最好是小數點后1位。
使用 Serial Inhibit 鏈接將變送器插入PC。
記錄溫度。打開電子表格 calibrateTemp.xlsx
在單元格F3中輸入室溫,在B3到B21中輸入溫度數據
。
電子表格將產生溫度校正參數。
在第一分鐘,我進行了線性校正:
更正= mUB *時間+ ccUB
剩余時間:
更正= aUB *時間^ 3 + bUB *時間^ 2 + cUB *時間+ dUB
。
使用電子表格值編輯RFM69_transmitter3草圖中的溫度系數
修改未裝箱的部分中的溫度修正值。
上傳修改后的程序。
。
裝箱發射器
讓它冷卻然后重復校準過程。如果這有問題等到你構建了接收器并無線校準。
編輯草圖。
。. isBoxed = true;
。. Tcalibrate = false;
上傳草圖
插入無序列鏈接
Rebox
步驟3:構建接收器
如果像我一樣,你想要將接收器維可牢尼龍搭扣安裝在RC發射器的頂部,你必須要小心思考。
我使用的是一個175 x 50 x 25 mm腹肌盒,與Tardis不同,它的尺寸較小內部。
計劃如何在連接之前將所有組件放在適當的位置。
該框將包含:
Arduino Pro mini 5V0 16 Mhz
電源充電插座
穩壓器
2開關
3 LED
Oled screen
433Mhz收發器
外部雙極天線
。
我為所有人安排了從盒子上掛下的組件,在盒子的內側底座上用尼龍搭扣防止移動。
the scre en配有4個小型12BA螺栓 - 注意! oled中的安裝孔靠近屏幕。不要試圖使用更大的螺栓。我在內部使用堅果作為空間,然后使用額外的堅果來保護。在將屏幕連接到電線之前,標記并切割oled屏幕的孔。檢查螺栓位置。鉆孔,將螺栓切成一定長度并固定墊片螺母。
RFM可以與天線頂部成一定角度安裝。我用了兩個短的12BA螺栓和螺母。這樣可以節省大量空間。
您可能還需要為其他組件鉆蓋子的其余部分。我的盒蓋有一個內唇。我將幾個部分切開以擠壓組件。
。
將調節器安裝在一小塊條形板上。測試輸出。
按照圖表連接組件。 arduino上的引腳11和13各需要2根電線。
使用質量好的短線電線。
將LED添加到arduino中記住使用串聯電阻。
充電點必須小心連接。 開關端子用于向arduino電路提供0V電壓。
。
在供應之前,脂肪供應通過SW1。監管機構和Arduino。 arduino使用Raw終端從完整的Lipo電壓供電。
RFM由Arduino 5V供電。
oled屏幕需要3V3
注意,開關電源線上有2個匹配的100K電阻。它們連接到A0以監控Lipo電壓。不要讓Lipo電壓降至每個電池3.88V以下(總共7.76V)。 充電時必須關閉電源開關。
添加17.3厘米雙極天線,添加一滴Araldite來支撐它們。
我連接了穩壓器最后并重新檢查電路(再次。..。..)
關閉。連接lipo。
步驟4:測試接收器
上傳軟件包RFM69_Receiver。壓縮。
將RFM69_Receiver文件夾添加到Arduino程序文件夾中。將兩個封閉的庫移動到Arduino庫區域。
打開Arduino IDE。
打開文件RFM69_Receiver。
在工具中將電路板設置為Ardino Pro或Pro Mini。將處理器設置為ATmega328P(5V,16MHz)
確保電路已關閉。將串行開關設置為關閉(關閉=未連接到0v =串行開啟?。?/p>
。
重新檢查接線。我不負責!
。
將FTDI編程器的電壓設置為5V。將Arduino連接到FTDI編程器,檢查它是否正確定向。使用USB線將FTDI編程器插入計算機。等待計算機識別USB設備 - 使用工具端口選擇新獲得的com端口。
上傳RFM69_Receiver程序。
經過短暫的延遲后,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
。
隨后出現一個屏幕徽標 - 可以在HT_SSD1306庫中修改logo.h。
顯示屏現在將顯示“Awaiting Ak”
打開發射機電源。
大約13秒后顯示屏將會清除。
增加時間將顯示在第一行。這是為了顯示發射器以及RC平面已經通電多長時間。
低于此目前的海拔高度,最高海拔和溫度。
期望看到變化海拔幾米。我把它歸結為內部溫度補償。
嘗試升高發射器并檢查接收器的高度增加。
綠色指示燈將在收到數據時顯示。
。
設置高度警告
紅色高度警告指示在void printData中設置(字符串S,int字體):
if ((V 》5.1) && (V 《 7.77)){ // 7.77 for 2 cells
將 121.9 (400英尺)更改為任何首選值。
。
確認測量的Lipo電壓
使用儀表測量內部脂質的電壓。
比較反對開始時顯示的電壓。如果不準確,則修改函數vok中的常量 0.0096997 (布爾顯示):
if(T.toFloat() 》 121.9) digitalWrite(7, HIGH); else digitalWrite(7, LOW);
因為我們在兩個分壓電阻器(R1連接)上應用了lipo對于脂質陽性且R2連接到脂質陰性),由A0讀取的中點電壓由下式給出:
V Lipo = A0 * v參考*(R1 + R2)/(R2 * 1024)
如果R1 = R2 = 100K且vReference = 5
v Lipo = A0 * 0.009765625
正如您所見,我不得不賠償測量值。
。
使用脂質充電器檢查充電電路
充電期間請勿打開電池
。
最終裝配
如果一切正常,則組件,注意不要破壞任何電線。如果沒有。.再次檢查電路!
。
我建議使用兩根塑料吸管作為空中保護器 -
將12mm的切口放入一根稻草的末端,將它推入另一根稻草。
切開2個相距約15mm的小孔,小心地將電線以相反的方向推入吸管。
使用Blenderm膠帶將吸管固定在蓋子上。
。
屏幕確實需要屏蔽太陽。我制作了一個薄的鍍錫板護罩并用膠水和攪拌器膠帶將其固定。
將尼龍搭扣添加到接收器底座和RC發射器上,以便攜帶接收器。
。
為飛行場做好準備
目前,發射器正在使用PC桌的默認基準高度。
刪除發射器中的No Serial跳線并將其連接到PC。
將Arduino IDE重置為Arduino Pro Mini 3V3 8Mhz并打開串行監視器。
以米為單位查找高度為你的領域。
鍵入:newbase = xxx.x(例如 newbase = 123.4 )進入監視器并選擇發送
NB 1小數位并在米
此值存儲在Eeprom中。它會覆蓋默認的基準高度,可以重寫用于其他網站。
替換無串行鏈接并重新開箱。
。
安全
433Mhz遠離2.4Ghz電磁頻譜中的35Mhz。
在測試飛行前,我用兩種RC發射器類型(在不同的平面上)進行了測距。
做同樣的事情是明智的。
。
在現場
為RC發射器供電
關閉433Mhz接收器上的串行輸出
為433Mhz接收器供電
為飛機供電
將433Mhz變送器連接到飛機上的脂/備用伺服器 - 觀察極性!
等待13秒進行433Mhz握手
-
發射器
+關注
關注
6文章
875瀏覽量
54228 -
Arduino
+關注
關注
188文章
6489瀏覽量
190028
發布評論請先 登錄
JCMsuite:旋轉對稱發射器
JCMsuite:旋轉對稱發射器
紅外發射器怎么設置華為
紅外發射器是什么_紅外發射器怎么安裝
愛普生S1S77100射頻發射器IC
飛易通發布藍牙音頻發射器,助力老式設備升級LE音頻體驗


評論