
迷你掌上平衡车miniBot
简介
基于ESP32的迷你掌上平衡车miniBot,可连接蓝牙进行远程控制和远程pid调参。
简介:基于ESP32的迷你掌上平衡车miniBot,可连接蓝牙进行远程控制和远程pid调参。开源协议
:GPL 3.0
描述
更新记录
2023/03/09
上传模型step文件。
2022/11/30
更新软件部分原理讲解。
2022/11/17
原购买链接均已失效了,清单后更新了商品截图,可按图搜索购买。同时增加了蓝牙调参的说明。
2022/08/02
创建开源工程,添加部分说明文档。
目录
资料大纲已规划好,陆续更新中......
1.项目介绍
1.0 前言
平衡车几乎是每个人入坑电子DIY的必做项目,包括了传感器采集处理、电机运动控制、pid算法调节等许多领域,同时兼顾专业性和趣味性,非常适合作为入门练习项目。本项目经过几次版本迭代(见后续介绍),最后确定为当前的形态,在外形结构和软件控制方面实现了比较好的平衡,外观小巧,运动性能卓越。
特别说明:
- 本项目电路焊接部分有一定的门槛,如果对小型贴片器件的焊接没有把握,不建议尝试 ,或者可以打板的时候选嘉立创SMT代工,省去了自己焊的麻烦(广告费麻烦结一下)。
- 此类平衡车原理都大差不差,也可以为大家制作属于自己的平衡车提供参考,非常乐意和大家一起交流学习~
1.1 基本介绍
使用ESP32-WROOM作为主控芯片,MPU6050六轴加速度传感器模块获取姿态信息,DRV8833芯片驱动电机运动,提供较大电流,电机选用N20减速电机,带有AB相霍尔编码器用于测量转速。供电方面选用7.4V锂电池(2s),经线性稳压器LM1084稳压至5V再使用1117稳压至3.3V给ESP32供电。
程序部分基于Arduino IDE,使用开源库实现角度获取和pid算法平衡控制,使用JSON库编写了指令解析程序,用于蓝牙远程调节pid参数,并借助开源的安卓蓝牙APP用来遥控小车运动。

1.2 开源链接与演示视频
B站演示视频:【自制】超迷你的掌上平衡车,可蓝牙pid调参、远程控制_哔哩哔哩_bilibili
立创开源平台:minibot - 嘉立创EDA开源硬件平台 (oshwhub.com)
1.3 迭代记录
第一版:
- 第一次设计,直接采用模块连接的方式,电路简单
- PCB挖槽复用,作为电机固定板,无需多次打板
- 以上设计导致空间利用率低,实际外形比较大
- 并且孔位估算不够合理,电机间距大,没有电池安放位
- 接线复杂,整体美观度不够
相关演示视频:刚调好角度环pid的平衡车,还不太稳_哔哩哔哩_bilibili
第二版:
- 在第一版的基础上想用冰墩墩作为外形设计,内部挖空放置模块
- 电路部分基本无改动,模块式组合
- 但外壳设计效果不佳,组合后的电路板很难塞进外壳,并且无法固定
- 装好之后表面看起来效果还可以,全是可爱的冰墩墩的功劳
- 内部固定起来比较费劲,并且重心很高,平衡控制起来比较困难,具体效果请看下面的演示视频
最后的效果见下图,演示视频戳:平衡车第二弹-颤颤巍巍的冰墩墩_哔哩哔哩_bilibili
----------------------------分割线------------------------------------
下面是当前的最终版本,第三版的设计说明。
2.硬件设计
2.1 3D建模
完整结构建模:原本计划使用两层板堆叠即可(比如第一版),中间位置放置电池,但电机排线需要向上突出,下面放不了电池,所以额外增加了一层,使用三层板堆叠结构,下面两层使用亚克力切割,最上层为电路板,电池放置在上层,下层挖空引出电机排线,亚克力板还需增加电机固定架孔位,将电机安排得尽可能靠近来减小横向间距。solidworks建模如下:
除电路板外,需要定制的仅两块相同的亚克力板,从solidworks导出为DWG文件即可定制。

2.2 电路设计
2.2.1 原理图设计
电源:使用2s电池7.4V标称电压供电,接入点设置开关控制通断。主控供电为3.3V,电池需要经过两次降压处理,为了电路简单都使用了低压差线性稳压器(LDO),第一级使用LM1084降压至5V,第二级使用AMS1117降压至3.3V。
电机驱动:驱动芯片使用DRV8833,比较便宜,虽然驱动电流不太大,但足够带动N20电机。一个芯片可驱动两路电机,功能表如下,每个电机需要两路PWM输入进行调速。两个电机共四路PWM输入。

