步骤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 =串行开启!)
。
重新检查接线。我不负责!
。
将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文章
843浏览量
53393 -
Arduino
+关注
关注
187文章
6463浏览量
186623
发布评论请先 登录
相关推荐
评论