从玩具到模型用MPU6050和Arduino打造抗干扰平衡小车平衡小车一直是电子爱好者入门嵌入式控制的经典项目。它不仅融合了传感器技术、电机控制和算法设计还能直观地展示物理原理与工程实践的完美结合。本文将带你从零开始用最常见的Arduino和MPU6050传感器打造一个能抵抗外力干扰的智能平衡小车。1. 硬件选型与搭建1.1 核心组件选择平衡小车的硬件系统主要由三大部分组成控制核心、传感器模块和执行机构。对于初学者来说合理选择这些组件不仅能降低成本还能降低调试难度。控制核心Arduino Uno是最佳选择。它价格低廉、社区支持丰富完全能满足平衡小车的计算需求。如果追求更高性能可以考虑Arduino Due或ESP32。姿态传感器MPU6050是性价比最高的选择。这款6轴传感器集成了3轴加速度计和3轴陀螺仪通过I2C接口与Arduino通信能提供足够精确的姿态数据。电机驱动L298N双H桥电机驱动模块是最常见的解决方案。它能同时驱动两个直流电机支持PWM调速最大输出电流可达2A。1.2 机械结构设计平衡小车的机械结构直接影响其稳定性。以下是几个关键设计要点重心位置小车的重心应该尽可能高。这看似违反直觉但实际上更高的重心能提供更大的恢复力矩使控制更容易实现。轮径选择较大的轮径能提供更好的稳定性但会增加电机负载。建议使用直径6-8cm的橡胶轮。电机选型减速电机是最佳选择。它能在低速时提供较大扭矩建议选择减速比在1:48到1:120之间的电机。// 简单的电机控制代码示例 void setMotorSpeed(int leftSpeed, int rightSpeed) { // 设置电机方向 digitalWrite(MOTOR_A_DIR_PIN, leftSpeed 0 ? HIGH : LOW); digitalWrite(MOTOR_B_DIR_PIN, rightSpeed 0 ? HIGH : LOW); // 设置电机速度 analogWrite(MOTOR_A_PWM_PIN, abs(leftSpeed)); analogWrite(MOTOR_B_PWM_PIN, abs(rightSpeed)); }2. 传感器数据处理2.1 MPU6050数据读取与校准MPU6050虽然功能强大但原始数据存在各种误差必须经过适当处理才能使用。首先需要进行传感器校准零偏校准将传感器静止放置在水平面上记录各轴的输出值作为零偏。比例因子校准通过旋转传感器比较输出值与实际旋转角度确定比例因子。#include Wire.h #include I2Cdev.h #include MPU6050.h MPU6050 mpu; void setup() { Wire.begin(); mpu.initialize(); // 校准代码... } void loop() { // 读取原始数据 int16_t ax, ay, az, gx, gy, gz; mpu.getMotion6(ax, ay, az, gx, gy, gz); // 数据处理... }2.2 姿态解算算法单纯依靠加速度计或陀螺仪都无法获得准确的姿态信息。我们需要融合两者的数据传感器优点缺点加速度计长期稳定动态响应差陀螺仪动态响应好存在漂移常用的融合算法有互补滤波和卡尔曼滤波。对于初学者互补滤波实现简单且效果不错float complementaryFilter(float accAngle, float gyroRate, float dt) { static float angle 0; float alpha 0.98; // 融合系数 angle alpha * (angle gyroRate * dt) (1 - alpha) * accAngle; return angle; }3. 控制算法实现3.1 PID控制基础PID控制器是平衡小车保持直立的核心。它通过比例(P)、积分(I)和微分(D)三个环节的组合来控制系统比例项反映当前误差提供快速响应积分项消除稳态误差微分项预测未来趋势抑制振荡class PID { public: PID(float kp, float ki, float kd) : Kp(kp), Ki(ki), Kd(kd) {} float compute(float setpoint, float input, float dt) { float error setpoint - input; integral error * dt; float derivative (error - prevError) / dt; prevError error; return Kp * error Ki * integral Kd * derivative; } private: float Kp, Ki, Kd; float integral 0; float prevError 0; };3.2 串级控制策略单一PID环难以同时保证小车的平衡和位置稳定。我们需要采用串级控制内环直立环快速响应角度变化保持小车直立外环速度环调节小车位置防止漂移提示调试时应先调直立环确保小车能独立站立再加入速度环。4. 调试技巧与抗干扰优化4.1 PID参数整定PID参数的整定是平衡小车项目中最具挑战性的部分。以下是分步调试指南先调P值从小值开始逐渐增大直到小车能对倾斜做出明显反应加入D值抑制振荡使小车更稳定最后加I值消除稳态误差但不宜过大参数影响过大表现过小表现Kp响应速度剧烈振荡反应迟钝Ki消除静差积分饱和位置漂移Kd抑制振荡响应迟缓持续抖动4.2 抗干扰实现要让小车抵抗外力干扰需要特别注意以下几点增加速度环防止小车在受推后持续移动限幅处理对控制输出进行限幅避免电机过载死区补偿克服电机启动时的静摩擦力// 带限幅的PID输出处理 float output pid.compute(setpoint, input, dt); output constrain(output, -255, 255); // PWM输出限制在实际测试中我发现当Kp25、Ki0.5、Kd0.8时小车不仅能稳定站立还能抵抗约15度的外力干扰。调试过程中使用蓝牙模块实时传输传感器数据和PID输出能极大提高效率。