四轴无人机DIY的核心在于平衡成本与性能。经过多次迭代测试,我总结出这套百元级解决方案,特别适合学生党和创客入门。整套系统包含飞控板、遥控器、机架和动力系统四大部分,核心部件如下:
主控芯片:STM32F103C8T6(蓝桥杯开发板同款)——价格约12元,72MHz主频完全满足实时控制需求。相比更贵的F4系列,C8T6的性价比在微型无人机领域优势明显。
姿态传感器:MPU6050(含DMP)——9元即可购得,集成三轴陀螺仪和加速度计,通过I²C接口输出融合后的姿态数据。实测发现,选择带金属外壳的版本抗干扰能力更强。
动力系统配置表:
| 部件 | 型号 | 单价 | 关键参数 |
|---|---|---|---|
| 空心杯电机 | 8520 | 4.5元 | 15000rpm,3.7V供电 |
| 螺旋桨 | 75mm正反桨 | 2元/对 | 需注意电机轴径匹配 |
| 锂电池 | 3.7V 800mAh | 15元 | 带JST插头,续航约18分钟 |
提示:采购时建议多买2个电机备用,焊接失误或碰撞损坏是常见情况。
遥控器部分采用NRF24L01+模块(约8元)实现2.4GHz通信,配合另一块STM32F103C8T6作为控制器。这种方案比成品遥控器节省60%成本,且便于后期功能扩展。
飞控PCB采用双层板设计,尺寸控制在40×40mm以内。关键电路包括:
c复制// 3.3V稳压电路示例(使用AMS1117)
void Power_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; // 使能引脚
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_SetBits(GPIOA, GPIO_Pin_0); // 开启稳压
}
通过反复测试,总结出传感器安装的最佳实践:
接线示意图:
code复制MPU6050 STM32
VCC --- 3.3V
GND --- GND
SCL --- PB6
SDA --- PB7
INT --- PB5(可选)
采用DMP库输出四元数,再转换为欧拉角。关键代码片段:
c复制// MPU6050初始化
void MPU_Init(void) {
IIC_Write_Byte(MPU_ADDR, PWR_MGMT_1, 0x80); // 复位
delay_ms(100);
IIC_Write_Byte(MPU_ADDR, PWR_MGMT_1, 0x03); // 时钟源
IIC_Write_Byte(MPU_ADDR, SMPLRT_DIV, 0x07); // 采样率1kHz
IIC_Write_Byte(MPU_ADDR, CONFIG, 0x06); // 低通滤波42Hz
IIC_Write_Byte(MPU_ADDR, GYRO_CONFIG, 0x18); // ±2000dps
IIC_Write_Byte(MPU_ADDR, ACCEL_CONFIG, 0x10); // ±8g
IIC_Write_Byte(MPU_ADDR, USER_CTRL, 0x20); // 启用DMP
}
// 获取姿态角
void Get_Attitude(float *roll, float *pitch, float *yaw) {
uint8_t fifo_count[2];
IIC_Read_Len(MPU_ADDR, FIFO_COUNTH, 2, fifo_count);
uint16_t count = (fifo_count[0] << 8) | fifo_count[1];
if(count >= 28) { // 四元数数据包长度
uint8_t fifo_data[28];
IIC_Read_Len(MPU_ADDR, FIFO_R_W, 28, fifo_data);
// 解析四元数并转换为欧拉角...
}
}
经过实测,双环PID结构效果最佳:
角度环(外环):
角速度环(内环):
PID实现代码:
c复制typedef struct {
float kp, ki, kd;
float error, last_error, integral;
} PID;
float PID_Update(PID *pid, float target, float measure, float dt) {
pid->error = target - measure;
pid->integral += pid->error * dt;
// 积分限幅
if(pid->integral > 500) pid->integral = 500;
else if(pid->integral < -500) pid->integral = -500;
float derivative = (pid->error - pid->last_error) / dt;
float output = pid->kp * pid->error + pid->ki * pid->integral + pid->kd * derivative;
pid->last_error = pid->error;
return output;
}
焊接顺序:
装机流程:
问题1:电机启动不同步
问题2:飞行时自旋
问题3:无线控制距离短
完成基础飞行后,可以尝试以下升级:
项目所有源码和PCB文件已开源,包含详细注释的工程文件和原理图说明。在实际调试中发现,飞控板的振动隔离对稳定性影响极大——在MPU6050下方加装1mm厚的硅胶垫可使姿态误差减少40%。