96SEO 2026-02-19 08:59 15
none">自制平衡车,包括电路,外壳设计,PID控制。

由于我的博客服务器和备案到期,所以选择转移到博客园平台来进行保存和记录。
以后也有可能会在上面不定期更新一些技术类博客。
data-src="https://megrez-hong.oss-cn-shanghai.aliyuncs.com/blogs/%E4%B8%A4%E8%BD%AE%E5%B9%B3%E8%A1%A1%E8%BD%A6.webp"
做这个项目的初衷是想把手头上从学长那里收来的一些电机和电池用上,清一波库存(实际上没用上收来的器件,反而自己又掏钱买了电机和端子╮(╯▽╰)╭)。
于是想到了做一个平衡车,这个算是工科大学自动化类的一个经典项目设计。
虽然咱是EEer,但是秉承要做就做全栈的优良传统,还是想从头到尾完成一个项目。
本文着重于讲解如何从无到有构思并制造出一个完整的系统,并使得它逐渐趋于完美,包括外观设计,接口设计,器件选型,PCB设计,焊接验证,代码编写。
在项目的完成过程中还能顺便学一下PID的思想,体会调参的快乐(痛苦)。
控制板上还要有运动传感器,来检测当前的运动状态。
这是网上的平衡车的3D模型,我们可以依照这个样子,慢慢构想出我们的模型。
data-src="https://img2024.cnblogs.com/blog/3763221/202602/3763221-20260219012524766-1886126717.png"
这一节我会从系统的每个部件的所要满足的条件出发,环环相扣,完成每一个器件的选型。
可以预见的是,这个平衡小车整个系统的重量并不会太重,可以估算出大概在0.2kg至0.5kg之间,橡胶轮对普通硬质地面的摩擦力系数大概在0.6至0.7左右。
所以让整个系统运动起来所需要提供的力无需太大,也就是不需要选用大力矩电机。
因为大力矩电机的转速往往不高,而我们系统在执行平衡动作的时候需要一个较快的响应,对转速和加速度有一定要求。
这样带来的另一方面的好处就是电机的工作电压无需太大,工作电流也不用太高。
减少了变压电路设计的成本。
除此之外,电机还需要带编码器,它能够指示电机转了多少角度,便于我们对系统的速度进行控制。
经过一番挑选,选择了淘宝上的N20减速电机带编码器,6V电压,310转的版本。
电机虽然标称工作电压6V,但是由于电源设计比较常见的是输出5V的LDO,输出6V的比较少见
而这种电机对电压要求没那么严格,标称6V,但是5V下肯定也能使用,只不过力矩和最大转速会稍小一点(粗浅理解,不是机械专业的学生)。
所以我们直接供5V电压也是没有问题的
data-src="https://img2024.cnblogs.com/blog/3763221/202602/3763221-20260219012524798-895844765.png"
DRV8833电机驱动芯片
比较经典的一款电机驱动芯片,2路输出,通过PWM调解转速,最大能输出2A电流。
data-src="https://img2024.cnblogs.com/blog/3763221/202602/3763221-20260219012524746-200089910.png"
选择经典MPU6050,网上有现成的模块,也有很多的例程和文档。
为了板子的整体美观,我选择使用芯片,QFN封装,会稍稍有点难焊接。
不过我有热风枪,也比较容易搞定,不行的话吹下来重新焊一下就可以了。
data-src="https://img2024.cnblogs.com/blog/3763221/202602/3763221-20260219012524774-302739452.png"
个人平常用的比较多的是单片机是ESP32和STM32,对于这个项目的话两者的性能和外设支持都是完全够用的。
为了方便使用手机控制,我选择使用ESP32,它支持蓝牙和WIFI连接,而且使用Aurdino
IDE开发的话有一些现成的库可以使用,也避免了自己移植驱动带来的问题。
我手头上正好有个ESP32-Wroom32,乐鑫官方的封装好的模组,可以直接用,不需要自己设计外围的PCB板载天线,只要注意PCB布局的时候设置Keepout区域就可以了。
data-src="https://img2024.cnblogs.com/blog/3763221/202602/3763221-20260219012524745-188723255.png"
通过上面的分析,我们需要两个电源域,5V和3.3V,分别供给电机和单片机以及芯片。
而一般的锂电池的供电电压是3.7V,肯定是不能直接供电的。
一节锂电池的优势是轻便,但是带来的劣势是使用时间比较短,而且升压的话是要用到DCDC
两节锂电池虽然会重一点,占空间会大一些,但是无伤大雅,我们有亚力克底板可以承接。
这样带来的好处是更容易的电路设计,使用两颗LDO就能转换出5V和3.3V的电压。
其实在这里我考虑过电池的充电管理,想的是找一颗适用于2节锂电池串联的充电芯片,SLM6800或者CN3762。
但是转念一想,好像可以直接把电池取出来充电,于是就没有设计这一块。
(然而事实上组装好之后电池仓被挡住了,根本取不出来,但是好在电池比较坚挺,一直坚持到了调参成功)。
电池仓采用的是这种贴片式的,安装的时候让电池朝向一正一反,把一侧的金属触点用线焊到一起,另一侧就是7.4V的电压输出
data-src="https://img2024.cnblogs.com/blog/3763221/202602/3763221-20260219012524808-1635185663.png"
厚度不能太厚也不能太薄,超过6mm会导致螺柱头伸过不来而且不易打孔,太薄容易断裂,3mm是一个比较合适的大小。
data-src="https://img2024.cnblogs.com/blog/3763221/202602/3763221-20260219012524790-1923654214.png"
原理图参考网上的资料,主要是MPU6050以及DRV8833的外围电路,照着Datasheet画就行了,其他的都非常简单。
IDE的自动下载没问题,但是在下载完成后用sscom打开串口时,要关闭串口软件的打开串口时自动发送RTS,否则会导致芯片进入下载模式。
data-src="https://img2024.cnblogs.com/blog/3763221/202602/3763221-20260219012524822-1027278779.png"
注意电源通路,有些一看就是大电流的的线路要加粗,比如电机驱动芯片的输出,ESP32的VCC输入。
去耦电容靠近芯片脚,ESP32的天线区域超过板框悬空即可。
data-src="https://img2024.cnblogs.com/blog/3763221/202602/3763221-20260219012524782-908196259.png"
data-src="https://img2024.cnblogs.com/blog/3763221/202602/3763221-20260219012524810-1204476675.png"
这一部分主要会讲实际调试时遇到的问题以及解决办法。
电机的接口封装是ZH1.5接线端子,6线,而我画板子的时候画成了PH2.0,买的也是PH2.0的接线端子。
而且还把直插买成了侧贴(经验教训,嘉立创的封装在种类比较多的时候要确认好是不是自己想要的那种)。
导致到货后和板子一比对发现这是绝对插不上的(╯‵□′)╯︵┻━┻
但是转念一想,既然只是接线端子,而且这个电机也不用频繁拔插,可以把电机的引线直接焊到表贴焊盘上,只要每个脚的定义都对准了就好了。
于是直接开焊,焊接完成后发现效果还不错,锡加的足一点,让线完全包覆在其中就没问题。
MPU6050读不出数据
这个其实是个软件的锅,用MCU一直读不出传感器数据,用示波器看管脚发现SCL和SDA的波形有是有,就是不太对劲。
我一直以为是硬件的问题,因为QFN-24封装确实有那么亿点点难焊接。
拆了又装,买的两片MPU6050轮番上阵,这个不行换那个,折腾了半天。
最后我转念一想,是不是软件的问题,Arudino的库肯定是没有问题的,管脚重映射也是有效的,SCL和SDA脚也确实是有波形的,就是会定时的出现不太对劲的波动。
然后我突然想到,乐鑫的ESP32-Wroom32模组在Arudino
我又查阅了市面上常见的使用乐鑫ESP32-Wroom32模组的开发板,发现它们选的也都是ESP32
data-src="https://img2024.cnblogs.com/blog/3763221/202602/3763221-20260219012524827-1456523240.png"
Module,发现这玩意长这样,虽然它们名字长的很像,但真就不是同一个东西。
data-src="https://img2024.cnblogs.com/blog/3763221/202602/3763221-20260219012524770-2100958328.png"
然后在设置里把开发板一改,立马读出数据来了.
测试电机的时候发现一边转,另一边不转,说明电机驱动芯片功能肯定是好的。
问题要么是虚焊,要么是PWM没有输出。
用万用表的电压档测,发现不转的那一侧的IO34和IO35的PWM没有输出。
搜索引擎查阅资料,发现是ESP32的管脚功能问题,ESP32比较多管脚的系列的的IO34-39只能用作输入,不能用作输出。
data-src="https://img2024.cnblogs.com/blog/3763221/202602/3763221-20260219012524777-172753899.png"
于是我直接把IO34和IO35就近飞线到最近的能用的管脚IO12和IO27上,然后在代码中改一下PWM的输出脚,电机就能转动了。
原本有想过好好写一下,但是发现前辈们已经把这些东西讲的很透彻了,再重复也没什么意义。
平衡小车的PID环体会心得_ReCclay的博客-CSDN博客_stm32平衡小车
PID深度解析(基于STM32平衡小车)_Carbon6的博客-CSDN博客_平衡车控制算法
data-src="https://img2024.cnblogs.com/blog/3763221/202602/3763221-20260219012524828-1278066705.png"
data-src="https://img2024.cnblogs.com/blog/3763221/202602/3763221-20260219012524820-981101951.png"
/*******************************************************************函数功能:直立PD控制入口参数:角度、角速度返回
******************************************************************/
}/**************************************函数功能:速度PI控制入口参数:电机编码器的值返回值:速度控制PWM
**************************************/
Encoder_Integral;//=============速度PI控制器=======================//Encoder_Least
测量速度(左右编码器之和)-目标速度(此处为零)Encoder
/**************************************函数功能:两侧电机同速控制入口参数:电机编码器的值返回值:电机同转速控制PWM
**************************************/
{Serial.begin(115200);ledcSetup(0,
//设置LEDC通道0频率为10K,分辨率为10位,即占空比可选0~1023ledcSetup(1,
//设置LEDC通道0在IO1上输出ledcAttachPin(PWM2,
//当电平上升沿时,触发中断attachInterrupt(21,
25);mpu6050.begin();mpu6050.calcGyroOffsets(true);}int
{delay(delaytime);mpu6050.update();int
balance_UP(mpu6050.getAngleY(),
Rcode1);Motor_Left_Setspeed(Final_PWM);Motor_Right_Setspeed(Final_PWM
50){Serial.println("===================");Serial.print("tgyroY
Serial.print(mpu6050.getGyroY());
Serial.println(mpu6050.getAngleY());Serial.print("Lcode1
Serial.println(Rcode1);Serial.print("balancePWM
打印直立环PWM值Serial.print("velocityPWM
打印速度环PWM值Serial.print("compensationPWM
Serial.println(compensation_PWM);
打印同速环PWM值Serial.println("==================\n");n
//叠加数据到comdatadelay(2);//延时等待}if
class="post-meta-container">
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback