基于STM32F103C8T6与GY521模块自制NAZE32兼容飞控全攻略
1. 项目概述与核心价值
如果你玩过或者听说过穿越机,那你对“飞控”这个词一定不陌生。它是飞行器的“大脑”,负责处理传感器数据、执行飞行算法、输出控制信号。市面上成熟的飞控板,比如NAZE32、F3、F4甚至F7系列,性能强大但价格也相对较高。很多新手在入门时,面对炸机(坠毁)的风险,难免会心疼设备。今天分享的这个项目,就是教你如何用最基础、最廉价的硬件——一块十几块钱的STM32F103C8T6“蓝色小药丸”开发板和同样便宜的GY521模块,亲手打造一块功能完整的NAZE32兼容飞控板。
这不仅仅是为了省钱。对于电子爱好者、嵌入式学习者或者想深入理解飞控原理的玩家来说,从零开始搭建一个飞控系统,其学习价值远超直接购买成品。你将亲手焊接电路、配置固件、理解PID控制、调试传感器,整个过程是对嵌入式开发、传感器融合、控制理论的一次绝佳实践。最终,这块自制的飞控板可以完美运行Betaflight或Cleanflight这类开源飞控固件,让你的穿越机、小四轴飞起来。我们用的STM32F103C8T6是ARM Cortex-M3内核,72MHz主频,64KB Flash,20KB RAM,性能足以应对基础的飞控算法;GY521模块则集成了MPU6050芯片,提供三轴加速度计和三轴陀螺仪数据,是飞控感知姿态的核心。
2. 硬件选型与核心原理剖析
2.1 为什么是STM32F103C8T6和GY521?
选择这两者组合,是成本、性能、生态和可玩性之间的最佳平衡点。
STM32F103C8T6开发板,常被称为“蓝色小药丸”或“最小系统板”,几乎是嵌入式入门的神器。其核心优势在于:
- 极致性价比:单价通常在10-20元人民币,即便烧坏也不心疼,非常适合反复实验。
- 完善的生态:基于ARM Cortex-M3,有成熟的Keil、IAR、STM32CubeIDE等开发环境,以及丰富的HAL库和标准库支持。更重要的是,它被开源飞控固件(如Betaflight)广泛支持,有现成的目标(Target)配置文件。
- 性能足够:72MHz的主频和64KB Flash,对于运行Baseflight、早期Betaflight或Cleanflight固件绰绰有余。它拥有多个定时器,可以生成多路PWM/PPM信号驱动电调,USART用于接收机通信,I2C和SPI用于连接传感器。
- 引脚兼容性:其引脚排列与NAZE32 Rev5/6等经典飞控板有很高的相似度,这为我们“复刻”硬件连接和固件配置提供了极大便利。
GY521模块,核心是InvenSense的MPU6050传感器芯片。它是飞控姿态解算的“眼睛”和“耳朵”。
- 六轴运动处理:集成了三轴MEMS陀螺仪和三轴MEMS加速度计。陀螺仪测量角速度(机体旋转的快慢),加速度计测量比力(包含重力加速度和运动加速度)。
- 内置DMP:这是MPU6050的一大亮点。数字运动处理器(DMP)可以在芯片内部进行传感器数据融合和解算,直接输出稳定的四元数或欧拉角,极大减轻了主控MCU的运算负担。对于资源有限的STM32F103来说,启用DMP是获得流畅飞行体验的关键。
- 标准I2C接口:通过SCL和SDA两根线即可与主控通信,连接简单。
两者的协作关系:GY521模块通过I2C总线将原始的或经过DMP处理的传感器数据实时发送给STM32。STM32运行飞控固件,固件中的算法(如互补滤波、Mahony或Madgwick滤波)进一步融合这些数据,计算出飞行器当前精确的姿态角(Roll横滚, Pitch俯仰, Yaw偏航)。同时,STM32通过USART接收来自遥控器的指令,根据目标姿态和当前姿态的偏差,经过PID控制器运算,最终通过定时器产生相应占空比的PWM信号,发送给四个电调,从而控制电机转速,实现稳定飞行或执行特技动作。
2.2 硬件连接与电路设计要点
自制飞控,硬件连接是第一步,也是最容易出错的一步。下图清晰地展示了STM32F103C8T6与GY521模块及其他关键外设(接收机、电调)的连接关系。请务必对照你的开发板原理图进行核对,因为不同厂商的“蓝色小药丸”板载LED和复位按钮的引脚可能不同。
核心连接表:
| STM32F103C8T6 引脚 | 连接至 | 功能说明 | 备注 |
|---|---|---|---|
| 3.3V | GY521 VCC | 电源正极 | 绝对禁止接5V,会烧坏MPU6050! |
| GND | GY521 GND | 电源地 | 共地至关重要 |
| PB6 | GY521 SCL | I2C时钟线 | 需配置为上拉模式 |
| PB7 | GY521 SDA | I2C数据线 | 需配置为上拉模式 |
| PA2 (USART2_TX) | 接收机 RX (信号输入) | 串口发送 | 用于SBUS/PPM等串行接收机信号 |
| PA3 (USART2_RX) | 接收机 TX (信号输出) | 串口接收 | 注意,接收机输出接MCU的RX |
| PA0~PA3 或 PB6~PB9 | 电调1~4 | PWM信号输出 | 具体引脚取决于固件配置,常用PA0, PA1, PA2, PA3 |
重要提示:上表是原理性连接。实际焊接或杜邦线连接时,务必先断开电源。STM32F103的I/O口容忍5V电压,但GY521的VCC必须接3.3V。如果你的接收机是5V电平(如很多PWM接收机),其信号线可以直接连接STM32的引脚。但如果使用SBUS接收机,需要注意其输出电平是否为3.3V兼容,否则可能需要电平转换模块。
电源方案: 一个可靠的飞控需要干净的电源。建议的方案是:使用一块2S或3S锂电池(7.4V-11.1V)作为总电源。该电源直接供给四个电调。同时,从任意一个电调的“BEC”(电池消除电路)输出端(通常是5V)取电,接入STM32开发板的“5V”输入引脚,为整个控制板供电。GY521模块则从STM32板上的3.3V引脚取电。这种方案避免了电机大电流波动对飞控电路的干扰。
3. 软件环境搭建与固件编译
硬件连接好后,我们需要给STM32“注入灵魂”——刷写飞控固件。这里我们选择最流行的Betaflight固件,因为它功能强大、社区活跃、文档丰富。
3.1 开发与刷写工具准备
- Betaflight Configurator:这是地面站软件,用于配置和调参。从Betaflight官网下载对应你操作系统的版本(Windows/macOS/Linux)并安装。
- 编译器工具链:我们需要自己编译固件。推荐使用
arm-none-eabi-gcc工具链。在Windows上,最简单的方法是安装“Betaflight - 已发布”版本中的在线集成环境,或者使用MSYS2/MinGW来安装。 - 源码获取:从GitHub克隆Betaflight固件源码。我们不需要最新版,选择一个对STM32F103支持稳定的版本,例如
4.3.x或4.4.x分支。git clone https://github.com/betaflight/betaflight.git cd betaflight # 查看并切换到一个稳定分支,例如 git checkout 4.4.3 - 刷写工具:STM32F103支持串口(USART)刷写,即通过Bootloader。你需要一个USB转TTL串口模块(如CH340、CP2102)。也可以使用ST-Link V2编程器,速度更快更稳定,推荐使用。
3.2 固件配置与编译
这是核心步骤,我们需要告诉编译器,我们的硬件目标是“NAZE32”,并且引脚映射要匹配我们的实际连接。
进入源码配置界面:
make config这会打开一个文本菜单界面。
选择目标(Target):在列表中,我们需要找到与NAZE32最接近且基于STM32F103的目标。通常是
NAZE或AFROMINI。但为了更精确,我们可以查看src/main/target/目录下的文件。对于我们的“蓝色小药丸”,一个常用的目标是OMNIBUS系列中基于F103的变体,或者直接使用NAZE目标,然后修改资源映射。更简单的方法是使用社区已有的自定义目标。这里我们假设使用NAZE目标。 在make config界面中,导航并选择NAZE。关键:修改资源映射(Resource Remapping)标准NAZE的引脚定义可能和我们的开发板不一致。例如,NAZE的电机输出引脚可能是PB6, PB7, PB8, PB9,而我们的开发板可能将这些引脚用于其他功能(如I2C)。我们需要修改
target.c文件。 找到src/main/target/NAZE/target.c文件。我们需要修改motorConfig_t和timerHardware_t等部分,将电机PWM输出映射到我们实际连接的引脚上,比如PA0, PA1, PA2, PA3。 这是一个需要耐心对照原理图和数据手册的过程。例如,将电机1的资源从PB6改为PA0:// 原配置可能类似 // { TIM4, IO_TAG(PB6), TIM_Channel_1, TIM4_IRQn, 1, IOCFG_AF_PP, GPIO_PinSource6, GPIO_AF_2 }, // M1 // 修改为 { TIM2, IO_TAG(PA0), TIM_Channel_1, TIM2_IRQn, 1, IOCFG_AF_PP, GPIO_PinSource0, GPIO_AF_1 }, // M1 - PA0务必注意:引脚、定时器(TIMx)和通道(TIM_Channel_x)的对应关系是固定的,不能随意分配。需要查阅STM32F103的数据手册,确定哪个定时器的哪个通道对应哪个引脚。PA0对应TIM2的通道1是标准映射。
配置其他功能:在
make config中,确保以下选项已启用:GYRO_MPU6050:启用MPU6050陀螺仪。MAG:如果你后续想加装磁力计(如HMC5883L),可以启用,但GY521没有。BARO:气压计,非必需。SERIAL_RX:启用串行接收机。RX_SBUS/RX_IBUS/RX_SPEKTRUM:根据你的接收机协议选择。BLACKBOX:如果需要飞行日志,可以启用,但STM32F103的Flash空间紧张,需谨慎。
编译固件:
make NAZE如果一切顺利,编译完成后会在
obj/目录下生成betaflight_NAZE.hex或betaflight_NAZE.bin文件。
3.3 刷写固件到开发板
- 进入Bootloader模式:STM32F103可以通过将
BOOT0引脚拉高(接3.3V),BOOT1拉低(接GND),然后复位来进入系统存储器启动模式,从而允许通过USART1(PA9/PA10)刷写固件。更简单的方法是使用ST-Link。 - 使用ST-Link刷写(推荐):
- 连接ST-Link的SWDIO、SWCLK、GND、3.3V到开发板对应引脚。
- 使用
STM32 ST-LINK Utility或OpenOCD命令行工具进行刷写。 - 以OpenOCD为例:
这条命令会连接、擦除、编程、校验并复位芯片。openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c "program obj/betaflight_NAZE.hex verify reset exit"
- 使用串口刷写:
- 将USB-TTL的RX接STM32的PA9(TX),TX接PA10(RX),GND互连。
- 让STM32进入Bootloader模式。
- 使用
betaflight-configurator的“固件烧写工具”页面,选择本地编译好的.hex文件,选择正确的串口,进行刷写。
刷写成功后,给飞控重新上电(退出Bootloader模式),用USB线连接电脑和STM32开发板的USB口(如果板载了USB转串口芯片),打开Betaflight Configurator,应该就能识别并连接到你的自制飞控了。
4. Betaflight基础配置与传感器校准
首次连接Betaflight Configurator,会有一系列必要的设置。这个过程就像给新电脑安装驱动和系统设置。
4.1 端口(Ports)配置
这是最容易出错的地方之一。在端口选项卡:
- USB虚拟串口(VCP):确保开启,波特率115200。这是地面站通信的通道。
- UART2:这是我们连接接收机的串口。打开对应的“串行接收机”开关,并根据接收机协议选择(如SBUS)。波特率可以保持自动。
- 其他UART:根据你后续是否要加装GPS、图传等设备进行配置。
4.2 配置(Configuration)选项卡
- 飞控和传感器方向:如果你的飞控板安装方向不是箭头朝前,你需要在这里设置板载陀螺仪/加速度计和磁力计(如果有)的偏转角度(如90, 180, 270度)。你可以通过晃动飞控,观察软件中3D模型的移动方向是否与实际一致来验证。
- 电调协议:选择你电调支持的协议。对于自制飞控和普通电调,通常选择
PWM或Oneshot125。DShot需要硬件定时器支持更精确,STM32F103可能资源紧张。 - 接收机:选择你的接收机类型(如
串行接收机),以及具体的协议(如SBUS)。 - 其他设置:如电机怠速转速、飞行器类型(四轴X模式)等。
4.3 传感器校准
这是保证飞行稳定的基石。在校准页面或通过CLI命令进行。
- 加速度计校准:将飞控板绝对水平放置在桌面上,点击“校准加速度计”。完成后,软件中的水平线应该变绿。
- 陀螺仪校准:保持飞控板完全静止,点击“校准陀螺仪”。这会将当前的角速度读数设为零点。
实操心得:传感器校准必须在飞控板供电稳定、且远离强磁场(如电机、扬声器)的环境下进行。校准过程中切勿移动飞控。每次固件更新或飞控板位置变动后,都应重新校准。
4.4 电机排序与测试
在电机选项卡,务必先取下螺旋桨!
- 点击“我已了解风险”后,拖动单个电机的滑块,观察对应的电机是否转动,并确认转向是否正确(根据你设计的机架类型,通常是电机1和4逆时针,电机2和3顺时针)。如果转向错误,需要交换电调连接电机的任意两根线。
- 确认所有电机都能被独立控制,且怠速平稳。
5. PID调参与首次飞行注意事项
飞控刷好、基础配置完成后,你的自制飞控已经具备了飞行能力。但默认的PID参数可能不适合你的机架,需要进行调整以获得稳定、跟手的飞行体验。
5.1 PID基础概念与调整策略
PID是比例(Proportional)、积分(Integral)、微分(Derivative)控制的缩写,是飞控保持姿态稳定的核心算法。
- Roll/Pitch轴的PID:这两个轴通常使用相同的参数。
- P值(比例):决定飞控对姿态误差的反应强度。P值太低,飞行器反应迟钝,像“喝醉了”;P值太高,会产生高频振荡(抖动),表现为机臂或图传画面快速震动。调整P值时,应逐步小幅增加,直到观察到轻微振荡,然后回调5-10%。
- I值(积分):用于消除静态误差。例如,在有风或电机推力不完全对称时,飞行器可能会缓慢漂移,I值可以累积这种小误差并修正它。I值过高可能导致“I值累积”,在快速打杆后飞行器会反向“抽动”一下。
- D值(微分):预测未来误差,起到阻尼作用,抑制P值引起的振荡。它能让你在急转弯或急停时更稳定。但D值过高会放大电机噪声和陀螺仪噪声,导致电机发热甚至产生高频噪音。
- Yaw轴的PID:偏航轴通常比较“温和”,P和I值比Roll/Pitch小很多,D值经常为0或很小。
5.2 针对自制飞控的调参要点
- 从默认值开始:Betaflight为不同预设提供了不错的默认PID。对于我们的STM32F103+GY521组合,可以从“Racer”或“Freestyle”预设开始。
- 优先调整P值:进行小幅度的左右横滚或前后俯仰,观察飞行器的反应。如果反应迟钝,缓慢增加P值(每次增加0.2-0.5)。如果出现抖动,则降低P值。
- 关注滤波设置:STM32F103算力有限,传感器噪声可能更明显。在
PID调校选项卡中,可以适当开启或调整陀螺仪的低通滤波和动态滤波,能有效抑制高频噪声,让飞行更平滑,有时比盲目调D值更有效。 - 使用黑匣子(Blackbox):如果Flash空间允许,强烈建议开启黑匣子日志功能。通过分析日志,你可以清晰地看到陀螺仪数据、PID输出和电机指令,精准定位是P值振荡还是D值噪声,或是电机响应问题。这是从“凭感觉调参”到“数据驱动调参”的关键一步。
5.3 首次飞行安全检查清单
在第一次真正离地飞行前,请逐项核对:
- [ ]螺旋桨安装:确认螺旋桨型号与电机KV值匹配,安装牢固,方向正确(正反桨)。
- [ ]遥控器对频与通道映射:在
接收机选项卡确认打杆时,各通道(AETR1234)响应正确,范围在1000-2000us之间,中位1500。 - [ ]解锁测试:在安全无桨状态下,尝试遥控器解锁组合(通常为油门最低+方向最右)。观察电机是否进入怠速状态。紧急情况下能通过油门最低+方向最左或遥控器上的紧急开关(如果设置了)成功上锁。
- [ ]电机转向与顺序:最后确认一次电机转向和顺序完全正确。
- [ ]飞行模式:至少设置一个“自稳(Angle)”模式开关,用于首次起飞。熟练后再尝试“半自稳(Horizon)”或“手动(Acro)”。
- [ ]场地安全:选择开阔、无人的草坪进行首飞。远离人群、建筑物和电线。
- [ ]电池电量:确保电池满电,各电芯电压平衡。
- [ ]心理准备:首次飞行以低空(1-2米)悬停和简单平移为主,感受飞行器姿态。操作要柔和,随时准备切回自稳模式或紧急上锁。
6. 进阶优化与故障排查实录
当你的自制飞控能够稳定飞行后,可以尝试一些优化和功能扩展。同时,这里也汇总了一些常见问题的排查思路。
6.1 性能优化与功能扩展
- 启用DMP(数字运动处理器):在Betaflight的CLI中,可以通过命令启用MPU6050的DMP,将姿态解算任务卸载到GY521模块内部,能显著降低STM32的CPU占用率,可能获得更流畅的响应。命令通常为
set gyro_to_use = DMP或需要在固件编译时启用相关选项。启用后需重新校准传感器。 - 尝试更高阶的滤波器:如果CPU还有余量,可以尝试启用“动态陀螺仪滤波”或调整滤波器的截止频率,进一步优化飞行手感。
- 加装蜂鸣器:将一个有源蜂鸣器连接到STM32的一个空闲GPIO和GND,并在Betaflight中配置为“BEEPER”。这样可以通过遥控器开关让飞控鸣叫,在炸机后寻找飞机非常有用。
- 加装LED指示灯:类似地,可以连接LED灯带,配置为飞行状态指示灯(如解锁后常亮,失控时闪烁)。
6.2 常见问题与排查技巧
问题1:Betaflight地面站无法连接
- 检查:USB线是否完好?电脑是否识别到COM口(设备管理器)?飞控板供电是否正常(板载LED亮)?
- 排查:尝试更换USB口或USB线。在设备管理器中查看端口号,在地面站手动选择。确保没有其他软件(如串口助手)占用了该COM口。
问题2:陀螺仪/加速度计数据异常或无法识别
- 检查:GY521模块的VCC是否接3.3V?I2C线(SDA, SCL)是否接对?是否接触不良?
- 排查:在CLI中输入
status命令,查看传感器状态。输入i2c probe扫描I2C总线,看是否能找到MPU6050的地址(通常是0x68)。如果找不到,检查焊接或杜邦线连接。
问题3:接收机无信号
- 检查:接收机是否对频成功?是否供电(通常从飞控的5V取电)?信号线是否接在正确的UART RX引脚上?
- 排查:在
接收机选项卡,切换不同的串行接收机协议(SBUS, iBUS, SPEKTRUM等)试试。检查端口设置中,对应UART的“串行接收机”开关是否打开。用万用表测量接收机信号线电压,在打杆时应有脉宽变化。
问题4:电机不转或转动异常
- 检查:电调是否校准?电调信号线是否连接正确?电机排序是否正确?
- 排查:重新进行电调校准(具体方法参考电调说明书)。在
电机选项卡中测试单个电机是否响应。检查飞控与电调之间的接地是否良好。如果某个电机完全不转,交换一个已知好的电机和电调测试,以确定是电机问题还是电调问题。
问题5:飞行中剧烈抖动或振荡
- 检查:螺旋桨是否平衡、有无损伤?电机是否松动?机架是否有共振?
- 排查:首先进行无桨状态下的电机测试,用手轻轻触碰机臂,感受是否有异常振动。在
黑匣子日志中查看陀螺仪数据,如果看到某个轴有规律的高频尖刺,很可能是机械共振。可以尝试增加该轴陀螺仪硬件的低通滤波频率,或者在机臂与电机之间加装防震垫。如果是低频的“游泳”式晃动,则可能是P值过低或I值需要调整。
问题6:飞行器向一个方向持续漂移
- 检查:加速度计是否在绝对水平状态下校准?飞控安装位置是否水平?
- 排查:重新进行精确的水平加速度计校准。在
传感器页面,观察飞机静止时,俯仰和横滚角是否接近0度。如果不是,可以尝试在配置页面的“飞控和传感器方向”中进行微调补偿,或者更彻底地,重新进行水平校准。
这个用STM32F103C8T6和GY521自制NAZE32飞控的项目,从硬件焊接、软件编译到参数调试,完整地走通了一个嵌入式产品从原型到可用的全过程。它带给你的绝不仅仅是一块能飞的板子,更是对嵌入式系统、实时控制、传感器应用和问题排查能力的全面提升。每一次炸机后的排查,每一次参数调整后的试飞,都是宝贵的经验。当你最终看到自己亲手打造的飞控带着飞机平稳升空,那种成就感是购买任何成品都无法替代的。