← 返回全部文章

ESP32也能造无人机:Flix详细教程

一套能从裸板、仿真一路做到真机试飞的 ESP32 四旋翼项目。这里把适合谁、硬件清单、烧录、校准、无桨检查和首次试飞一次讲清。

成品无人机负责飞,Flix 负责把“为什么能飞”摊开给你看。

这是一套基于 ESP32 的四旋翼项目。飞控固件采用 Arduino 风格,主循环约 1000Hz,里面有 IMU 读取、姿态估计、级联 PID 、电机混控、 MAVLink 遥测和失控保护。手机、 USB 手柄、 SBUS 遥控器都能控制,QGroundControl 可以看姿态和改参数,Gazebo 还能先在电脑里试飞。

它有一定门槛:要写固件、焊 MOSFET 、检查电机方向、校准 IMU,还要处理锂电池和高速旋翼。想买一台开箱即飞的航拍机,可以直接跳过。想把飞控拆开学明白,这套项目很合适。

哪些人适合试

比较适合:

  • 学过一点 Arduino 或 ESP32,想继续碰机器人、嵌入式和控制算法的人;
  • 正在学 IMU 、姿态解算、四元数、 PID 、 MAVLink 的学生;
  • 有电烙铁、万用表和 3D 打印条件的创客;
  • 想给课程、创客营做一套可拆解无人机实验的老师;
  • 计划用 Python 读取遥测、改参数或做自动飞行实验的人。

暂时不适合:

  • 只想开箱起飞,不想调试硬件的人;
  • 需要 GPS 定点、自动航线、成熟位置控制或商业级可靠性的人;
  • 没有锂电池和旋翼安全经验,又准备独自操作的低龄用户;
  • 希望直接下载编译好的固件包的人。当前 v1.5 Release 只有源码包,需要自行编译。

别急着买齐零件,先走三条试用路径

最低成本的办法是一块裸 ESP32 。 Flix 允许在没有 IMU 和电机的板子上烧录,启动后应出现名为 flix 的 Wi-Fi,命令行和 QGroundControl 基础连接也能测试。

第二条路是 Gazebo 11 仿真。官方推荐 Ubuntu 20.04,适合先理解飞行模式、摇杆输入和参数变化。较新的 macOS 对这套旧版 Gazebo 支持不理想。

第三条路才是完整硬件,而且先拆桨检查。这样能把 USB 驱动、编译环境、 Wi-Fi 、 IMU 和电机问题分开处理,排错省很多时间。

准备哪些硬件

一套常见组合包括:

  • ESP32 Mini 、 ESP32-S3 或 ESP32-C3 开发板 1 块;
  • GY-91(MPU-9250/6500)、 ICM-20948 或 GY-521(MPU-6050)IMU 1 块;
  • 8520 、 3.7V 有刷电机 4 个;
  • 55mm 或 65mm 螺旋桨 4 片;
  • UMW 100N03A MOSFET 4 个、 10kΩ 电阻 6 个;
  • 3.7V Li-Po 电池,建议至少 25C,并核对实际持续放电电流;
  • 28AWG 导线、 MX2.0 2P 插头、充电器和螺丝;
  • 3D 打印机架、 ESP32 固定座和 IMU 垫片。

工具至少要有电烙铁、焊锡、助焊剂、万用表和螺丝刀。 ICM-20948 等模块只能接 3.3V 时,别接到 5V/VIN 。电机要买准确标称 3.7V 的型号,轴径也要和桨孔匹配。

详细教程:从烧录到首次试飞

第一步:下载源码

git clone https://github.com/okalachev/flix.git
cd flix

想复现本次教程,可锁定到核验时的提交:

git checkout d64bf24c6d1b18e7b9ef7093c395ac176568118c

也可以下载 v1.5 源码 ZIP 。 Release 页面没有可直接烧录的 .bin

第二步:配置 Arduino IDE

  1. 安装 Arduino IDE 2;
  2. 安装 ESP32 Arduino Core 3.3.10
  3. 在 Library Manager 安装最新版 FlixPeriph
  4. 安装 MAVLink 2.0.25
  5. 打开 flix/flix.ino
  6. ESP32 Mini 选择 WEMOS D1 MINI ESP32
  7. Tools → Core Debug LevelError
  8. ESP32-S3/C3 把 USB CDC on Boot 设为 Enabled
  9. 选择串口并上传。

喜欢命令行也可以直接运行:

make
make upload
make upload monitor

ESP32-S3 示例:

make BOARD=esp32:esp32:esp32s3:DebugLevel=error,FlashSize=4M,CDCOnBoot=cdc upload

第三步:先做裸板验证

烧录后打开串口监视器,波特率设为 115200,输入:

help

能看到命令列表,并能搜到 flix Wi-Fi,说明编译、 USB 和无线部分已经跑起来。默认 Wi-Fi 密码是:

flixwifi

装好后应修改默认 SSID 和密码:

ap my-flix-ssid mypassword123
p WIFI_MODE 1

参数在重启后生效。

第四步:打印机架并焊接

官方仓库提供主机架 STL/STEP 、 ESP32 固定座和 IMU 垫片。主机架建议用 0.2mm 层高、 0.4mm 线宽和 100% 填充。默认孔位更适合 GY-91,换其他 IMU 时可能要改孔位。

