ESP32开发-迷你掌上平衡车miniBot完整开发指南

一、项目概述

迷你掌上平衡车miniBot是一个基于ESP32的智能自平衡机器人项目,集成了姿态感知、电机控制、PID算法和无线通信等功能。该项目适合电子爱好者和嵌入式开发者学习,涵盖了传感器数据处理、电机运动控制、PID控制算法等多个技术领域。

二、硬件选型清单

组件 型号/规格 数量 说明
主控芯片 ESP32-WROOM-32 1 内置WiFi和蓝牙,性能强大
姿态传感器 MPU6050 1 六轴加速度计+陀螺仪,用于获取姿态信息
电机驱动 DRV8833或TB6612 1 可驱动两路电机,电流足够带动N20电机
电机 N20减速电机(带编码器) 2 带AB相霍尔编码器,用于测量转速
电池 7.4V锂电池(2S) 1 提供动力电源
稳压芯片 LM1084 + AMS1117 各1 两级降压:7.4V→5V→3.3V
轮子 直径6-8cm 2 建议尺寸,太大影响响应速度
车体材料 PLA 3D打印 1套 重心要低于轮轴高度

三、电路设计要点

1. 电源系统设计

复制代码
7.4V锂电池 → LM1084(5V) → AMS1117(3.3V) → ESP32
         ↓
      DRV8833 → 电机
  • 电机和主板最好分开供电
  • 使用两节18650电池给电机,USB给ESP32供电
  • 紧急情况下直接拔USB就能断电

2. 关键接线方案

复制代码
MPU6050接线:
  SDA → GPIO21 (ESP32)
  SCL → GPIO22 (ESP32)
  VCC → 3.3V (严禁接5V!)
  GND → GND
  AD0 → GND (地址为0x68)

DRV8833/TB6612接线:
  AIN1/AIN2 → GPIO12/GPIO13 (左电机)
  BIN1/BIN2 → GPIO14/GPIO15 (右电机)
  VM → 7.4V电池正极
  VCC → 5V
  GND → 共地

四、软件架构设计

1. 开发环境配置

  1. 安装Arduino IDE
  2. 添加ESP32开发板管理器地址:https://arduino.me/packages/esp32.json
  3. 搜索并安装ESP32开发板支持包
  4. 安装必要的库:MPU6050_tockn、ArduPID、BluetoothSerial

2. 核心代码模块

cpp 复制代码
// 主程序框架
#include <Wire.h>
#include <MPU6050_tockn.h>
#include <BluetoothSerial.h>

// 引脚定义
#define MPU6050_SDA 21
#define MPU6050_SCL 22
#define MOTOR_AIN1 12
#define MOTOR_AIN2 13
#define MOTOR_BIN1 14
#define MOTOR_BIN2 15

// PID参数
float kp = 1.0, ki = 0.0, kd = 0.0;
float targetAngle = 0.0;  // 静态机械平衡角度

MPU6050 mpu6050(Wire);
BluetoothSerial SerialBT;

void setup() {
    Serial.begin(115200);
    Wire.begin(MPU6050_SDA, MPU6050_SCL);
    mpu6050.begin();
    mpu6050.calcGyroOffsets(true);  // 校准传感器
    
    // 初始化电机PWM
    ledcSetup(0, 1000, 8);  // 1kHz PWM频率
    ledcAttachPin(MOTOR_AIN1, 0);
    // ...其他引脚初始化
    
    // 初始化蓝牙
    SerialBT.begin("miniBot_Balance");
}

void loop() {
    // 1. 读取传感器数据
    mpu6050.update();
    float angleX = mpu6050.getAngleX();  // 倾角
    float gyroX = mpu6050.getGyroX();    // 角速度
    
    // 2. PID计算
    float error = angleX - targetAngle;
    static float integral = 0;
    integral += error;
    integral = constrain(integral, -1000, 1000);
    
    float output = kp * error + ki * integral + kd * gyroX;
    
    // 3. 电机控制
    int pwmValue = constrain(output, -255, 255);
    motorControl(pwmValue, pwmValue);
    
    // 4. 蓝牙通信处理
    if (SerialBT.available()) {
        processBluetoothCommand();
    }
    
    delay(10);  // 控制周期约10ms
}

3. 姿态解算算法

MPU6050初始化序列:

  1. 写入0x6B(PWR_MGMT_1)=0x00:退出睡眠模式
  2. 写入0x1B(GYRO_CONFIG)=0x08:设置陀螺仪量程±500°/s
  3. 写入0x1C(ACCEL_CONFIG)=0x10:设置加速度计量程±4g
  4. 写入0x1A(CONFIG)=0x06:配置低通滤波器带宽42Hz

五、PID控制原理与调试

1. 双环PID控制结构

采用并联双环PID算法:

  • 角度环(直立环):负反馈控制,让小车稳定在平衡角度
  • 速度环:正反馈控制,提高动态响应,在快要偏倒时迅速回正

