核心概念:无人机如何飞行?
一个无人机能稳定飞行,主要依赖于一个叫做姿态控制的系统,其核心思想是负反馈控制。

(图片来源网络,侵删)
- 感知: 无人机需要一个“大脑”来知道自己的当前姿态(是否倾斜?倾斜了多少?),这个“大脑”就是陀螺仪和加速度计(通常集成在一个叫做 MPU6050 的传感器中)。
- 计算: Arduino 读取传感器的数据,计算出无人机当前的姿态(俯仰角、横滚角、偏航角)。
- 比较: Arduino 将计算出的当前姿态与目标姿态(通常是水平飞行,即所有角度都为0)进行比较,得到一个误差。
- 控制: Arduino 根据这个误差,使用PID 控制器计算出修正这个误差所需的电机输出功率。
- 执行: Arduino 将计算出的功率值发送给电调,电调再控制无刷电机的转速,从而产生升力,使无人机恢复到目标姿态。
这个过程以极高的速度(通常是几百到上千次/秒)不断循环,从而实现无人机的稳定悬停。
硬件清单
在开始写代码之前,你需要准备以下硬件:
-
主控制器:
- Arduino Mega 2560: 强烈推荐,因为它有足够的硬件串口,可以轻松连接遥控器、蓝牙模块和地面站,避免软件串口带来的冲突和延迟。
- 备选: Arduino Uno (需要更复杂的串口管理) 或 STM32 (性能更强,但开发环境不同)。
-
传感器:
(图片来源网络,侵删)- MPU6050: 6轴运动处理单元(3轴加速度计 + 3轴陀螺仪),用于获取姿态数据。
-
电机和动力系统:
- 4个无刷电机: 根据你的无人机大小选择合适尺寸和 KV 值的电机。
- 4个电调: 电子调速器,接收 Arduino 的 PWM 信号,控制无刷电机的转速,确保电调支持你的遥控器和 Arduino 的 PWM 协议(通常是 Oneshot125, Oneshot42, Multishot 或标准 PWM)。
- 4个螺旋桨: 2个正桨,2个反桨。
- 锂电池: 3S 或 4S 锂聚合物电池,以及配套的充电器。
- 飞控板 (可选但推荐): 一个集成了电源分配板 的板子,可以简化接线。
-
遥控与接收:
- 遥控器: 支持至少4个通道(油门、俯仰、横滚、偏航)。
- 接收机: 接收遥控器的信号,并将其转换成 Arduino 可以读取的 PWM 信号。
-
其他:
- 机架: 无人机的“骨架”。
- 杜邦线、焊锡台、热缩管等。
Arduino 无人机源码 (完整版)
这份代码包含了姿态解算(使用 Madgwick 滤波器)、PID 控制、遥控器信号读取和电机输出等所有核心功能。

(图片来源网络,侵删)
1. 必需的库
在 Arduino IDE 中,你需要安装以下库:
- I2Cdevlib: 用于 MPU6050 的底层通信。
- 安装方法:
工具->管理库...-> 搜索I2Cdevlib并安装。
- 安装方法:
- MadgwickAHRS: 用于姿态解算,比卡尔曼滤波更简单,效果也很好。
- 安装方法:
工具->管理库...-> 搜索MadgwickAHRS并安装。
- 安装方法:
2. 接线说明
- MPU6050:
VCC->5VGND->GNDSCL->SCL(Arduino Mega: Pin 21)SDA->SDA(Arduino Mega: Pin 20)
- 接收机:
- 油门 -> Pin
22 - 俯仰 -> Pin
24 - 横滚 -> Pin
26 - 偏航 -> Pin
28
- 油门 -> Pin
- 电调:
- 信号线 -> Pin
3,5,6,9(这些是支持 PWM 的定时器引脚) - 正负线 -> 飞控板的电源输出
- 信号线 -> Pin
3. 源码
/*
* Arduino 无人机飞控源码
* 功能: 基于 MPU6050 的姿态稳定控制
* 作者: AI Assistant
* 日期: 2025-10-27
* 硬件: Arduino Mega 2560, MPU6050, 4x 无刷电机+电调, 遥控器+接收机
* 库: I2Cdevlib, MadgwickAHRS
*/
#include <Wire.h>
#include <I2Cdev.h>
#include <MPU6050.h>
#include <MadgwickAHRS.h>
// ====================== 引脚定义 ======================
// 接收机引脚 (PWM 输入)
#define CHAN_THROTTLE 22
#define CHAN_PITCH 24
#define CHAN_ROLL 26
#define CHAN_YAW 28
// 电调引脚 (PWM 输出)
#define MOTOR_FL 3 // 前左电机
#define MOTOR_FR 5 // 前右电机
#define MOTOR_BL 6 // 后左电机
#define MOTOR_BR 9 // 后右电机
// ====================== 参数配置 ======================
// 遥控器通道参数 (根据你的遥控器调整)
#define PULSE_MIN 1000 // 最小脉宽 (us)
#define PULSE_MAX 2000 // 最大脉宽 (us)
#define PULSE_MID 1500 // 中立点脉宽 (us)
// PID 参数 (需要根据你的无人机进行整定)
// PID = P * Error + I * Sum(Error) + D * (Error - LastError)
// 俯仰和横滚的PID参数通常是一样的
#define PID_P_ROLL 4.0 // 横滚 P 增益
#define PID_I_ROLL 0.01 // 横滚 I 增益
#define PID_D_ROLL 1.5 // 横滚 D 增益
#define PID_P_PITCH 4.0 // 俯仰 P 增益
#define PID_I_PITCH 0.01 // 俯仰 I 增益
#define PID_D_PITCH 1.5 // 俯仰 D 增益
#define PID_P_YAW 2.0 // 偏航 P 增益
#define PID_I_YAW 0.01 // 偏航 I 增益
#define PID_D_YAW 0.5 // 偏航 D 增益
// 电机输出范围 (PWM)
#define MOTOR_MIN 1000
#define MOTOR_MAX 2000
// ====================== 全局变量 ======================
MPU6050 mpu;
Madgwick madgwick;
// 遥控器值
int throttle, pitch, roll, yaw;
// 姿态角度
float roll_angle, pitch_angle, yaw_angle;
// PID 控制变量
float roll_pid_output, pitch_pid_output, yaw_pid_output;
float roll_error, last_roll_error, roll_error_sum;
float pitch_error, last_pitch_error, pitch_error_sum;
float yaw_error, last_yaw_error, yaw_error_sum;
// ====================== 初始化函数 ======================
void setup() {
Serial.begin(115200); // 用于调试
// 初始化电机引脚
pinMode(MOTOR_FL, OUTPUT);
pinMode(MOTOR_FR, OUTPUT);
pinMode(MOTOR_BL, OUTPUT);
pinMode(MOTOR_BR, OUTPUT);
// 初始化接收机引脚
pinMode(CHAN_THROTTLE, INPUT);
pinMode(CHAN_PITCH, INPUT);
pinMode(CHAN_ROLL, INPUT);
pinMode(CHAN_YAW, INPUT);
// 初始化 MPU6050
Wire.begin();
mpu.initialize();
if (!mpu.testConnection()) {
Serial.println("MPU6050 初始化失败!");
while (1);
}
Serial.println("MPU6050 初始化成功!");
// 设置陀螺仪和加速度计的满量程范围
//陀螺仪: ±250 度/秒, 加速度计: ±2g
mpu.setFullScaleG 标签: Arduino无人机源码核心控制实现 Arduino无人机飞控算法源码 Arduino无人机姿态控制代码解析
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。