ESP32 Mini 与 IMU 的常用 SPI 接线:

  • GND → GND
  • 3.3V → 3.3V
  • SCL/SCK → GPIO18
  • SDA/MOSI → GPIO23
  • SAO/MISO → GPIO19
  • NCS → GPIO5

四路电机通过 MOSFET 驱动,默认 GPIO 为:后左 12、后右 13、前右 14、前左 15。每路 MOSFET 要配下拉电阻。

仓库的早期装配照片使用过一套反向电机方案。机械结构可以照着看,电机位置、转向和桨型请以当前接线表及 motors.svg 为准。

第五步:选对 IMU 型号

打开 flix/imu.ino。默认配置是:

MPU9250 imu(SPI);

ICM-20948 改为:

ICM20948 imu(SPI);

MPU-6050 改为:

MPU6050 imu(Wire);

改完重新编译上传。

第六步:连接 QGroundControl

  1. 给无人机上电;
  2. 电脑或手机连接 flix Wi-Fi;
  3. 启动 QGroundControl;
  4. 软件应自动显示姿态和遥测。

无线命令行入口:

Vehicle Setup → Analyze Tools → MAVLink Console

如果一直连不上,检查防火墙或 VPN 有没有拦截通信。

第七步:设置 IMU 朝向并校准

QGroundControl 参数页里有三个方向参数:

IMU_ROT_ROLL
IMU_ROT_PITCH
IMU_ROT_YAW

默认值为:

0
0
1.571

IMU 的实际安装方向不同,参数也要跟着调整。进入控制台运行:

ca

按提示依次把机身水平、机头朝上、机头朝下、右侧卧、左侧卧和倒置,每个姿态保持约 8 秒。

第八步:拆桨检查 IMU

首次检查前先拆掉四片桨。控制台输入:

imu

正常情况包括:status: OK,采样率接近 1000Hz;移动机身时 accelgyro 会变化;静止放置时 landed = 1,拿起后变成 0

第九步:用电池检查四个电机

USB 供电带不动电机,电机测试要接电池,同时保持无桨状态。分别输入:

mfr
mfl
mrl
mrr

它们对应前右、前左、后左、后右。逐个确认位置和旋转方向。若位置或方向不对,先修接线,别用软件参数硬顶。

第十步:配置遥控方式

手机最省事:QGroundControl 里启用 Virtual Joystick,关闭 Auto-Center Throttle。操纵过于灵敏时,可适当降低:

CTL_TILT_MAX

USB 手柄需要在 Vehicle Setup → Joystick 完成校准。 SBUS 接收机可以先设置接收 GPIO,再看通道并校准:

p RC_RX_PIN 4
rc
cr

第十一步:低高度首次试飞

装桨前再核对四个电机的位置、方向和 A/B 桨型。第一次选择开阔、无人、没有易碎物的场地,戴护目镜,先用很小油门做低高度测试。

默认摇杆布局:左摇杆控制油门和偏航,右摇杆控制俯仰和横滚。左摇杆推到右下角解锁,推到左下角上锁。

默认 STAB 只稳定姿态,不保持位置,轻微漂移需要手动修正。RAW 主要用于测试,正常飞行很难控制。AUTO 可能在有推力指令时自动解锁,写 Python 自动控制前先在仿真和无桨状态验证。

还没焊硬件,可以先跑仿真

官方 Gazebo 路径适合学习控制流程。 Ubuntu 20.04 上准备 Gazebo 11 、 CMake 、编译工具和 SDL2,再按 gazebo/README.md 构建。仿真会复用 Arduino 固件逻辑,手柄输入、飞行模式和参数调整都可以练。

Python 侧安装 pyflix

pip install pyflix

读取遥测和执行命令:

from pyflix import Flix

flix = Flix()
print(flix.connected)
print(flix.attitude_euler)
print(flix.voltage)
print(flix.cli("imu"))

自动姿态控制示例:

flix.set_mode("AUTO")
flix.set_attitude([0.1, 0.2, 0.3], 0.6)
flix.set_attitude([0, 0, 0], 0)

最后一行把推力归零。真机上执行前,先确认失控保护、遥控接管和场地安全。

这几个限制要提前知道

  • 位置控制仍在计划中,set_positionset_velocity 目前不可用;
  • 默认飞行日志存在 RAM,约 100Hz 、约 10 秒,断电后不能当长期黑匣子;
  • Flix2 PCB 仍在开发;v1.5 的板载 IMU 没有正常工作,实际测试使用了外接 MPU-6050;
  • 固件主循环是单线程,飞行命令里调用阻塞式 delay() 可能导致坠机;
  • 仓库 README 将项目标为开源,但根目录当前没有 LICENSECOPYING。引用图片和代码时保留来源,商业使用前最好联系项目维护者确认授权。

Flix 的乐趣在调试过程:先让一块 ESP32 出现 Wi-Fi,再看到 QGroundControl 的姿态跟着机身动,接着逐个电机转起来。做到这一步,飞控已经从黑盒变成了一串能测、能改、能解释的步骤。

你会先走裸板、 Gazebo 仿真,还是直接焊一台真机?

来源:https://github.com/okalachev/flix