编辑器版本 ×
标准版

1、简单易用,可快速上手

2、流畅支持300个器件或1000个焊盘以下的设计规模

3、支持简单的电路仿真

4、面向学生、老师、创客

专业版

1、全新的交互和界面

2、流畅支持超过3w器件或10w焊盘的设计规模,支持面板和外壳设计

3、更严谨的设计约束,更规范的流程

4、面向企业、更专业的用户

专业版 迷你掌上平衡车miniBot

简介:基于ESP32的迷你掌上平衡车miniBot,可连接蓝牙进行远程控制和远程pid调参。

开源协议: GPL 3.0

发布时间: 2022-11-30 16:07:57
  • 1.6w
  • 159
  • 326
描述
## 更新记录 ### 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用来遥控小车运动。

<center class="half"> JMDZSPfGYFVB5UpH9SNnNN9tAraDupOqWKMCt431.jpeg </center>

1.2 开源链接与演示视频

B站演示视频:【自制】超迷你的掌上平衡车,可蓝牙pid调参、远程控制_哔哩哔哩_bilibili

立创开源平台:minibot - 嘉立创EDA开源硬件平台 (oshwhub.com)

1.3 迭代记录

第一版:

  • 第一次设计,直接采用模块连接的方式,电路简单
  • PCB挖槽复用,作为电机固定板,无需多次打板
  • 以上设计导致空间利用率低,实际外形比较大
  • 并且孔位估算不够合理,电机间距大,没有电池安放位
  • 接线复杂,整体美观度不够

相关演示视频:刚调好角度环pid的平衡车,还不太稳_哔哩哔哩_bilibili
8png.png




第二版:

  • 在第一版的基础上想用冰墩墩作为外形设计,内部挖空放置模块
  • 电路部分基本无改动,模块式组合
  • 但外壳设计效果不佳,组合后的电路板很难塞进外壳,并且无法固定
  • 装好之后表面看起来效果还可以,全是可爱的冰墩墩的功劳
  • 内部固定起来比较费劲,并且重心很高,平衡控制起来比较困难,具体效果请看下面的演示视频

最后的效果见下图,演示视频戳:平衡车第二弹-颤颤巍巍的冰墩墩_哔哩哔哩_bilibili
9png.png




----------------------------分割线------------------------------------


下面是当前的最终版本,第三版的设计说明。

2.硬件设计

2.1 3D建模

完整结构建模:原本计划使用两层板堆叠即可(比如第一版),中间位置放置电池,但电机排线需要向上突出,下面放不了电池,所以额外增加了一层,使用三层板堆叠结构,下面两层使用亚克力切割,最上层为电路板,电池放置在上层,下层挖空引出电机排线,亚克力板还需增加电机固定架孔位,将电机安排得尽可能靠近来减小横向间距。solidworks建模如下:
5.png



除电路板外,需要定制的仅两块相同的亚克力板,从solidworks导出为DWG文件即可定制。

<center class="half"> Gmwbz1xUp8NG5rtVpjDbEnaE2fpkmuHh46sOCoSs.png </center>

2.2 电路设计

2.2.1 原理图设计

电源:使用2s电池7.4V标称电压供电,接入点设置开关控制通断。主控供电为3.3V,电池需要经过两次降压处理,为了电路简单都使用了低压差线性稳压器(LDO),第一级使用LM1084降压至5V,第二级使用AMS1117降压至3.3V。

电机驱动:驱动芯片使用DRV8833,比较便宜,虽然驱动电流不太大,但足够带动N20电机。一个芯片可驱动两路电机,功能表如下,每个电机需要两路PWM输入进行调速。两个电机共四路PWM输入。

<center class="half"> WpOOaqqoNyxVUWi7KG3eosaEhiDgPKVePkvMFKo3.jpeg </center>

串口下载电路:Type-C + CH340C实现串口通信,常规的双三极管电路实现自动下载。

MPU6050电路:直接使用了模块,接入四根线(电源、接地、两根信号线)即可正常读取数据。

其余电路细节请查看工程原理图,已添加大量注释说明。

2.2.2 PCB设计

元器件布局:按照主要的信号流向进行布局,主要是电源部分需要集中一点,方便布线。MPU6050模块下方空白处也放置了一些小器件,带一点3D立体电路的感觉。

手动布线:布线仅仅是能用的程度,还有很大的改进空间,再就是稍微注意了一下线宽,电源部分做到尽量宽一点,信号线可以窄点。

12.png

电路设计水平有限,欢迎各位提出宝贵意见,共同学习进步,感谢。

2.2.3 焊接和组装

电路板焊接测试
CH340缺了一个电容(见debug部分),这个版本暂时飞线解决了,然后上了一坨热熔胶固定。电源接口也加上了热熔胶,防短路。
6png.png

整体组装
下面两层亚克力板,上面一层PCB,用M3六角铜柱连接固定,长度能短则短,但电池和排线需要一定的空间。下面用的长度15mm,上面是20mm,最下面的电机是用的附赠的电机座,螺丝固定。
10.png

2.3 Debug记录

  • CH340 V3接口缺少一个0.1uF电容接地,导致无法正常连接串口,当前版本用飞线接上电容后可以正常工作,PCB已在v1.1版本中修复。

  • 电机排线6p插座方向设置错误,原设计打算放在背面,但根据实际接线顺序需要放在正面,已在v1,.1版中标出,请注意检查,否则容易造成短路风险。