2. PID参数调试步骤

  1. 初始测试

    • 设置kp=1,ki=0,kd=0
    • 手拿小车保持竖直,轮子应不动
    • 如果轮子不停转动,说明kp值太大
  2. 方向测试

    • 小车左倾时,两个轮子都应逆时针旋转
    • 小车右倾时,两个轮子都应顺时针旋转
  3. 参数调整顺序

    复制代码
    1. 先调P:让车能动起来
    2. 再加D:稳定姿态,抑制震荡
    3. 最后微调I:消除静态误差
  4. 推荐参数范围

    • 角度环:采用PD控制(ki=0),增加稳定性
    • 速度环:采用PI控制(kd=0),提高响应速度

3. 调试技巧

  • 先用USB线连着电脑调试,方便查看串口数据
  • 初始测试时用手扶着车,防止飞车
  • 出现剧烈震荡立即切断电源
  • 代码里设置倾斜角度阈值,超限立即停转

参考代码 ESP32开发-迷你掌上平衡车miniBot www.youwenfan.com/contentcst/183305.html

六、蓝牙遥控与参数调节

1. 蓝牙通信实现

cpp 复制代码
void processBluetoothCommand() {
    String command = SerialBT.readString();
    
    // JSON格式指令解析
    // {"cmd":"pid","kp":1.5,"ki":0.1,"kd":0.05}
    // {"cmd":"move","direction":"forward","speed":100}
    
    if (command.indexOf("pid") != -1) {
        // 解析并更新PID参数
        updatePIDParameters(command);
    }
}

2. 手机APP控制

  • 使用任意蓝牙串口APP即可控制
  • 定义简单协议:前后左右+停止指令
  • 微信小程序作为上位机,通过蓝牙调节PID参数

七、进阶功能扩展

1. 编码器速度反馈

cpp 复制代码
// 使用霍尔编码器测量转速
volatile long leftEncoderCount = 0;
volatile long rightEncoderCount = 0;

void leftEncoderISR() {
    leftEncoderCount++;
}

void rightEncoderISR() {
    rightEncoderCount++;
}

float getSpeed(int encoderCount, long deltaTime) {
    // 编码器每转脉冲数 / 时间 = 转速
    return (encoderCount * 60.0) / (PPR * deltaTime / 1000.0);
}

2. WiFi功能扩展

  • 通过Web界面远程监控
  • OTA无线固件升级
  • 接入物联网平台

3. 安全保护机制

  1. 倾斜角度超限保护(>50°立即停转)
  2. 电池低压保护
  3. 电机堵转保护
  4. 急停开关物理保护

八、常见问题与解决方案

问题 可能原因 解决方案
小车剧烈震荡 PID参数不合适 减小P值,增加D值
无法保持平衡 重心太高 降低电池位置,重心低于轮轴
向一侧偏倒 机械不平衡 调整静态平衡角度
电机不转 接线错误 检查电机驱动接线和PWM信号
传感器数据异常 I2C通信问题 检查MPU6050接线,确保VCC接3.3V

九、项目资源

  1. 开源代码库

    • GitHub搜索"ESP32 Balance Robot"
    • 立创开源平台相关项目
  2. 3D打印文件

    • Thingiverse等平台搜索"mini balance robot"
    • 注意重心设计,建议使用PLA材料
  3. 调试工具

    • 串口绘图工具(如Serial Plotter)
    • 蓝牙调试APP(如Serial Bluetooth Terminal)

十、开发建议

  1. 分阶段开发

    • 第一阶段:实现基本平衡
    • 第二阶段:添加速度控制
    • 第三阶段:实现遥控功能
    • 第四阶段:优化性能和稳定性
  2. 安全第一

    • 调试时始终用手保护
    • 设置软件和硬件急停
    • 避免在易燃物附近测试
  3. 持续优化

    • 记录每次参数调整的效果
    • 使用数据记录分析平衡性能
    • 参考其他开源项目的最佳实践
相关推荐
不爱吃大饼2 小时前
WeMos开发板
单片机·嵌入式硬件
三佛科技-134163842122 小时前
LP3799FAC/LP3799FBC--非标60W(24V2.5A)电源芯片恒压恒流方案分析(电路图,PCB设计)
嵌入式硬件·物联网·智能家居·pcb工艺
雅斯驰2 小时前
BMS、电机控制、医疗设备:ISO1540DR的I²C隔离应用版图
单片机·嵌入式硬件
xiangw@GZ2 小时前
芯片失效分析:EM电迁移导致的BUCK输出失效
嵌入式硬件
yuan199972 小时前
温度传感器VC++串口通信程序(与51单片机通讯)
stm32·单片机·嵌入式硬件
LCMICRO-133108477462 小时前
国产长芯微LDC4048完全P2P替代DAC128S085,是一款 8 通道、带输出放大器的数模转换器 (DAC)
stm32·单片机·嵌入式硬件·fpga开发·硬件工程·数模转换器dac
768dh2 小时前
NCP1654学习(一)
单片机·嵌入式硬件
雅斯驰3 小时前
电流模式控制+快速瞬态响应:LTM4650AY的FPGA供电技术解析
stm32·单片机·嵌入式硬件·物联网·fpga开发·汽车
从零点3 小时前
用VScode+CubeMX进行串口打印
单片机·嵌入式硬件