目录
前言:
1.硬件部分
1.1 STM32最小系统
1.2 电源
1.3 TB6612电机驱动模块
1.4 串口通信
1.5 OLED模块
1.6 蓝牙模块
1.7 LED灯模块
1.8 MPU6050模块编辑
1.9 硬件焊接与调试
1.10 组装
2.软件部分
2.1 代码
2.2 逻辑实现
2.2.1 control.c
2.2.2 usart.c
结尾
本文主要为复刻b站up主开源的平衡小车以及自己的学习过程,其中加入自己踩过的坑以及以及对该项目的理解,复刻这个项目的原因一来是自己希望能够通过做点小玩具加深对stm32的理解同时获得一点成就感让自己坚持走下去,二来是因为这个up主设计的太好看辣!!!,下面是教程希望对大家有一点帮助!!
有关文件我会放到网盘中,希望大家留下赞,谢谢!!!
我整理的资料有一些修改:链接:https://pan.baidu.com/s/1MOopSZY09zvE5uHRtji-WQ 提取码:yang
以下是up主的视频链接:【开源】STM32平衡小车_哔哩哔哩_bilibili
up主的资料:地址:https://gitee.com/WanDerFo/balance_car.git BGM: Far away from Home
话不多说,先来点实物图:
下面进入正题
图1.原理图
图2.PCB
可以看到在原文件中已经将各个部分模块化,分为了STM32最小系统、电源、串口通信、电机驱动、MPU6050、蓝牙、LED、OLED等八个部分,下面对这八个部分进行逐一分解。
图3.stm32最小系统
可以看到最小系统由stm32f103c8t6芯片以及外围电路组成:
其中烧录接口使用的是stlink接口进行代码的下载,去耦电容主要作用是滤除杂波,保证芯片的正常工作,在设计pcb时去耦电容应该尽量靠近芯片,复位电路主要用于复位,让芯片重新开始工作,晶振电路相当于芯片的心跳,不过stm32有内置72Mhz的晶振,具体使用到外置的需要进行配置。
电源电路主要用于给各个模块供电,在该项目中,使用的是两节18650的锂电池串联进行供电,所以输入的电压为3.7Vx2=6.4V,实际电压以测得为准。其中供电有三个主要电压,第一是原始的输入电压,由电池直接供电为6.4V主要用于电机的工作,第二为经过AMS1117-5.0芯片降压后的5V电压,主要用于TB6612电机驱动芯片和电机上的编码器工作,第三为经过AMS1117-3.3芯片降压后的3.3V电压,主要用于stm32主芯片、mpu6050、蓝牙还有一些其他的电路工作。
图5.电机驱动
该模块主要用于电机的驱动,通过stm32f103c8t6发来的信号进行相应的PWM输出从而控制电机的运动,另外又通过电机上带的编码器进行电机运动状态的反馈从而进行相应的运算处理。
图6.串口通信
该模块通过type-c口与串口芯片CH340芯片可以与电脑进行连接调试,在小车启动过程会打印一些数据。
图7.OLED模块
OLED模块主要用于小车运动过程中的角度信息、蓝牙的连接显示
图8.蓝牙模块
蓝牙模块主要用于小程序与平衡小车的通信,可以通过蓝牙来控制小车的运动方式以及led灯的亮灭
图9.LED灯模块
LED灯模块主要为了指示系统运行是否正常以及添加外观效果
图10.MPU6050模块
MPU6050模块主要用于获取小车的姿态,通过获取到的姿态进行反馈到stm32f103c8t6主芯片中进行运算,若发现运动角度发生偏差则对电机进行控制从而调整小车的平衡。
焊接工具:电烙铁、热风枪、焊锡、洗板水等
为方便调试以免后面出了问题找不出来,首先进行电源、串口、最小系统的焊接(焊工有限,轻点喷,意见全不接受,建议全部接受)
图11.pcb板
在这部分焊接的时候注意芯片与usb口的引脚不要连接到一起,否则有可能无法正常工作。
在焊接完成后用万用表进行测试电源正负,保证电路不要短路,保证电路不要短路,保证电路不要短路,否则可能烧芯片。
在焊接完成后进行代码的下载,下载到板子上后给板子插上串口与电脑相连,打开串口调试工具然后按下复位。(记得对板子进行供电,使用电池或者stlink接3.3V,USB本身不供电)
进行代码编译时发现会报错(有OS版本),这时需要把这几个文件添加到CORE文件夹中
有以下界面那么恭喜你,你目前的电路是没有问题的。
图12.串口调试界面
如果没有呢,那也别着急,咋们好好检查以下是不是焊错了、连锡了、还是芯片用错了,特别是usb口那里(好难焊,我好菜)!!
那么到这离成功还远咋们继续。
把剩下的器件全部焊完
图13.pcb板
图14.反面pcb
焊完了pcb板,有条件的用洗板水对板子进行清洗,去除掉焊接残余的松香和小焊锡,要是没有条件的小朋友呢,那就将就一下检查检查有没短路吧,当然焊完也要记得测测有没短路噢!!
到这你可以选择重新下载一次代码,也可以不下载(我重新下了)
再次进行串口的连接测试,显示下图内容:
图15.串口测试界面
要是你还是显示上次的Initialization failed!那就不正常了,要好好仔细检查你焊的电路了,这里我调试了有些时间,还去问了up,没想到居然回我了!!感动!!!!再次实名感谢
所以啊,焊工该练练了!!!
另外我还发现了个问题,我的炫酷LED等它不亮,这可不行啊,于是我仔细看了电路图,我发现我买的5730LED灯,它的中间引脚居然是和正极相连的,它不同颜色中间引脚的极性不一样。对此新的知识又增长了,不要惯性的认为所有的LED散热焊盘都是连地的。所以PCB这里需要进行修改把中间的焊盘连接线给去掉,什么都别连。就能无论买到什么颜色都可以用了。
修改后的PCB板放在网盘中!!!
当然,我焊都焊了那么久了怎么可能放弃这块板,于是我在中间垫了一张纸,给隔开了(哈哈),能正常使用。(不要试图把线割开,板子上打了过孔,连到了另外一层)
图16.LED BUG
记得四个LED都需要改。
在板子调试没有问题后就开始进行组装。我再次发现了BUG,按照up做的底板电池盒好像装不下需要稍微倾斜,才能放下。对于我这种强迫症后期选手来说也太难受了,于是我加宽了底板(我用的PCB板来当底板),让它能容下电池盒。
图17.电池盒与电机固定器位置冲突
修改后如下图明显胖了一圈,但是它能放下电池盒呀,且不影响使用。(温馨提示:嘉立创可以白嫖)
图18.修改后底板图
装好后硬件部分就基本完成了,如果有哪些地方觉得不协调可以自己调整一下
图19.组装完成后图
对于物料更新也会放到BOM表中,BOM表我里加上俺购买物料的连接,省下你的小钱钱。
对于软件部分,可能需要一点代码基础(对于我这种小新人来说理解起来有点吃力),其实代码Up主已经注释的很清楚了,但在两个版本中有两套代码,一套是裸机开发,一套是搭载了freerots系统。相对来说搭载了操作系统的代码会稳定一些,当然先看裸机代码来理解其中的逻辑会相对容易一些。
图20.代码
想看懂搭载了FreeRTOS的代码,必须要去了解一下什么是FreeRTOS,我是看了韦东山老师的课,对才对FreeRTOS有了一个大致的了解,课程连接如下:韦东山freeRTOS快速入门视频教程_哔哩哔哩_bilibili
图21.主函数
简单来说FreeRTOS是一个实时操作系统,采用嵌入式实时操作系统(RTOS)可以更合理、更有效地利用CPU的资源,简化应用软件的设计,缩短系统开发时间,更好地保证系统的实时性和可靠性。根据任务的调度方法使任务分成很多个碎片来轮换执行,从而实现多任务的实时性。(老师讲的比较明白,我还需要进一步学习,建议看课去)
我是先看了搭载系统的代码后觉得不是很明白然后从裸机代码开始重新看的,大致明白了其中的逻辑(不对的地方欢迎指正)
相关代码我也做了自己的注释方便理解,都在网盘中,咋们挑重要的讲,我觉得比较重要的几个头文件是control.c 、usart.c
图21.control.c
从结论出发,可以从名字看出该函数主要是用于控制,通过Mpu6050的INT数据更新进行中断的触发进入函数
void EXTI9_5_IRQHandler(void),该函数主要功能是:
1.获取mpu6050传回的角度信息
2.通过收到的蓝牙信息进行相应设置
3.约束极限速度
4.设置转向约束
5.将获取到的角度传到PID控制器中进行控制,其中分为角度、速度、转向
6.根据蓝牙数据选择是否执行三角形、矩形运动
7.拿起与放下检测
8.侧立运动
关于上面的功能我都有相应注释
图22.EXTI9_5_IRQHandler
当然最最最重要的还是PID控制啦,简单来说PID控制就是输入的变量通过一定计算输出向目标变量靠近的值,使电机朝着这个值进行运动,这句话看不懂可以多看几遍。下面是我的理解:
例如你输入一个目标速度,一个当前速度,然后pid算法就会根据你输入的速度值进行计算,然后输出的pwm值可以使你的电机快速的达到这个速度,并保持稳定。好了PID差不多就是这样,我们根据这个道理把它反应到角度上来,使我们的小车维持在一个平衡的角度,如果向前倾斜了电机就根据pid的到的pwm值向前运动,使小车回到平衡状态,这就是其中最重要的逻辑。通过这个逻辑我们实现了角度、速度、角度综合的一个pwm,使小车的运动达到我们想要的效果。
图23.PID控制
图23.usart.c
usart.c主要功能是接收蓝牙发送的数据并进行处理,相关指令功能up主均已给出详细的解释如下图:
图24.指令解析
好了差不多到这,算是近期学习总结吧,有小作品才会有继续前进的动力,自己还有许多的不足,如果有什么我写的不对的地方欢迎大家指正,希望都能复刻成功,谢谢!!!