串口下载电路:Type-C + CH340C实现串口通信,常规的双三极管电路实现自动下载。
MPU6050电路:直接使用了模块,接入四根线(电源、接地、两根信号线)即可正常读取数据。
其余电路细节请查看工程原理图,已添加大量注释说明。
2.2.2 PCB设计
元器件布局:按照主要的信号流向进行布局,主要是电源部分需要集中一点,方便布线。MPU6050模块下方空白处也放置了一些小器件,带一点3D立体电路的感觉。
手动布线:布线仅仅是能用的程度,还有很大的改进空间,再就是稍微注意了一下线宽,电源部分做到尽量宽一点,信号线可以窄点。
电路设计水平有限,欢迎各位提出宝贵意见,共同学习进步,感谢。
2.2.3 焊接和组装
电路板焊接测试
CH340缺了一个电容(见debug部分),这个版本暂时飞线解决了,然后上了一坨热熔胶固定。电源接口也加上了热熔胶,防短路。
整体组装
下面两层亚克力板,上面一层PCB,用M3六角铜柱连接固定,长度能短则短,但电池和排线需要一定的空间。下面用的长度15mm,上面是20mm,最下面的电机是用的附赠的电机座,螺丝固定。
2.3 Debug记录
-
CH340 V3接口缺少一个0.1uF电容接地,导致无法正常连接串口,当前版本用飞线接上电容后可以正常工作,PCB已在v1.1版本中修复。
-
电机排线6p插座方向设置错误,原设计打算放在背面,但根据实际接线顺序需要放在正面,已在v1,.1版中标出,请注意检查,否则容易造成短路风险。
3.软件设计
软件部分主要以小车的平衡控制为核心,通过MPU6050采集角度数据、霍尔编码器采集速度数据作为输入信息,传递给PID控制器进行运算,输出结果转换为PWM信号驱动电机转动,程序运行框图如下图所示。PID运算作为经典的控制算法,不同的参数对于小车的稳定性和动态响应均有显著影响,为便于PID调参还用到了ESP32的蓝牙功能,通过手机连接蓝牙设备,使用蓝牙串口助手APP发送指令即可实现远程调节参数。

