这块头有点大啊,外设接线pcb都可以正常运行了,在底板重新画nano的最小系统应该也不是什么难事了
火箭航电在现代业余火箭领域有着非常重要的作用,我在浏览论坛的时候发现还有不少爱好者的火箭航电还停留在mpu6050的姿态开伞上面,所以我就打算开发一款能将火箭飞行数据实时传回地面站的火箭航电。并将制作过程尽可能的完全公开以供大家交流讨论。
制作成功后的地面测试没有任何问题,但是上箭测试中出现了许多问题,遥测系统在发射前突然无法接收到信号,导致没有数据传入,我会在后面详细说明。
基本介绍
本航电采用arduino nano作为主控,搭载了mpu6050六轴加速度传感器、bmp180气压传感器、DX-LR01射频模块、SD卡模块和数个mos管和三极管来控制开伞。下图为原理图
其中:lora模块采用的是大夏云雀的DX-LR01模块,以433Mhz将火箭姿态的四元数和高度数据发送至电脑,并且使用匿名团队开发的<匿名上位机软件>对其进行解析并可视化。在代码层面,我在前辈彩虹之巅给出的姿态开伞代码的基础上进行增添新的代码,废话不多说直接上代码。
代码及功能解释
代码中保留了许多彩虹之巅所所写的内容,比如SD卡对飞行数据的写入,mpu6050的初始化和配置,还有姿态开伞的那个if大框架.....。
代码中删除了生成欧拉角的步骤,换成了调用mpu6050集成的DMP模块来生成实时的四元数,这里生成的四元数是默认z轴在初始状态与地面垂直,彩虹之巅之前的代码采用x轴和地面的夹角来判定是否开伞,所以彩虹的mpu芯片是“站立”在舱内的姿势,而本项目中的芯片摆放需和火箭轴线垂直。在开伞判定上,自然也需要使用z轴的夹角来判定,代码通过实时换算当前的四元数值来计算出箭体与地面法线的夹角来判断是否开伞。当火箭与地面法线的夹角大于120度将会触发由三极管控制的mos管来给电点火头通电,完成开伞操作,开伞临界角度可自定义。具体内容请详见代码。
关于遥测功能,火箭自带一个lora模块,同时电脑上也通过USB转TTL模块连上一个同样的lora模块,为了保证传输速率,我将lora的传输速率调到了最高(通过模块所自带的AT指令),如下表,我将LEVEL调到了7,不过这样会显著减少通讯距离,我不知道这是否和后来发射时的失联有关系,当时火箭发射点和观测点大概有50米的距离,但电脑所接收到的遥测数据开始断断续续,并在起飞后不到一秒失去数据流。我想请问用lora作为遥测系统的数传模块是否合适?
GPS的痛
其实我这个航电最初有计划加装GPS,我尝试使用高博士开发的中科微ATGM332D芯片模块来获取火箭的GPS信息,但是我在尝试中发现了几个问题:
1:arduino nano的内存太小,导致我无法让单片机在原有功能(姿态获取,气压测高)的基础上对模块接收到的GPS信息进行解析后发送,经过长时间改代码删代码还是没能把代码所需的RAM值所降下来后,我选择用单片机直接将模块所接收到的原始信息通过lora进行发送。
2:这个gps模块采用UART通信,所以在单独测试这个模块时我很平常地在arduino nano上为其配置了两个数字串口用来进行通信,经过一番折腾,模块可以连在单片机上单独工作,并把接收到的原始信息通过电脑的串口Serial.write发送出去。但是当尝试用lora对数据进行发送时,电脑无法接收到lora的任何信息,因为当时我是硬件和软件同时更迭代,所以我一直以为是我在更改代码时出了差错,结果折腾一番后我发现当我把GPS断电后lora就可以正常工作,原来是是GPS模块干扰了lora的UART通信。于是,我对其重新编写代码,使其先打开GPS的串口用来接收数据,再关闭GPS串口然后打开lora的串口来发送数据,再关闭lora的串口...如此循环。至此,GPS模块可以在代码中只有它自己的情况下运行并发送数据到电脑。
3:第三条也是我觉得最邪门的地方,当我试图把gps的代码移植到总项目中,原有的发送语句放在主函数中无法工作且会导致整个循环卡死,而且离谱的是,当我把GPS发送语句放在开伞之后的while(true)循环中时,代码仍然一上电就卡住,可是在上电之后,程序明明不会运行到这个指令,而且这并似乎并不是因为在setup中的配置有问题,因为我将上面所提到的触发开伞之后所进入的while(true)包含的GPS发送语句删除后,程序就可以正常运行之前的功能,似乎这条gps发送语句无论放在哪,无论会不会执行都会干扰到程序的正常运行.......我真是分析不出来这到底是什么原因。
4:GPS模块会干扰单片机的程序烧录,这一点同样很奇怪,有时候这个问题很明显,插上GPS后程序死活烧录不进去,但是一拔掉GPS就轻松烧录,但是有时候这个问题又会消失,即使单片机插上GPS也可以烧录进去。当时我测试的时候直接把gps模块焊到板子上了,所以为了控制GPS的上电断电,迫不得已切断了GPS的正极并通过跳线来控制 调试GPS真是一段曹丹的日子。
最终,我放弃了GPS,其间还有个小插曲,我忘记把程序调试时添加的一个gps发送语句给去掉,导致去了发射场后才发现航电卡死。。放弃加装GPS也为后来的发射没有找到火箭埋下了伏笔,悲。
完工效果
VID_20240806_111105.mp4 点击下载
怎么上传后这么糊?
所用的软件是匿名团队开发的匿名上位机。可以看到还是有一定的延迟的,难道是因为9600的波特率太低了嘛。姿态开伞也进行了试验,不过没有录视频。
petal_20240721_081442.mp4 点击下载
这个是采用了匿名团队开发的新一代上位机<匿名助手>,但是这个上位机还处于测试版,所以它现在只支持欧拉角的实时3D显示,后来因为要用四元数所以换回了原来的匿名上位机。
上箭测试
到了最为惊喜的环节,实地发射,发射环节出了重大问题,在起飞的前几分钟,我们发现遥测系统开始时断时续,但逐渐有人来凑近我们还是选择尽快发射。不出意外的话意外发生了,遥测系统在发射的前几秒开始停止更新3D模型姿态和海拔的实时显示,但是仍在接收数据,火箭在升空的一秒后左右,遥测系统彻底失去信号,检测不到任何数据。同时,因为没有搭载GPS,火箭没有被成功寻回,这意味着我们能掌握到的实质性数据只有当天在地面拍摄的视频 先放上视频
petal_20240811_185044.mp4 点击下载
petal_20240812_090238.mp4 点击下载
可以看到发射后有一小段接收到了信息,但是是没有价值的信息。
分析及反思
这次在发射时失去信号,我认为是信号强度的问题,因为当时在尝试点火前发现了失去信号,于是把火箭从发射架上取下然后拿到了电脑旁准备检修,但突然发现信号恢复,而且正常加载3d图形和海拔等数据,于是又将火箭放到远处的发射架上,这时候,电脑旁的同学告诉我说信号开始时断时续,我这时候意识到可能是距离导致的信号强度的问题,点火后自然是失去信号,没有找到火箭又是另一回事了。这次航电的lora模块我使用了它原有自带的弹簧天线
这种天线的增益很低,只有不到2dB,再加上我把传输速率拉到了最高,我觉得可以确定是因为信号强度导致了失联。
这次发射没有找到火箭所以没有获取到SD卡上的飞行数据,也没有获取到遥测的姿态信息和高度信息,我虽然不想承认但事实就是如此:这枚火箭变成了一枚造价高昂的窜天猴
我又在网上买了lora频段的高增益天线,准备再模拟一下高增益天线用在lora模块上是否能保证遥测通信。
这次航电的制作和火箭的发射我觉得能获得几个反思:
1 arduino nano不适合做航电,虽然好开发,但是内存实在太小,我下一次打算使用ESP8266
2 对于发射高度比较高的火箭,gps系统是必须带的,哪怕是宠物防丢器也要带,不然找火箭真是大海捞针,野外草最高能到膝盖那么高,完全把火箭淹没
3火箭航电的按钮最好能够外接,方便调试
4如果发射时失联问题可以因更高增益的lora天线而改善,那么这个航电就还有实用的价值。
参考
[1]彩虹之巅 电子开伞系统教程(1、基于箭体姿态开伞与飞行数据的采集系统)
电子开伞系统教程(1、基于箭体姿态开伞与飞行数据的采集系统) - 科创网 (XXXXXXXXXXXX)
[2]wulala789 如何使用arduino自动校正MPU6050
如何使用arduino自动校正MPU6050_mpu6050 offset-CSDN博客
上面这个传感器校准还是挺重要的,否则的话方向角会飘
最后,我再放一些研制过程中的图片和视频以供鉴赏
开发时杂乱的布线
嘉立创打板子,右边是第一代,左边是第二代,加装了GPS和更牢固的插口,对了关于插口,左边那个仍然不够牢固,使用电脑主板上面的那种插口最好
上图中上面是二代下面是一代
可以看到二代有延伸出来的黑色GPS天线,不过后来因为放弃了gps所以拆掉了
这是火箭的外观,不过这个贴主要是介绍航电我就不多赘述只放几张图
发射采用的发动机
这是OpenRocket所模拟出的一些数据曲线,可以看到模拟的最大高度为515米。
请各位多多提意见,谢谢大家,后续的进展(如果有的话)我会放在楼下
[修改于 4个月1天前 - 2024/08/20 19:59:22]
真是太厉害了,程序好多看不懂,想到自己和几个同学研发的乱七八糟的飞控简直不能比。真的是人外有人,天外有天,自己还盲目的认为程序写的多好了。。。
话说回来,一个飞控成本多少?准备自己复刻一个出来
资瓷,看不懂软件,但感觉很厉害,如果GPS重新拉一块板子和单片机单独工作不行吗?虽然冗杂些但做起来要简单一些
资瓷,看不懂软件,但感觉很厉害,如果GPS重新拉一块板子和单片机单独工作不行吗?虽然冗杂些但做起来要...
是的,我之前也看过别人用两个nano组成航电,我没具体问它的功能,不过我猜测可能就是其中一个nano单独负责GPS
如果时间不急,最好画个板,所用到的功能都直接焊上去,不用这些插拔式模块、跳线。
更可靠、更轻,杜绝稀奇古怪的问题
建议别用这种9V的电池,电压掉的很快,而且本来9V就是arduino nano的最低电压了。电压低了会影响lora,最好用3s锂电池。
时段 | 个数 |
---|---|
{{f.startingTime}}点 - {{f.endTime}}点 | {{f.fileCount}} |
200字以内,仅用于支线交流,主线讨论请采用回复功能。