利用Arduino进行火箭开伞&数据收集
宸chen宸612021/09/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卡模块和采集初始海拔。


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

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


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

[修改于 9个月12天前 - 2021/09/21 21:25:18]

来自:航空航天 / 喷气推进综合交流区 / 科创茶话
7
 
7
宸chen宸61 作者
9个月12天前
2楼
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
宸chen宸61作者
9个月11天前
4楼
引用飛行能力者发表于3楼的内容
这个问题便是姿态开伞程序只能做到火箭开伞,而不能用同一个主板进行高度采集,除非再用另一个主板写高度采...

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

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

谢谢,我再学习一下😃

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

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

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

文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

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