程序开发选择Arduino,导入ESP32相应的软件包即可开始开发之旅。Arduino庞大的开源社区为整个开发流程提供了极大便利,大量的驱动库可免费下载,比如本项目中角度传感器部分即使用了开源的“MPU6050_tockn”驱动库,能够直接获取处理后角度数据。PID运算代码也是基于“ArduPID”库的修改,去掉了里面定时器部分的内容,使用起来更加直观。
3.1 PID控制
**PID控制算法简介**PID算法是一种控制算法,主要用来控制一个对象中的某一物理量,使其达到设定值。比如平衡小车中,就是控制小车保持在平衡状态(小车偏角保持在设定的平衡角度)。
对于PID参数的理解可以参考稚晖君的教程,这篇文章写得非常好,推荐给大家参考学习:稚晖君教你制作全球最迷你的自平衡机器人
PID库函数:基于库的修改,去掉了里面定时器部分的内容,看起来更加直观,修改后的文件 "PID.cpp"
和 "PID.h"
均已直接添加到文件列表,不需要额外下载,其使用方法一致,参考链接:https://github.com/PowerBroker2/ArduPID
具体使用示例如下,以角度环PID为例:
//全局参数定义:
ArduPID pid_ang;
double ang_set = -1.0;
double ang_in, ang_out;
double ang_p = 98.0;
double ang_i = 0.0;
double ang_d = 170.0;
//PID参数初始化(运行一次)
pid_ang.begin(&ang_in, &ang_out, &ang_set, ang_p, ang_i, ang_d);
pid_ang.setOutputLimits(-1000.0, 1000.0); //设置PID输出PWM的幅度限制
pid_ang.setWindUpLimits(-50.0,50.0); //设置PID积分限幅
//循环运行:
ang_in = get_angle(); //获取输入值,get_angle()非实际代码,仅作演示
pid_ang.compute();//计算pid参数
set_value(ang_out);//将计算结果输出到控制对象
3.1.1 角度环pid
角度环PID能够使小车静止在平衡角度(即设定的机械中值),通过实时读取MPU6050的角度数据,计算与设定的平衡角度之间的误差,再控制小车运动速度,从而维持在平衡点。比如向前倒时,根据设定参数,小车将加速向前行驶,以维持平衡。
角度获取: 调用Arduino开源库直接读取角度,根据安装方向,前后摆动的偏角为Y轴角度值。
角度机械中值获取: 小车前后摆动的中点为机械中值,表现为向前倒和向后倒的临界点角度,以此角度值做为平衡点。
未完待续
3.1.2 速度环pid
3.1.3 双环并联
3.2 蓝牙控制
3.2.1 远程调参
3.2.2 遥控运动
4.制作说明
4.1 材料清单
主要元器件:
名称 | 数量 | 单价 | 说明 | 链接 |
---|---|---|---|---|
ESP32-WROOM | 1 | 12.3 | 型号选ESP-WROOM-32 | 下单链接 |
MPU6050 | 1 | 6 | 常用模块,其他来源的基本也通用 | 下单链接 |
DRV8833 | 1 | 2.5 | 选drv8833模块,模块比芯片便宜,于是选择买模块拆芯片 | 下单链接 |
N20电机 | 2 | 25 | 型号选的是6V-310转 | 下单链接 |
7.4V电池 | 1 | 34.5 | 2s电池,选700毫安时JST接口(还需准备一个2P排针做插座),最好再自己买一个充电器 | 下单链接 |
M3铜柱 | 8 | 7.8(共20个) | 选M3 *15和M3 *20共两种 | 下单链接 |
M3螺母 | 4 | 1.5(共100个) | 在上面铜柱这家店(优信电子)买,搜M3就有 | -- |
ZH1.5-6P母座 | 2 | 2.4(共10个) | 选6P弯针(后面发现直针更美观,只是焊接需注意极性) | 下单链接 |
ZH1.5-6P双头排线 | 2 | 4.2(共5个) | 选6P双头,长度任意 | 下单链接 |
拨动开关 | 1 | 2(共20个) | 型号选SK12D07VG4拨动开关2档3脚,好几个差不多的,注意别选错了 | 下单链接 |
亚克力板 | 2 | -- | 自行定制,定制文件见附件模型装配/亚克力切割.DWG |
-- |
其他元件: 剩下的CH340、AMS1117还有电阻电容等元件比较常规,可根据BOM表配单,立创直接下单或某宝挨个买都行,买的时候注意封装型号。
主要元件商品截图:
4.2 开源文件说明
4.2.1 硬件部分
模型文件都上传到附件了,包含完整的solidworks建模装配体文件,小车按照实际尺寸建模,可以提供一点参考。亚克力板切割用里面的DWG文件,放了两块一样的板,直接某宝定制即可。
电路图部分请直接从末尾的立创EDA工程文件打开,附件就不放了,原理图里添加了大量的注释,供参考。
4.2.2软件部分:
见附件代码,当前为最新版本,后续优化会标上版本号上传。使用Arduino IDE开发,需要自行下载准备的库有、。工程中的每个模块为.h+.cpp文件的组合,已添加了很多注释,可自行查阅。
蓝牙调参:
先将平衡车连接到手机:应用商店搜索下载蓝牙串口APP(一般都有,随便下载一个即可。代码中需要将最开头的BTMODE 宏定义修改为0(默认为1,是遥控模式),烧录程序后在蓝牙设置中找到“minibot”连接配对。连接后找到类似下图的界面发送调参指令,指令格式见代码中的注释说明:
/* 蓝牙发送参数指令,使用JSON格式进行打包和解析,字符串格式:"{"cmd":1,"data":[p,i,d]}" , (p、i、d为常数) * cmd=1:角度环pid设置 * cmd=2:速度环pid设置 * cmd=3:转向环pid(暂未添加) * cmd=4:角度平衡值, 发送格式: "{"cmd":4,"data":[angle]}" , (angle为常数) * cmd=5:速度值,同角度 * cmd=6:转向值,同上 **/
蓝牙遥控: 遥控用的APP已放在附件中,仅限安卓平台。在APP里自行配置的摇杆参数如下图所示:
5.总结
5.1 当前问题
结构层面: 目前迷你程度几乎已经达到极限(电机大小限制),如果再要减小的话就要换更小的电机才行。从外观来看现在最大的问题在电池接线,大部分暴露在外面降低美观性,同时电机排线也比较突出,倒地的时候撞到排线,可能造成损坏,考虑连接座换成直针,代替目前的弯针即可解决。
软件层面: PID运行的前一分钟,电机运动会出现明显的滞后和超调现象,运行一段时间才能恢复正常的平衡模式,目前未排查到原因,估计是某些变量初始化时的问题,还在排查中。小车运行稳定程度也还有提升空间,静止时还不能很稳,一方面PID算法和参数还可以优化,另一方面可能受编码器分辨率影响,按20Hz采样率,得到编码器数据范围是0-50左右的整数值,数据精度十分有限。
5.2 后续展望
- 优化PID算法,争取达到更稳定的效果
- 换一种更紧凑美观的外形结构
设计图

BOM


评论