3.软件设计

软件部分主要以小车的平衡控制为核心,通过MPU6050采集角度数据、霍尔编码器采集速度数据作为输入信息,传递给PID控制器进行运算,输出结果转换为PWM信号驱动电机转动,程序运行框图如下图所示。PID运算作为经典的控制算法,不同的参数对于小车的稳定性和动态响应均有显著影响,为便于PID调参还用到了ESP32的蓝牙功能,通过手机连接蓝牙设备,使用蓝牙串口助手APP发送指令即可实现远程调节参数。 <center class="half"> X5pDyS7KniuZuUPr4PeoJzuUbui8IJgbDWRPDwWs.png </center> 程序开发选择Arduino,导入ESP32相应的软件包即可开始开发之旅。Arduino庞大的开源社区为整个开发流程提供了极大便利,大量的驱动库可免费下载,比如本项目中角度传感器部分即使用了开源的“MPU6050_tockn”驱动库,能够直接获取处理后角度数据。PID运算代码也是基于“ArduPID”库的修改,去掉了里面定时器部分的内容,使用起来更加直观。

3.1 PID控制

**PID控制算法简介** PID算法是一种控制算法,主要用来控制一个对象中的某一物理量,使其达到设定值。比如平衡小车中,就是控制小车保持在平衡状态(小车偏角保持在设定的平衡角度)。 对于PID参数的理解可以参考稚晖君的教程,这篇文章写得非常好,推荐给大家参考学习:[稚晖君教你制作全球最迷你的自平衡机器人](https://mp.weixin.qq.com/s/BUNY3fMRWaGpU5tszZn6sw) PID库函数:基于<ArduPID.h>库的修改,去掉了里面定时器部分的内容,看起来更加直观,修改后的文件 `"PID.cpp"` 和 `"PID.h" ` 均已直接添加到文件列表,不需要额外下载,其使用方法一致,参考链接:[https://github.com/PowerBroker2/ArduPID](https://github.com/PowerBroker2/ArduPID) 具体使用示例如下,以角度环PID为例: ```C++ //全局参数定义: 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开源库<MPU6050_tockn.h>直接读取角度,根据安装方向,前后摆动的偏角为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表配单,立创直接下单或某宝挨个买都行,买的时候注意封装型号。

**主要元件商品截图:** ![Snipaste_2022-11-17_23-39-36.png](//image.lceda.cn/pullimage/TDrva3VF9ZvWntWAEl6kxGWHnan064Seza0piflb.png) ![Snipaste_2022-11-17_23-40-55.png](//image.lceda.cn/pullimage/gJ6rEUKhFIWg5PTj2u3kVHS1a5BPjdgwA9j3sBEP.png)

4.2 开源文件说明

4.2.1 硬件部分

模型文件都上传到附件了,包含完整的solidworks建模装配体文件,小车按照实际尺寸建模,可以提供一点参考。亚克力板切割用里面的DWG文件,放了两块一样的板,直接某宝定制即可。

电路图部分请直接从末尾的立创EDA工程文件打开,附件就不放了,原理图里添加了大量的注释,供参考。

4.2.2软件部分:

见附件代码,当前为最新版本,后续优化会标上版本号上传。使用Arduino IDE开发,需要自行下载准备的库有<ArduinoJson.h>、<MPU6050_tockn.h>。工程中的每个模块为.h+.cpp文件的组合,已添加了很多注释,可自行查阅。

蓝牙调参: 先将平衡车连接到手机:应用商店搜索下载蓝牙串口APP(一般都有,随便下载一个即可。代码中需要将最开头的BTMODE 宏定义修改为0(默认为1,是遥控模式),烧录程序后在蓝牙设置中找到“minibot”连接配对。连接后找到类似下图的界面发送调参指令,指令格式见代码中的注释说明: ![Snipaste_2022-11-17_23-44-46.png](//image.lceda.cn/pullimage/4z8lXSeIBUdVhyJb4LayBkVIPupg0j3KMwslcfj7.png)

/* 蓝牙发送参数指令,使用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里自行配置的摇杆参数如下图所示:
11.png

5.总结

5.1 当前问题

结构层面: 目前迷你程度几乎已经达到极限(电机大小限制),如果再要减小的话就要换更小的电机才行。从外观来看现在最大的问题在电池接线,大部分暴露在外面降低美观性,同时电机排线也比较突出,倒地的时候撞到排线,可能造成损坏,考虑连接座换成直针,代替目前的弯针即可解决。

软件层面: PID运行的前一分钟,电机运动会出现明显的滞后和超调现象,运行一段时间才能恢复正常的平衡模式,目前未排查到原因,估计是某些变量初始化时的问题,还在排查中。小车运行稳定程度也还有提升空间,静止时还不能很稳,一方面PID算法和参数还可以优化,另一方面可能受编码器分辨率影响,按20Hz采样率,得到编码器数据范围是0-50左右的整数值,数据精度十分有限。

5.2 后续展望

  • 优化PID算法,争取达到更稳定的效果
  • 换一种更紧凑美观的外形结构
设计图
原理图
1 /
PCB
1 /
暂无
工程附件
工程成员
相关工程
换一批
加载中...
添加到专辑 ×

加载中...

温馨提示 ×

是否需要添加此工程到专辑?

  • 153 6159 2675

服务时间

周一至周五 9:00~18:00
  • 技术支持

  • 开源平台公众号