采六次为啥要写六遍,delay(50)会把采样间隔拉长到多久?
主要是担心火箭上升段也可能因为外部气流相对速度变化较快,造成内部气压波动。考虑到火箭到顶后落下来的时间比较长,多次采样之间的延迟要大,每次采样由多个采样点平滑而得,避免短期波动出现意外。
最好是配合加速度计,以便在有动力段联锁保护。
BMP180的可靠性不高(大多数是焊接损伤/异物进入导致的随机故障),虽然似乎没必要三冗余判决,但自检还是要有的,上电后采样值若不在合理范围,要故障报警。
上了初中时间越来越紧张了,但对火箭的热情一直没有改变,仍利用业余时间一直关注着科创。最近看到论坛里开伞的程序主要是姿态开伞,这个问题便是姿态开伞程序只能做到火箭开伞,而不能用同一个主板进行高度采集,除非再用另一个主板写高度采集的程序。这对于手上只有一个arduino nano的便是一个问题。
加上我看到@h13的气压开伞文章(文号 t79236)便有了一些思路,于是写出了一个功能较为齐全的火箭航电程序。
1. 程序思路:
本程序思路参考了@h13的《基于Arduino的气压开伞教程》(文号 t79236)。开伞部分思路是采集6个连续气压,如果这6个气压值是连续增大,那么说明火箭在下降,从而进行开伞。
2. 程序说明:
所用硬件:
arduino nano
bmp180
继电器模块(建议用场管,因为我不会用,所以就用继电器)
SD卡模块
SD卡
接线:
SD卡模块:
3.3v→3.3v
GND→GND
CS→D4
MOSI→D11
SCK→D13
MISO→D12
bmp180:
VIN→3.3v
GND→GND
SCL→A5
SDA→A4
继电器模块:
VCC→3.3v
GND→GND
IN→D3
3.程序:
气压计库文件<Adafruit_BMP085.h> arduino IDE库管理器里下载
#include <Adafruit_BMP085.h> //气压计所用的库
#include <SD.h>
#include <Wire.h>
#define chipSelect 4 //引脚定义
#define parachute_switch_PIN 3
File dataFile; //库的初始化
Adafruit_BMP085 bmp;
//以下是声明气压,速度,高度的变量 int Pressure1;
int Pressure2;
int Pressure3;
int Pressure4;
int Pressure5;
int Pressure6;
double Velocity1;
double Velocity2;
double Velocity3;
double Velocity4;
double Velocity5;
double Velocity6;
double Altitude1;
double Altitude2;
double Altitude3;
double Altitude4;
double Altitude5;
double Altitude6;
int Hight; //初始高度
int OPEN; //使开伞程序只执行一次,表示开伞状态
void setup() {
// put your setup code here, to run once:
pinMode(parachute_switch_PIN, OUTPUT);
OPEN = 0; //设置开伞状态为未开伞
while (!bmp.begin()); //传感器初始化
while (!SD.begin(chipSelect));
dataFile = SD.open("data.txt", FILE_WRITE);
if (dataFile)
{
dataFile.println("传感器加载成功");
dataFile.println("开始记录数据......");
dataFile.println("\n");
dataFile.println("气温°C\t\t气压Pa\t\t海拔m\t相对高度m\t速度m/s");
dataFile.println("\n");
}
dataFile.close();
Hight = bmp.readAltitude(); //获取初始海拔高度,用于计算相对高度
}
void loop() {
// put your main code here, to run repeatedly:
dataFile = SD.open("data.txt", FILE_WRITE);
if (dataFile) //以下是数据采集以及连续采集6个气压来判断火箭下降
{
dataFile.print(bmp.readTemperature(), DEC); //气温
dataFile.print("\t");
Pressure1 = bmp.readPressure(); //气压
dataFile.print(Pressure1, DEC);
dataFile.print("\t");
dataFile.print(bmp.readAltitude(), DEC); //海拔高度
dataFile.print("\t");
Altitude1=bmp.readAltitude() - Hight;
dataFile.print(Altitude1, DEC); //相对高度
dataFile.println();
}
delay(50);
if (dataFile)
{
dataFile.print(bmp.readTemperature(), DEC);
dataFile.print("\t");
Pressure2 = bmp.readPressure();
dataFile.print(Pressure2, DEC);
dataFile.print("\t");
dataFile.print(bmp.readAltitude(), DEC);
dataFile.print("\t");
Altitude2=bmp.readAltitude() - Hight;
dataFile.print(Altitude2, DEC);
dataFile.print("\t");
Velocity1=(Altitude2-Altitude1)/0.05; //速度
dataFile.print(Velocity1, DEC);
dataFile.println();
}
delay(50);
if (dataFile)
{
dataFile.print(bmp.readTemperature(), DEC);
dataFile.print("\t");
Pressure3 = bmp.readPressure();
dataFile.print(Pressure3, DEC);
dataFile.print("\t");
dataFile.print(bmp.readAltitude(), DEC);
dataFile.print("\t");
Altitude3=bmp.readAltitude() - Hight;
dataFile.print(Altitude3, DEC);
dataFile.print("\t");
Velocity2=(Altitude3-Altitude2)/0.05;
dataFile.print(Velocity2, DEC);
dataFile.println();
}
delay(50);
if (dataFile)
{
dataFile.print(bmp.readTemperature(), DEC);
dataFile.print("\t");
Pressure4 = bmp.readPressure();
dataFile.print(Pressure4, DEC);
dataFile.print("\t");
dataFile.print(bmp.readAltitude(), DEC);
dataFile.print("\t");
Altitude4=bmp.readAltitude() - Hight;
dataFile.print(Altitude4, DEC);
dataFile.print("\t");
Velocity3=(Altitude4-Altitude3)/0.05;
dataFile.print(Velocity3, DEC);
dataFile.println();
}
delay(50);
if (dataFile)
{
dataFile.print(bmp.readTemperature(), DEC);
dataFile.print("\t");
Pressure5 = bmp.readPressure();
dataFile.print(Pressure5, DEC);
dataFile.print("\t");
dataFile.print(bmp.readAltitude(), DEC);
dataFile.print("\t");
Altitude5=bmp.readAltitude() - Hight;
dataFile.print(Altitude5, DEC);
dataFile.print("\t");
Velocity4=(Altitude5-Altitude4)/0.05;
dataFile.print(Velocity4, DEC);
dataFile.println();
}
delay(50);
if (dataFile)
{
dataFile.print(bmp.readTemperature(), DEC);
dataFile.print("\t");
Pressure6 = bmp.readPressure();
dataFile.print(Pressure6, DEC);
dataFile.print("\t");
dataFile.print(bmp.readAltitude(), DEC);
dataFile.print("\t");
Altitude6=bmp.readAltitude() - Hight;
dataFile.print(Altitude6, DEC);
dataFile.print("\t");
Velocity5=(Altitude6-Altitude5)/0.05;
dataFile.print(Velocity5, DEC);
dataFile.println();
}
delay(50);
dataFile.close();
if (Pressure1<Pressure2&&Pressure3<Pressure4&&Pressure4<Pressure5) //判断火箭是否下降
{
if (OPEN == 0)
{
if (bmp.readAltitude() - Hight > 5) //保险
{
dataFile = SD.open("data.txt", FILE_WRITE);
digitalWrite(parachute_switch_PIN, HIGH); //开伞
dataFile.println("opened");
dataFile.close();
OPEN=1;
}
}
}
}
SD卡采集到的数据格式如下,好处是方便复制到Excel里做成曲线图
4.其他:
可以在本程序的基础上增加LED提醒(在传感器加载的部分,如果加载完成LED亮)
在火箭箭体上开三四个大概4mm小孔,注意不要让气流直接吹在气压计上,否则可能数据误差甚至误开伞
注意:接通电源后等待几秒用于加载SD卡模块和采集初始海拔。
*本系统在电梯上实验成功,并且在最顶端成功接通开伞电源*
*欢迎各位老师对这个程序进行改良,转载请注明来历,另外本人对用此程序发射火箭所带来的后果不承担任何法律责任。*
程序中有不足之处请各位老师指点,谢谢
[修改于 9个月12天前 - 2021/09/21 21:25:18]
采六次为啥要写六遍,delay(50)会把采样间隔拉长到多久?
主要是担心火箭上升段也可能因为外部气流相对速度变化较快,造成内部气压波动。考虑到火箭到顶后落下来的时间比较长,多次采样之间的延迟要大,每次采样由多个采样点平滑而得,避免短期波动出现意外。
最好是配合加速度计,以便在有动力段联锁保护。
BMP180的可靠性不高(大多数是焊接损伤/异物进入导致的随机故障),虽然似乎没必要三冗余判决,但自检还是要有的,上电后采样值若不在合理范围,要故障报警。
bmp180的用法和程序可以参考
XXXXXXXXXXXXXXXXXXXXt/weixin_30141859/article/details/112570472
这个问题便是姿态开伞程序只能做到火箭开伞,而不能用同一个主板进行高度采集,除非再用另一个主板写高度采集的程序。这对于手上只有一个arduino nano的便是一个问题。
這句話描述的有點奇怪,為什麼只能做到火箭開傘,而不能用同一個主板採集高度的數據
这个问题便是姿态开伞程序只能做到火箭开伞,而不能用同一个主板进行高度采集,除非再用另一个主板写高度采...
因为nano只有一个SCL/SDA数据时钟端口,而mpu6050和bmp180都需要连接这两个端口,所以一个主板只能接其中一个传感器
因为nano只有一个SCL/SDA数据时钟端口,而mpu6050和bmp180都需要连接这两个端口,...
可以把他們並聯接起來,並不是一組端口只能接到一個傳感器
抱歉挖坟,但我想问一下为什么我的代码编译上传成功了,但一通电很快继电器就吸合了呢?暂时没有sd卡所以还无法检测数据收集是否正常
时段 | 个数 |
---|---|
{{f.startingTime}}点 - {{f.endTime}}点 | {{f.fileCount}} |
200字以内,仅用于支线交流,主线讨论请采用回复功能。