1. 项目概述与核心需求解析如果你玩过模型火箭一定对那根拖着白烟直冲云霄的小家伙印象深刻。标准的模型火箭依靠黑火药发动机提供推力在发动机燃尽后内部的延时点火药会引爆一个“开伞药”从而弹射出降落伞让火箭安全飘落。这套机制简单可靠对于低空、小型的火箭来说完全够用。但当你开始涉足“高功率火箭”领域事情就变得复杂了。更高的飞行高度意味着更长的下落时间如果只在顶点Apogee打开一个巨大的主伞风会把你的火箭吹到几公里外找回它将成为一场噩梦。这时你就需要一套更聪明的回收策略双伞回收。在顶点打开一个小型的减速伞Drogue Chute让火箭以可控但相对较快的速度稳定下落减少随风飘移的距离在接近地面时比如300米高度再打开大型的主伞Main Chute确保着陆速度足够慢避免损坏。要实现这套逻辑一个能感知高度、做出决策并执行动作的“大脑”就不可或缺了——这就是飞行计算机Flight Computer, FC。我这次分享的项目就是基于Teensy 4.1微控制器从头打造一台功能全面的模型火箭飞行计算机。它远不止是一个开伞控制器。我的核心需求清单包括1) 通过多传感器融合实现厘米级精度的定位2) 驱动四个独立的 pyro 通道用于点燃开伞火药并具备通道通断检测功能3) 在剧烈振动环境下仍能可靠地记录所有飞行数据4) 通过无线电模块实时下传遥测数据5) 控制一个反作用飞轮实现火箭滚转轴的自稳定6) 驱动两个舵机7) 控制一个步进电机未来用于操纵滑翔伞翼8) 管理机上多个摄像头的电源开关。当然还得为未来的功能扩展预留空间。这听起来像是个“全家桶”方案。确实对于第一次尝试的朋友我强烈建议从最基础的功能开始一个气压计、一个微控制器、一个 pyro 通道。先让火箭能可靠地开伞回收再逐步增加复杂度。我这个设计包含了大量探索性内容比如传感器融合和飞轮控制它们既是挑战也是乐趣所在。接下来我会拆解从设计思路、硬件选型、PCB绘制、焊接调试到代码架构的全过程并分享那些只有亲手做过才会知道的“坑”。2. 核心硬件选型与设计思路硬件是飞行计算机的骨架选型决定了系统的能力上限和可靠性下限。我的原则是在关键路径上不吝啬在非关键部分追求极致性价比并且优先选择社区支持好、资料丰富的组件。2.1 微控制器为什么是Teensy 4.1在项目初期我曾在STM32、ESP32和Teensy之间犹豫。最终选择Teensy 4.1是基于以下几个硬核考量性能怪兽其主频高达600MHz比常见的Arduino Uno快了近40倍。这意味着有充足的算力来运行复杂的传感器融合算法如卡尔曼滤波、处理多路传感器数据、同时进行数据记录和无线电通信而无需在代码优化上绞尽脑汁。对于实时性要求高的飞轮PID控制高主频意味着更快的控制循环和更稳定的性能。丰富的I/O与原生外设它拥有55个GPIO满足了我连接众多传感器、执行器和外围设备的需求。最吸引我的是其原生SD卡接口。对于飞行数据记录黑匣子功能SD卡的读写速度和可靠性至关重要。使用原生接口比通过SPI模拟更稳定、更快速尤其在写入大量数据时能减少丢帧。此外板载的加密芯片和以太网PHY虽然本次未用但为未来升级如加密遥测、地面站网络化留足了可能。可扩展内存板载的PSRAM和QSPI Flash焊盘是“隐藏王牌”。火箭飞行中振动剧烈SD卡可能因接触问题瞬间掉线。我将关键飞行数据如开伞决策前后的高度、加速度序列同时写入SD卡和板载Flash作为双备份。Teensy 4.1对QSPI Flash的支持是芯片级的使用LittleFS或EEPROM库操作非常简单省去了自己设计外部Flash电路和驱动程序的麻烦。卓越的生态系统Teensy的背后是PJRC和社区大神Paul Stoffregen其核心库如ADC、IntervalTimer优化程度极高中断响应非常迅速。PlatformIO和Arduino IDE都对其有完美支持开发体验流畅。注意Teensy 4.1的工作电压是3.3V但其大部分引脚可耐受5V输入。在连接5V传感器如某些GPS模块时需确认其输出电平是否为3.3V兼容或使用电平转换器避免损坏单片机。2.2 传感器套件感知世界的眼睛飞行计算机的决策依赖于精确的感知。我采用了多传感器冗余融合的方案来提高可靠性。气压计 (Barometer)这是测量高度的核心。我选用的是BMP388。相比经典的BMP280BMP388在精度、温度稳定性和噪声控制上都有提升并且支持高分辨率模式。它通过I2C或SPI通信。关键点气压计对温度非常敏感且火箭发动机喷口的高温燃气可能影响读数。我的做法是将其安装在远离发动机舱的电子舱内并用泡棉进行一定程度的隔震和隔热。在软件上需要持续进行温度补偿。惯性测量单元 (IMU)我选择了MPU-6050集成3轴陀螺仪3轴加速度计。它价格低廉资料丰富。虽然其零偏稳定性不如更高级的型号但对于模型火箭的姿态估算特别是滚转和加速度触发备份是足够的。IMU数据主要用于两个地方一是与气压计数据融合估算更平滑的高度和垂直速度二是作为飞轮PID控制的反馈输入。全球定位系统 (GPS)用于记录飞行轨迹和提供绝对位置参考。我选用的是BN-880模块它同时提供GPS和GLONASS信号冷启动速度快且自带磁力计虽然火箭上磁力计受电机干扰大基本不用。GPS数据在上升段更新率可能跟不上但在下降段尤其是开伞后能提供宝贵的位置信息用于寻找箭体。2.3 执行机构与驱动控制世界的双手Pyro通道与MOSFET驱动开伞火药E-match的点燃需要瞬间的大电流通常1A以上。我使用逻辑电平型N沟道MOSFET如IRLZ44N作为电子开关。单片机GPIO输出高电平3.3V即可完全导通MOSFET让电池电流流过E-match。关键设计续流二极管必须在E-match两端并联一个二极管如1N4007阴极接电源正极。当MOSFET关闭时E-match电感产生的反向电动势可以通过二极管释放保护MOSFET不被击穿。限流电阻最初我在MOSFET的栅极串联了一个小电阻如100Ω用于抑制栅极电容充放电产生的尖峰。但在测试用镍铬丝切割扎带时由于负载电阻极小电流极大这个栅极电阻竟然烧毁了。教训对于可能通过大电流的开关电路需要仔细计算所有元件的功率额定值。临时解决方案是使用外部导线直接连接但这并非长久之计。更好的做法是选用功率更大的栅极电阻或使用专门的MOSFET驱动芯片。通断检测为了安全我需要知道E-match是否正确连接。我在每个Pyro通道上增加了一个上拉电阻到3.3V并通过一个分压电路连接到单片机的ADC引脚。未连接E-match时ADC读到的是一个固定电压连接后E-match的微小电阻会改变这个电压值。通过测量这个电压可以判断通道是否“就绪”。反作用飞轮与电机驱动飞轮是一个高速旋转的质量块通过改变其转速利用角动量守恒原理产生反扭矩来抵消火箭的滚转。我从一台旧打印机里拆了一个直流有刷电机作为飞轮。驱动使用常见的DRV8833双H桥电机驱动模块它可以通过PWM信号方便地控制电机的速度和方向。控制算法是经典的PID根据IMU陀螺仪Z轴的数据计算误差并输出PWM。步进电机驱动用于未来控制滑翔伞翼面。我选用A4988驱动模块配合一个42步进电机。它只需要“方向”和“步进”两个信号即可控制非常简单。电源树设计这是硬件设计中最容易出错的部分。我的火箭使用一块3S锂聚合物电池标称11.1V供电。各部件电压需求不同Teensy 4.1、传感器、射频模块需要3.3V。我使用一个AMS1117-3.3线性稳压器从电池取电。需注意其最大输入电压和散热。舵机通常需要5V或6V。我使用一个降压模块如MP1584EN将电池电压降至7V为两个舵机供电。舵机电源必须与单片机电源隔离并在电源入口处加一个大容量电解电容如470uF以应对堵转电流冲击。Pyro通道和电机直接使用电池电压11.1V。大电流路径必须使用足够宽的走线。摄像头通过MOSFET开关控制USB 5V输出直接为运动相机供电。3. PCB设计与布局实战要点将原理图转化为一块可靠的PCB是项目从理论走向实物的关键一步。我使用Autodesk Fusion 360进行电子设计因为它能让我在绘制电路的同时在3D空间里检查器件干涉这对于空间紧凑的火箭电子舱非常有用。3.1 板框与布局规划首先确定PCB尺寸。许多PCB制造商如JLCPCB、PCBWay对首单有“100mm x 100mm”以内的特价。我的火箭箭体直径是75mm所以PCB最大宽度受限。最终我确定了75mm x 100mm的竖版布局这样可以充分利用箭体高度空间。布局顺序遵循“接口-核心-外围”的原则固定接口先行首先放置必须位于板边的连接器。我的设计是上下各一排螺丝端子分别连接电池、Pyro、舵机、电机等外部设备。将它们固定在板边合适位置。核心器件居中将Teensy 4.1放置在板子中央区域。它是所有信号交汇的中心居中放置有助于缩短关键信号线的长度减少干扰。功率器件靠边将电压稳压器AMS1117、MP1584和MOSFET放置在靠近其电源输入端电池螺丝端子的位置。大电流路径电池到MOSFET到Pyro端子的走线要尽可能短、粗、直。敏感器件隔离将IMU、气压计等模拟传感器尽量远离电机驱动、MOSFET等数字噪声源。如果可能为模拟部分提供独立的电源滤波。小件填空最后放置电阻、电容等无源器件填充剩余空间。3.2 布线Routing的核心技巧布线不仅仅是连通更是保证电气性能的关键。线宽规则信号线0.25mm (10mil) 足够用于GPIO、I2C、SPI等。低功率电源线给传感器、单片机供电的3.3V/5V线使用0.5mm (20mil)。高功率电源线电池输入、Pyro输出、电机驱动电源必须加粗我使用了2mm (80mil)的线宽。即使这样在通过持续大电流如驱动镍铬丝时走线仍然会发热。对于极端情况可以考虑在顶层和底层同时走线并通过过孔阵列连接等效增加铜箔横截面积或者在焊盘上直接焊接一根导线来辅助载流。过孔的使用连接不同层时过孔尺寸要合理。对于大电流路径使用多个过孔并联。我的电池输入焊盘就使用了4个直径0.8mm的过孔。接地策略我采用了“星型接地”和“大面积铺铜”结合的方式。所有稳压器的地、单片机的地、模拟部分的地都先用单独的走线连接到电池输入的地端星型点然后再在这个基础上进行底层铺铜。这样可以避免大电流数字噪声通过地线干扰敏感的模拟电路。去耦电容布局每个IC的电源引脚附近都必须紧挨着放置一个0.1uF的陶瓷去耦电容104。这个电容的作用是为芯片瞬间的电流需求提供本地“小水库”路径越短效果越好。对于单片机通常在每组电源引脚附近都放置一个。3.3 设计检查与打样完成布线后利用Fusion 360的DRC设计规则检查功能检查线宽、间距、孔距等是否符合制造商的能力通常最小线宽/间距为6mil/6mil。然后导出Gerber文件包含各层铜箔、丝印、阻焊等信息的标准格式压缩成ZIP包。在PCB制造商网站上传Gerber文件后通常选择最基础的参数板厚1.6mmFR-4材料有铅喷锡焊接性好绿色阻焊油。对于这种功能性的飞行控制器不需要追求美观的沉金工艺。一周左右你就能拿到属于你自己的PCB了。4. 焊接、组装与系统调试拿到光亮的PCB只是第一步将它变成能工作的设备焊接和调试是关键。4.1 焊接顺序与技巧焊接顺序很重要原则是先焊矮的、小的、不怕热的再焊高的、大的、怕热的。贴片元件打头阵首先焊接所有的贴片电阻、电容、二极管。使用焊锡膏和热风枪可以快速完成没有风枪用烙铁细头也可以。接插件与立式元件焊接排针、排母、螺丝端子、LED、蜂鸣器等。注意排母的方向确保Teensy能正确插入。功率器件焊接MOSFET、稳压芯片、电机驱动模块的插针。给MOSFET焊接一小片散热片会更好。核心器件最后上最后焊接Teensy 4.1的排母、GPS模块和射频模块。这样避免在焊接其他部件时热风或烙铁不小心碰到这些精密器件。特别注意Teensy 4.1背面的PSRAM或Flash芯片如果需要自行焊接极具挑战。芯片引脚细密建议使用高质量的细尖烙铁头、助焊膏和吸锡线。可以参考PJRC官方的焊接视频或者直接购买已焊好芯片的版本。4.2 分模块上电测试绝对不要焊接完所有部件后直接整板上电必须分模块、分阶段测试。仅焊接电源部分焊接好电池接口、稳压芯片及其输入输出电容。上电前用万用表二极管档测量电池输入端的正反向电阻确保没有短路。然后上电测量3.3V、5V等输出电压是否正常。焊接单片机及最小系统焊上Teensy排母插入Teensy先不焊其他任何东西。通过USB供电看电脑是否能识别到串口。上传一个简单的Blink程序测试单片机是否工作正常。逐个添加外设每焊接或连接一个主要外设如SD卡模块、传感器就写一段简单的测试代码验证其基本功能。例如测试BMP388能否读出温度和压力测试MOSFET通道能否点亮一个12V灯泡代替E-match进行安全测试。Pyro通道安全测试这是高风险测试。务必在空旷、无易燃物的室外进行。使用一个假负载如一个12V/21W的汽车灯泡代替真实的E-match。测试时用万用表电流档串联在回路中观察触发瞬间的电流是否符合预期。同时用手触摸MOSFET和走线检查是否有异常发热。4.3 “电梯测试”与集成调试当所有硬件功能单独测试通过后需要进行系统集成测试也就是著名的“电梯测试”。编写测试固件固件需要模拟完整的飞行逻辑上电自检 - 等待发射检测持续加速度- 模拟上升段记录数据- 在预设高度或气压变化触发Pyro通道1Drogue- 继续下降 - 在更低高度触发Pyro通道2Main- 着陆后待机。同时用板载LED或蜂鸣器指示当前状态如快闪准备常亮上升慢闪下降双闪开伞。执行测试带着组装好的飞行计算机进入电梯。从一楼开始启动程序然后坐电梯到顶楼。电梯上升过程模拟火箭爬升气压减小下降过程模拟火箭降落气压增加。观察LED状态变化是否在预期高度发生同时用接在Pyro输出端的LED指示灯记得串联电阻观察是否正常点亮。数据分析测试后读取SD卡中记录的气压、温度、加速度数据在电脑上用Python或MATLAB绘制曲线检查数据是否连续、合理开伞触发点是否准确。我在这个阶段遇到了两个典型问题问题一Pyro通道大电流烧毁栅极电阻。如前所述在测试镍铬丝时发生了。排查发现电阻烧黑测量已断路。解决更换为更大功率如1W的电阻并重新评估了在持续大电流下直接使用PCB走线的可行性为关键功率路径增加了辅助导线。问题二Teensy无法用电池供电。排查测量发现当只接电池时Teensy的3.3V引脚有电但单片机不工作。检查原理图发现我错误地将板载5V稳压输出接到了Teensy的USB引脚仅供USB供电检测用而非Vin引脚。解决飞线将板载5V连接到Teensy的Vin引脚并在后续的PCB版本中修正了原理图。5. 固件架构与关键算法实现软件是飞行计算机的灵魂。我的代码采用分层、模块化的架构便于调试和扩展。核心逻辑在PlatformIO环境下用C编写。5.1 程序状态机飞行计算机的工作流程是一个清晰的状态机STATE_IDLE地面待机状态。进行传感器校准如加速度计零偏、陀螺仪零偏等待发射信号。发射信号可以由加速度计持续超标判断也可以由外部“发射准备”开关给出。STATE_POWERED_ASCENT动力上升段。发动机工作加速度极大。此阶段主要进行高速数据记录并作为开伞备份逻辑的输入如果气压计失效可用加速度积分估算高度。STATE_COASTING_ASCENT惯性上升段。发动机关闭火箭依靠惯性爬升至顶点。此阶段是传感器融合算法工作的主要阶段精确计算高度和速度。STATE_APOGEE顶点侦测与减速伞开伞。当垂直速度从正变负即开始下落时判定为顶点。延迟几十毫秒确保火箭姿态稳定后触发第一个Pyro通道打开减速伞。STATE_DROGUE_DESCENT减速伞下降段。继续监测高度。STATE_MAIN_DEPLOYMENT主伞开伞。当高度降至预设值如300米触发第二个Pyro通道打开主伞。STATE_MAIN_DESCENT主伞下降段。可以开启GPS定位并通过无线电广播位置方便回收。STATE_LANDED着陆状态。关闭所有非必要设备进入低功耗模式等待回收。5.2 高度解算与卡尔曼滤波这是飞行计算机最核心的算法。单纯依赖气压计读数计算高度会受噪声和动态压力影响特别是在高速上升阶段而单纯积分加速度计数据会产生严重的漂移。卡尔曼滤波正是融合两者优势、抑制各自缺点的最佳工具。我实现了一个简化的一维高度卡尔曼滤波器状态变量是高度和垂直速度。预测步骤利用加速度计数据减去重力加速度来预测下一时刻的速度和位置。速度 上一时刻速度 加速度 * 时间间隔高度 上一时刻高度 速度 * 时间间隔。这个过程会引入误差噪声用过程噪声协方差矩阵Q来描述。更新步骤当新的气压高度测量值到来时与预测的高度进行比较。卡尔曼滤波器会根据预测的不确定性和测量的不确定性用测量噪声协方差矩阵R描述计算一个最优的“卡尔曼增益”。这个增益决定了我们是更相信预测值还是测量值。然后用这个增益来更新状态估计得到一个比单纯预测或单纯测量都更准确的高度和速度值。// 极度简化的伪代码展示概念 void kalmanUpdate(float accelZ, float baroAltitude, float dt) { // 1. 预测 verticalVelocity (accelZ - 9.81) * dt; // 减去重力 estimatedAltitude verticalVelocity * dt; // ... 更新误差协方差 P F * P * F^T Q // 2. 更新 float innovation baroAltitude - estimatedAltitude; float kalmanGain P / (P R); // 简化计算 estimatedAltitude kalmanGain * innovation; verticalVelocity kalmanGain * (innovation / dt); // 同时更新速度 // ... 更新误差协方差 P (1 - kalmanGain) * P }参数调校Q和R是滤波器的“调谐旋钮”。Q大表示系统模型不准确加速度计噪声大滤波器会更信任气压计R大表示气压计测量噪声大滤波器会更信任预测值。需要通过实际飞行或模拟数据如电梯测试数据反复调整这两个参数直到输出曲线既平滑又响应迅速。5.3 数据记录与可靠性设计飞行数据是分析故障、改进设计的唯一依据。必须保证在强烈振动和可能断电的情况下不丢失。双缓冲写入SD卡不要在中断服务程序或高速循环中直接调用file.print()。我开辟了两个512字节的内存缓冲区。传感器数据不断填入缓冲区A当缓冲区A满立即切换至缓冲区B进行填充同时在主循环中异步地将缓冲区A的数据写入SD卡。这避免了因写卡速度慢而阻塞数据采集。QSPI Flash即时备份在判定进入关键事件如点火、开伞前后几秒我将关键数据快照时间、高度、速度、加速度、系统状态同时写入板载的QSPI Flash。即使SD卡因振动松动这部分核心数据依然存在。文件系统与掉电保护每次上电创建一个以时间戳命名的新文件。在每次写入SD卡后调用file.flush()强制将数据从缓存写入物理卡但不宜过于频繁以免影响寿命。更好的做法是使用带有掉电保护功能的SD卡模块或者使用更健壮的文件系统如LittleFS。5.4 遥测与地面站我使用一个简单的LoRa射频模块如SX1278进行数传。传输的数据包经过精心设计包含火箭ID、状态、经纬度、高度、垂直速度、电池电压等关键信息。传输协议包含前导码、包长度、校验和以提高抗干扰能力。地面站是一个运行在笔记本电脑上的Python程序通过USB转串口连接另一个LoRa模块。它实时解析数据包显示在图形界面上并存储到本地文件。在火箭降落后可以通过地面站发送指令让火箭 beacon 发出声音或点亮LED便于寻找。6. 飞行测试、问题复盘与未来展望这台飞行计算机的首飞是一次部分成功的经历。火箭按计划起飞加速上升段、惯性段、顶点侦测、减速伞开伞所有动作都精准执行。数据记录显示卡尔曼滤波估算出的高度曲线非常平滑顶点判断准确。然而问题出在机械部分。主伞一个朋友制作的罗加洛滑翔伞的伞包与伞绳发生了缠绕导致主伞未能正常抛出。火箭仅靠减速伞减速最终以较高的速度撞击地面。幸运的是箭体结构吸收了大部分冲击电子舱完好无损飞行计算机幸存了下来。事后复盘与教训机械可靠性高于一切再精密的电子系统也可能被一个简单的机械故障击败。伞绳的收纳、伞包的设计、开伞火药的安装方向都需要经过反复、严格的测试。下次我会考虑使用“伞绳套筒”或“伞绳梳理板”来避免缠绕。数据记录至关重要首飞时板载Flash日志功能尚未完全实现。SD卡在撞击瞬间因振动停止了记录导致丢失了最关键着地前后的数据。这让我深刻意识到冗余记录系统的必要性。未来的设计必须保证在任何单点故障下核心数据不丢失。测试测试再测试电梯测试模拟了高度变化但无法模拟火箭飞行中复杂的振动、旋转和加速度环境。未来需要制作一个“摇表”或使用大功率振动电机对装配好的电子舱进行振动测试提前发现虚焊、连接器松动等问题。这个项目远未结束。下一步我将完善Flash数据记录优化卡尔曼滤波参数并开始集成滑翔伞的舵面控制算法。看着自己设计的电路板搭载着自己编写的代码控制着火箭完成一系列复杂的动作这种成就感是无与伦比的。它不仅仅是一个控制器更是通往更广阔航空航天探索世界的一把钥匙。希望我的这些经验与教训能为你点燃同样的火花。
基于Teensy 4.1的模型火箭飞行计算机:从传感器融合到双伞回收控制
发布时间:2026/5/30 14:34:48
1. 项目概述与核心需求解析如果你玩过模型火箭一定对那根拖着白烟直冲云霄的小家伙印象深刻。标准的模型火箭依靠黑火药发动机提供推力在发动机燃尽后内部的延时点火药会引爆一个“开伞药”从而弹射出降落伞让火箭安全飘落。这套机制简单可靠对于低空、小型的火箭来说完全够用。但当你开始涉足“高功率火箭”领域事情就变得复杂了。更高的飞行高度意味着更长的下落时间如果只在顶点Apogee打开一个巨大的主伞风会把你的火箭吹到几公里外找回它将成为一场噩梦。这时你就需要一套更聪明的回收策略双伞回收。在顶点打开一个小型的减速伞Drogue Chute让火箭以可控但相对较快的速度稳定下落减少随风飘移的距离在接近地面时比如300米高度再打开大型的主伞Main Chute确保着陆速度足够慢避免损坏。要实现这套逻辑一个能感知高度、做出决策并执行动作的“大脑”就不可或缺了——这就是飞行计算机Flight Computer, FC。我这次分享的项目就是基于Teensy 4.1微控制器从头打造一台功能全面的模型火箭飞行计算机。它远不止是一个开伞控制器。我的核心需求清单包括1) 通过多传感器融合实现厘米级精度的定位2) 驱动四个独立的 pyro 通道用于点燃开伞火药并具备通道通断检测功能3) 在剧烈振动环境下仍能可靠地记录所有飞行数据4) 通过无线电模块实时下传遥测数据5) 控制一个反作用飞轮实现火箭滚转轴的自稳定6) 驱动两个舵机7) 控制一个步进电机未来用于操纵滑翔伞翼8) 管理机上多个摄像头的电源开关。当然还得为未来的功能扩展预留空间。这听起来像是个“全家桶”方案。确实对于第一次尝试的朋友我强烈建议从最基础的功能开始一个气压计、一个微控制器、一个 pyro 通道。先让火箭能可靠地开伞回收再逐步增加复杂度。我这个设计包含了大量探索性内容比如传感器融合和飞轮控制它们既是挑战也是乐趣所在。接下来我会拆解从设计思路、硬件选型、PCB绘制、焊接调试到代码架构的全过程并分享那些只有亲手做过才会知道的“坑”。2. 核心硬件选型与设计思路硬件是飞行计算机的骨架选型决定了系统的能力上限和可靠性下限。我的原则是在关键路径上不吝啬在非关键部分追求极致性价比并且优先选择社区支持好、资料丰富的组件。2.1 微控制器为什么是Teensy 4.1在项目初期我曾在STM32、ESP32和Teensy之间犹豫。最终选择Teensy 4.1是基于以下几个硬核考量性能怪兽其主频高达600MHz比常见的Arduino Uno快了近40倍。这意味着有充足的算力来运行复杂的传感器融合算法如卡尔曼滤波、处理多路传感器数据、同时进行数据记录和无线电通信而无需在代码优化上绞尽脑汁。对于实时性要求高的飞轮PID控制高主频意味着更快的控制循环和更稳定的性能。丰富的I/O与原生外设它拥有55个GPIO满足了我连接众多传感器、执行器和外围设备的需求。最吸引我的是其原生SD卡接口。对于飞行数据记录黑匣子功能SD卡的读写速度和可靠性至关重要。使用原生接口比通过SPI模拟更稳定、更快速尤其在写入大量数据时能减少丢帧。此外板载的加密芯片和以太网PHY虽然本次未用但为未来升级如加密遥测、地面站网络化留足了可能。可扩展内存板载的PSRAM和QSPI Flash焊盘是“隐藏王牌”。火箭飞行中振动剧烈SD卡可能因接触问题瞬间掉线。我将关键飞行数据如开伞决策前后的高度、加速度序列同时写入SD卡和板载Flash作为双备份。Teensy 4.1对QSPI Flash的支持是芯片级的使用LittleFS或EEPROM库操作非常简单省去了自己设计外部Flash电路和驱动程序的麻烦。卓越的生态系统Teensy的背后是PJRC和社区大神Paul Stoffregen其核心库如ADC、IntervalTimer优化程度极高中断响应非常迅速。PlatformIO和Arduino IDE都对其有完美支持开发体验流畅。注意Teensy 4.1的工作电压是3.3V但其大部分引脚可耐受5V输入。在连接5V传感器如某些GPS模块时需确认其输出电平是否为3.3V兼容或使用电平转换器避免损坏单片机。2.2 传感器套件感知世界的眼睛飞行计算机的决策依赖于精确的感知。我采用了多传感器冗余融合的方案来提高可靠性。气压计 (Barometer)这是测量高度的核心。我选用的是BMP388。相比经典的BMP280BMP388在精度、温度稳定性和噪声控制上都有提升并且支持高分辨率模式。它通过I2C或SPI通信。关键点气压计对温度非常敏感且火箭发动机喷口的高温燃气可能影响读数。我的做法是将其安装在远离发动机舱的电子舱内并用泡棉进行一定程度的隔震和隔热。在软件上需要持续进行温度补偿。惯性测量单元 (IMU)我选择了MPU-6050集成3轴陀螺仪3轴加速度计。它价格低廉资料丰富。虽然其零偏稳定性不如更高级的型号但对于模型火箭的姿态估算特别是滚转和加速度触发备份是足够的。IMU数据主要用于两个地方一是与气压计数据融合估算更平滑的高度和垂直速度二是作为飞轮PID控制的反馈输入。全球定位系统 (GPS)用于记录飞行轨迹和提供绝对位置参考。我选用的是BN-880模块它同时提供GPS和GLONASS信号冷启动速度快且自带磁力计虽然火箭上磁力计受电机干扰大基本不用。GPS数据在上升段更新率可能跟不上但在下降段尤其是开伞后能提供宝贵的位置信息用于寻找箭体。2.3 执行机构与驱动控制世界的双手Pyro通道与MOSFET驱动开伞火药E-match的点燃需要瞬间的大电流通常1A以上。我使用逻辑电平型N沟道MOSFET如IRLZ44N作为电子开关。单片机GPIO输出高电平3.3V即可完全导通MOSFET让电池电流流过E-match。关键设计续流二极管必须在E-match两端并联一个二极管如1N4007阴极接电源正极。当MOSFET关闭时E-match电感产生的反向电动势可以通过二极管释放保护MOSFET不被击穿。限流电阻最初我在MOSFET的栅极串联了一个小电阻如100Ω用于抑制栅极电容充放电产生的尖峰。但在测试用镍铬丝切割扎带时由于负载电阻极小电流极大这个栅极电阻竟然烧毁了。教训对于可能通过大电流的开关电路需要仔细计算所有元件的功率额定值。临时解决方案是使用外部导线直接连接但这并非长久之计。更好的做法是选用功率更大的栅极电阻或使用专门的MOSFET驱动芯片。通断检测为了安全我需要知道E-match是否正确连接。我在每个Pyro通道上增加了一个上拉电阻到3.3V并通过一个分压电路连接到单片机的ADC引脚。未连接E-match时ADC读到的是一个固定电压连接后E-match的微小电阻会改变这个电压值。通过测量这个电压可以判断通道是否“就绪”。反作用飞轮与电机驱动飞轮是一个高速旋转的质量块通过改变其转速利用角动量守恒原理产生反扭矩来抵消火箭的滚转。我从一台旧打印机里拆了一个直流有刷电机作为飞轮。驱动使用常见的DRV8833双H桥电机驱动模块它可以通过PWM信号方便地控制电机的速度和方向。控制算法是经典的PID根据IMU陀螺仪Z轴的数据计算误差并输出PWM。步进电机驱动用于未来控制滑翔伞翼面。我选用A4988驱动模块配合一个42步进电机。它只需要“方向”和“步进”两个信号即可控制非常简单。电源树设计这是硬件设计中最容易出错的部分。我的火箭使用一块3S锂聚合物电池标称11.1V供电。各部件电压需求不同Teensy 4.1、传感器、射频模块需要3.3V。我使用一个AMS1117-3.3线性稳压器从电池取电。需注意其最大输入电压和散热。舵机通常需要5V或6V。我使用一个降压模块如MP1584EN将电池电压降至7V为两个舵机供电。舵机电源必须与单片机电源隔离并在电源入口处加一个大容量电解电容如470uF以应对堵转电流冲击。Pyro通道和电机直接使用电池电压11.1V。大电流路径必须使用足够宽的走线。摄像头通过MOSFET开关控制USB 5V输出直接为运动相机供电。3. PCB设计与布局实战要点将原理图转化为一块可靠的PCB是项目从理论走向实物的关键一步。我使用Autodesk Fusion 360进行电子设计因为它能让我在绘制电路的同时在3D空间里检查器件干涉这对于空间紧凑的火箭电子舱非常有用。3.1 板框与布局规划首先确定PCB尺寸。许多PCB制造商如JLCPCB、PCBWay对首单有“100mm x 100mm”以内的特价。我的火箭箭体直径是75mm所以PCB最大宽度受限。最终我确定了75mm x 100mm的竖版布局这样可以充分利用箭体高度空间。布局顺序遵循“接口-核心-外围”的原则固定接口先行首先放置必须位于板边的连接器。我的设计是上下各一排螺丝端子分别连接电池、Pyro、舵机、电机等外部设备。将它们固定在板边合适位置。核心器件居中将Teensy 4.1放置在板子中央区域。它是所有信号交汇的中心居中放置有助于缩短关键信号线的长度减少干扰。功率器件靠边将电压稳压器AMS1117、MP1584和MOSFET放置在靠近其电源输入端电池螺丝端子的位置。大电流路径电池到MOSFET到Pyro端子的走线要尽可能短、粗、直。敏感器件隔离将IMU、气压计等模拟传感器尽量远离电机驱动、MOSFET等数字噪声源。如果可能为模拟部分提供独立的电源滤波。小件填空最后放置电阻、电容等无源器件填充剩余空间。3.2 布线Routing的核心技巧布线不仅仅是连通更是保证电气性能的关键。线宽规则信号线0.25mm (10mil) 足够用于GPIO、I2C、SPI等。低功率电源线给传感器、单片机供电的3.3V/5V线使用0.5mm (20mil)。高功率电源线电池输入、Pyro输出、电机驱动电源必须加粗我使用了2mm (80mil)的线宽。即使这样在通过持续大电流如驱动镍铬丝时走线仍然会发热。对于极端情况可以考虑在顶层和底层同时走线并通过过孔阵列连接等效增加铜箔横截面积或者在焊盘上直接焊接一根导线来辅助载流。过孔的使用连接不同层时过孔尺寸要合理。对于大电流路径使用多个过孔并联。我的电池输入焊盘就使用了4个直径0.8mm的过孔。接地策略我采用了“星型接地”和“大面积铺铜”结合的方式。所有稳压器的地、单片机的地、模拟部分的地都先用单独的走线连接到电池输入的地端星型点然后再在这个基础上进行底层铺铜。这样可以避免大电流数字噪声通过地线干扰敏感的模拟电路。去耦电容布局每个IC的电源引脚附近都必须紧挨着放置一个0.1uF的陶瓷去耦电容104。这个电容的作用是为芯片瞬间的电流需求提供本地“小水库”路径越短效果越好。对于单片机通常在每组电源引脚附近都放置一个。3.3 设计检查与打样完成布线后利用Fusion 360的DRC设计规则检查功能检查线宽、间距、孔距等是否符合制造商的能力通常最小线宽/间距为6mil/6mil。然后导出Gerber文件包含各层铜箔、丝印、阻焊等信息的标准格式压缩成ZIP包。在PCB制造商网站上传Gerber文件后通常选择最基础的参数板厚1.6mmFR-4材料有铅喷锡焊接性好绿色阻焊油。对于这种功能性的飞行控制器不需要追求美观的沉金工艺。一周左右你就能拿到属于你自己的PCB了。4. 焊接、组装与系统调试拿到光亮的PCB只是第一步将它变成能工作的设备焊接和调试是关键。4.1 焊接顺序与技巧焊接顺序很重要原则是先焊矮的、小的、不怕热的再焊高的、大的、怕热的。贴片元件打头阵首先焊接所有的贴片电阻、电容、二极管。使用焊锡膏和热风枪可以快速完成没有风枪用烙铁细头也可以。接插件与立式元件焊接排针、排母、螺丝端子、LED、蜂鸣器等。注意排母的方向确保Teensy能正确插入。功率器件焊接MOSFET、稳压芯片、电机驱动模块的插针。给MOSFET焊接一小片散热片会更好。核心器件最后上最后焊接Teensy 4.1的排母、GPS模块和射频模块。这样避免在焊接其他部件时热风或烙铁不小心碰到这些精密器件。特别注意Teensy 4.1背面的PSRAM或Flash芯片如果需要自行焊接极具挑战。芯片引脚细密建议使用高质量的细尖烙铁头、助焊膏和吸锡线。可以参考PJRC官方的焊接视频或者直接购买已焊好芯片的版本。4.2 分模块上电测试绝对不要焊接完所有部件后直接整板上电必须分模块、分阶段测试。仅焊接电源部分焊接好电池接口、稳压芯片及其输入输出电容。上电前用万用表二极管档测量电池输入端的正反向电阻确保没有短路。然后上电测量3.3V、5V等输出电压是否正常。焊接单片机及最小系统焊上Teensy排母插入Teensy先不焊其他任何东西。通过USB供电看电脑是否能识别到串口。上传一个简单的Blink程序测试单片机是否工作正常。逐个添加外设每焊接或连接一个主要外设如SD卡模块、传感器就写一段简单的测试代码验证其基本功能。例如测试BMP388能否读出温度和压力测试MOSFET通道能否点亮一个12V灯泡代替E-match进行安全测试。Pyro通道安全测试这是高风险测试。务必在空旷、无易燃物的室外进行。使用一个假负载如一个12V/21W的汽车灯泡代替真实的E-match。测试时用万用表电流档串联在回路中观察触发瞬间的电流是否符合预期。同时用手触摸MOSFET和走线检查是否有异常发热。4.3 “电梯测试”与集成调试当所有硬件功能单独测试通过后需要进行系统集成测试也就是著名的“电梯测试”。编写测试固件固件需要模拟完整的飞行逻辑上电自检 - 等待发射检测持续加速度- 模拟上升段记录数据- 在预设高度或气压变化触发Pyro通道1Drogue- 继续下降 - 在更低高度触发Pyro通道2Main- 着陆后待机。同时用板载LED或蜂鸣器指示当前状态如快闪准备常亮上升慢闪下降双闪开伞。执行测试带着组装好的飞行计算机进入电梯。从一楼开始启动程序然后坐电梯到顶楼。电梯上升过程模拟火箭爬升气压减小下降过程模拟火箭降落气压增加。观察LED状态变化是否在预期高度发生同时用接在Pyro输出端的LED指示灯记得串联电阻观察是否正常点亮。数据分析测试后读取SD卡中记录的气压、温度、加速度数据在电脑上用Python或MATLAB绘制曲线检查数据是否连续、合理开伞触发点是否准确。我在这个阶段遇到了两个典型问题问题一Pyro通道大电流烧毁栅极电阻。如前所述在测试镍铬丝时发生了。排查发现电阻烧黑测量已断路。解决更换为更大功率如1W的电阻并重新评估了在持续大电流下直接使用PCB走线的可行性为关键功率路径增加了辅助导线。问题二Teensy无法用电池供电。排查测量发现当只接电池时Teensy的3.3V引脚有电但单片机不工作。检查原理图发现我错误地将板载5V稳压输出接到了Teensy的USB引脚仅供USB供电检测用而非Vin引脚。解决飞线将板载5V连接到Teensy的Vin引脚并在后续的PCB版本中修正了原理图。5. 固件架构与关键算法实现软件是飞行计算机的灵魂。我的代码采用分层、模块化的架构便于调试和扩展。核心逻辑在PlatformIO环境下用C编写。5.1 程序状态机飞行计算机的工作流程是一个清晰的状态机STATE_IDLE地面待机状态。进行传感器校准如加速度计零偏、陀螺仪零偏等待发射信号。发射信号可以由加速度计持续超标判断也可以由外部“发射准备”开关给出。STATE_POWERED_ASCENT动力上升段。发动机工作加速度极大。此阶段主要进行高速数据记录并作为开伞备份逻辑的输入如果气压计失效可用加速度积分估算高度。STATE_COASTING_ASCENT惯性上升段。发动机关闭火箭依靠惯性爬升至顶点。此阶段是传感器融合算法工作的主要阶段精确计算高度和速度。STATE_APOGEE顶点侦测与减速伞开伞。当垂直速度从正变负即开始下落时判定为顶点。延迟几十毫秒确保火箭姿态稳定后触发第一个Pyro通道打开减速伞。STATE_DROGUE_DESCENT减速伞下降段。继续监测高度。STATE_MAIN_DEPLOYMENT主伞开伞。当高度降至预设值如300米触发第二个Pyro通道打开主伞。STATE_MAIN_DESCENT主伞下降段。可以开启GPS定位并通过无线电广播位置方便回收。STATE_LANDED着陆状态。关闭所有非必要设备进入低功耗模式等待回收。5.2 高度解算与卡尔曼滤波这是飞行计算机最核心的算法。单纯依赖气压计读数计算高度会受噪声和动态压力影响特别是在高速上升阶段而单纯积分加速度计数据会产生严重的漂移。卡尔曼滤波正是融合两者优势、抑制各自缺点的最佳工具。我实现了一个简化的一维高度卡尔曼滤波器状态变量是高度和垂直速度。预测步骤利用加速度计数据减去重力加速度来预测下一时刻的速度和位置。速度 上一时刻速度 加速度 * 时间间隔高度 上一时刻高度 速度 * 时间间隔。这个过程会引入误差噪声用过程噪声协方差矩阵Q来描述。更新步骤当新的气压高度测量值到来时与预测的高度进行比较。卡尔曼滤波器会根据预测的不确定性和测量的不确定性用测量噪声协方差矩阵R描述计算一个最优的“卡尔曼增益”。这个增益决定了我们是更相信预测值还是测量值。然后用这个增益来更新状态估计得到一个比单纯预测或单纯测量都更准确的高度和速度值。// 极度简化的伪代码展示概念 void kalmanUpdate(float accelZ, float baroAltitude, float dt) { // 1. 预测 verticalVelocity (accelZ - 9.81) * dt; // 减去重力 estimatedAltitude verticalVelocity * dt; // ... 更新误差协方差 P F * P * F^T Q // 2. 更新 float innovation baroAltitude - estimatedAltitude; float kalmanGain P / (P R); // 简化计算 estimatedAltitude kalmanGain * innovation; verticalVelocity kalmanGain * (innovation / dt); // 同时更新速度 // ... 更新误差协方差 P (1 - kalmanGain) * P }参数调校Q和R是滤波器的“调谐旋钮”。Q大表示系统模型不准确加速度计噪声大滤波器会更信任气压计R大表示气压计测量噪声大滤波器会更信任预测值。需要通过实际飞行或模拟数据如电梯测试数据反复调整这两个参数直到输出曲线既平滑又响应迅速。5.3 数据记录与可靠性设计飞行数据是分析故障、改进设计的唯一依据。必须保证在强烈振动和可能断电的情况下不丢失。双缓冲写入SD卡不要在中断服务程序或高速循环中直接调用file.print()。我开辟了两个512字节的内存缓冲区。传感器数据不断填入缓冲区A当缓冲区A满立即切换至缓冲区B进行填充同时在主循环中异步地将缓冲区A的数据写入SD卡。这避免了因写卡速度慢而阻塞数据采集。QSPI Flash即时备份在判定进入关键事件如点火、开伞前后几秒我将关键数据快照时间、高度、速度、加速度、系统状态同时写入板载的QSPI Flash。即使SD卡因振动松动这部分核心数据依然存在。文件系统与掉电保护每次上电创建一个以时间戳命名的新文件。在每次写入SD卡后调用file.flush()强制将数据从缓存写入物理卡但不宜过于频繁以免影响寿命。更好的做法是使用带有掉电保护功能的SD卡模块或者使用更健壮的文件系统如LittleFS。5.4 遥测与地面站我使用一个简单的LoRa射频模块如SX1278进行数传。传输的数据包经过精心设计包含火箭ID、状态、经纬度、高度、垂直速度、电池电压等关键信息。传输协议包含前导码、包长度、校验和以提高抗干扰能力。地面站是一个运行在笔记本电脑上的Python程序通过USB转串口连接另一个LoRa模块。它实时解析数据包显示在图形界面上并存储到本地文件。在火箭降落后可以通过地面站发送指令让火箭 beacon 发出声音或点亮LED便于寻找。6. 飞行测试、问题复盘与未来展望这台飞行计算机的首飞是一次部分成功的经历。火箭按计划起飞加速上升段、惯性段、顶点侦测、减速伞开伞所有动作都精准执行。数据记录显示卡尔曼滤波估算出的高度曲线非常平滑顶点判断准确。然而问题出在机械部分。主伞一个朋友制作的罗加洛滑翔伞的伞包与伞绳发生了缠绕导致主伞未能正常抛出。火箭仅靠减速伞减速最终以较高的速度撞击地面。幸运的是箭体结构吸收了大部分冲击电子舱完好无损飞行计算机幸存了下来。事后复盘与教训机械可靠性高于一切再精密的电子系统也可能被一个简单的机械故障击败。伞绳的收纳、伞包的设计、开伞火药的安装方向都需要经过反复、严格的测试。下次我会考虑使用“伞绳套筒”或“伞绳梳理板”来避免缠绕。数据记录至关重要首飞时板载Flash日志功能尚未完全实现。SD卡在撞击瞬间因振动停止了记录导致丢失了最关键着地前后的数据。这让我深刻意识到冗余记录系统的必要性。未来的设计必须保证在任何单点故障下核心数据不丢失。测试测试再测试电梯测试模拟了高度变化但无法模拟火箭飞行中复杂的振动、旋转和加速度环境。未来需要制作一个“摇表”或使用大功率振动电机对装配好的电子舱进行振动测试提前发现虚焊、连接器松动等问题。这个项目远未结束。下一步我将完善Flash数据记录优化卡尔曼滤波参数并开始集成滑翔伞的舵面控制算法。看着自己设计的电路板搭载着自己编写的代码控制着火箭完成一系列复杂的动作这种成就感是无与伦比的。它不仅仅是一个控制器更是通往更广阔航空航天探索世界的一把钥匙。希望我的这些经验与教训能为你点燃同样的火花。