利用Arduino进行火箭开伞&数据收集
宸chen宸61 2021-9-21原创 喷气推进科创茶话
中文摘要
利用arduino的气压计bmp180做到火箭开伞以及数据收集

本程序优点是只用一个arduino nano主板做到判断火箭下降是开伞并且收集飞行数据

飞行数据采集:
1. 气温
2. 气压
3. 海拔高度
4. 相对高度
5. 速度
关键词
探空火箭开伞航电火箭飞行数据采集arduino 气压计

上了初中时间越来越紧张了,但对火箭的热情一直没有改变,仍利用业余时间一直关注着科创。最近看到论坛里开伞的程序主要是姿态开伞,这个问题便是姿态开伞程序只能做到火箭开伞,而不能用同一个主板进行高度采集,除非再用另一个主板写高度采集的程序。这对于手上只有一个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


IMG_20210921_201821.jpg IMG_20210921_202035.jpg

3.程序:



 气压计库文件<Adafruit_BMP085.h> 
 arduino IDE库管理器里下载

IMG_20210921_202238.jpg

#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;
      }
    }
  }
}

IMG_20210921_202114.jpg

SD卡采集到的数据格式如下,好处是方便复制到Excel里做成曲线图

IMG_20210921_202133.jpg




4.其他:

可以在本程序的基础上增加LED提醒(在传感器加载的部分,如果加载完成LED亮)

在火箭箭体上开三四个大概4mm小孔,注意不要让气流直接吹在气压计上,否则可能数据误差甚至误开伞

注意:接通电源后等待几秒用于加载SD卡模块和采集初始海拔。


*本系统在电梯上实验成功,并且在最顶端成功接通开伞电源*

*欢迎各位老师对这个程序进行改良,转载请注明来历,另外本人对用此程序发射火箭所带来的后果不承担任何法律责任。*


程序中有不足之处请各位老师指点,谢谢😄

[修改于 1 个月前 - 2021-09-21 21:25:18]

来自:火箭技术 / 喷气推进科创广场 / 科创茶话
 
5
 
置顶回复
宸chen宸61 作者取消置顶
1个月5天前
2楼
虎哥
1个月5天前 修改于 1个月5天前
1楼

采六次为啥要写六遍,delay(50)会把采样间隔拉长到多久?

主要是担心火箭上升段也可能因为外部气流相对速度变化较快,造成内部气压波动。考虑到火箭到顶后落下来的时间比较长,多次采样之间的延迟要大,每次采样由多个采样点平滑而得,避免短期波动出现意外。

最好是配合加速度计,以便在有动力段联锁保护。

BMP180的可靠性不高(大多数是焊接损伤/异物进入导致的随机故障),虽然似乎没必要三冗余判决,但自检还是要有的,上电后采样值若不在合理范围,要故障报警。

回复
评论(1)
4
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
宸chen宸61作者
1个月5天前
2楼
回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
飛行能力者
1个月4天前
3楼

这个问题便是姿态开伞程序只能做到火箭开伞,而不能用同一个主板进行高度采集,除非再用另一个主板写高度采集的程序。这对于手上只有一个arduino nano的便是一个问题。

這句話描述的有點奇怪,為什麼只能做到火箭開傘,而不能用同一個主板採集高度的數據

回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
宸chen宸61作者
1个月4天前
4楼
引用飛行能力者发表于3楼的内容
这个问题便是姿态开伞程序只能做到火箭开伞,而不能用同一个主板进行高度采集,除非再用另一个主板写高度采...

因为nano只有一个SCL/SDA数据时钟端口,而mpu6050和bmp180都需要连接这两个端口,所以一个主板只能接其中一个传感器

回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
飛行能力者
1个月4天前
5楼
引用宸chen宸61发表于4楼的内容
因为nano只有一个SCL/SDA数据时钟端口,而mpu6050和bmp180都需要连接这两个端口,...

可以把他們並聯接起來,並不是一組端口只能接到一個傳感器 

回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
宸chen宸61作者
1个月4天前
6楼
引用飛行能力者发表于5楼的内容
可以把他們並聯接起來,並不是一組端口只能接到一個傳感器 

谢谢,我再学习一下😃

可以并联的话就配合着加速度计用能更保险了。

回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

%7B%22isDisplay%22%3Atrue%7D
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
插入资源
全部
图片
视频
音频
附件
全部
未使用
已使用
正在上传
空空如也~
上传中..{{f.progress}}%
处理中..
上传失败,点击重试
等待中...
{{f.name}}
空空如也~
(视频){{r.oname}}
{{selectedResourcesId.indexOf(r.rid) + 1}}
处理中..
处理失败
插入表情
我的表情
共享表情
Emoji
上传
注意事项
最大尺寸100px,超过会被压缩。为保证效果,建议上传前自行处理。
建议上传自己DIY的表情,严禁上传侵权内容。
点击重试等待上传{{s.progress}}%处理中...已上传
空空如也~
草稿箱
加载中...
此处只插入正文,如果要使用草稿中的其余内容,请点击继续创作。
{{fromNow(d.toc)}}
{{getDraftInfo(d)}}
标题:{{d.t}}
内容:{{d.c}}
继续创作
删除插入插入
{{forum.displayName}}
{{forum.countThreads}}
篇文章,
{{forum.countPosts}}
条回复
{{forum.description || "暂无简介"}}
ID: {{user.uid}}
学术分隐藏
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

支持的图片格式:jpg, jpeg, png
插入公式
分享回复:{{shareId}}
加载中...
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
加入关注取消关注
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
建议修改
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

下载资料
{{fileName}}
大小:{{size}}
下载当前附件将花费 {{costMessage}}
{{description}}
你当前剩余 {{holdMessage}}
{{fileName}}
大小:{{size}}
当前附件免费。
你已购买过此附件,下载当前附件不需要花费积分。
加载中...
{{errorInfo}}
附件已丢失
当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}