项目心得
项目心得
John Doe优化后
项目总结与收获
1. 平衡车
在平衡车项目中,我实现了小车的平衡控制,效果良好。主要模块如下:
- 硬件:
- MPU6050 六轴传感器
- STM32F103CT86 最小系统板
- TB6612 电机驱动模块
- 两个带编码器的减速电机
- 12V 电源(3节电池)
- 自制 PCB 板(嘉立创打板)
- 价值 80 元的底座
- OLED 屏幕
- NRF2401 无线通信模块(100m距离)
- FreeRTOS 操作系统
2. 摇杆遥控器
在遥控器项目中,实现了超远距离的控制。主要模块如下:
- 硬件:
- STM32F103CT86 最小系统板
- NRF2401 无线通信模块(100m)
- OLED 屏幕
- 无源蜂鸣器
- PS 游戏手柄 3D 摇杆电位器模块
- 纽扣电池
- 开关模块
- PID 算法
- FreeRTOS 操作系统
项目背景与动机
对于这两个项目,我并没有使用老师提供的学习版,而是购买了 STM32F103 最小系统板进行开发。这样做的目的是提升自己的动手能力。通过使用 STM32F103 和 STM32F407,比较了两者的差异,并且深入学习了 STM32F103 的原理图制作、PCB 设计、FreeRTOS 移植等内容。在查阅资料过程中,我通过 OpenAI 和 GitHub 搜索相关文档,找到了 STM32F103 的帮助文档,并深入学习了其应用。
平衡车项目细节
- 确定机械中值:
通过 MPU6050 传感器获取小车自然直立时的欧拉角作为初始平衡角度。要注意,传感器的摆放方向需要和其他人的配置一致,否则会导致角度计算出错。 - PID 调试过程:
- 直立环调参:
- 调整 KP(比例系数),直到小车有明显的平衡响应,但避免过大产生低频震荡。
- 加入 KD(微分系数),抑制低频震荡,确保平衡稳定。
- 速度环调参:
- 关闭直立环,调节速度环的 KP 和 KI,使小车能够修正漂移,保持静止。
- 确认速度环反馈方向与预期一致。
- 转向环调参:
- 关闭直立环和速度环,仅调节转向环的 KD,使小车避免自旋。
- 直立环调参:
- 起落检测:
通过检测欧拉角变化判断小车是否被拿起,若小车被拿起则关闭电机,放下后重新初始化 PID 控制。
摇杆遥控器项目细节
最初,我使用面包板搭建了遥控器系统,并成功实现了 NRF2401 模块的超远距离通信。随后,我收到了定制的 PCB 板,并开始焊接。焊接后,我遇到了一些问题:虽然 NRF2401 可以发送信号,但另一个 MCU 无法接收到。通过排查后,我发现是由于电源不足或信号干扰导致的。进一步调试后,问题得以解决。
MicroPython 与 ESP32 开发
为了实现智能门锁项目,我决定使用 MicroPython 开发 ESP32。尽管 Python 提供了许多便捷的内置函数,但在内存占用方面较为吃紧。特别是导入了过多模块时,内存使用会迅速增加。为此,我学习了将 .py 文件转换为 .mpy 格式的字节码文件,减少了约 30% ~ 50% 的内存占用。
同时,我还学习了如何使用 uasyncio 实现多线程协作,虽然与 FreeRTOS 的任务调度类似,但 MicroPython 中的协程使用 await 语句进行任务切换,较为简便。
总结
这两个项目使我在硬件设计、嵌入式开发和调试方面有了很多实战经验。无论是在解决 NRF2401 的信号干扰问题,还是在调试 PID 控制时的艰难历程,我都积累了宝贵的经验。接下来,我还计划深入学习 MicroPython 和 ESP32 的更多功能,继续推进智能门锁项目。
初稿
在本次项目阶段中,收获还是蛮大的。
1.平衡车:目前实现了平衡车的平衡,平衡效果还是可以的,模块用到了 MPU6050六轴传感器模块,stm32f103CT86最小系统板,TB6612电机驱动模块,两个带有编码器的减速电机,3节带有12V电压的电源,自己在嘉立创打印的PCB板子,一个价值80快的底座,以及两个轮胎,一个OLED屏,无线通信模块NRF2401(带有晶震,距离可以用100m),母座,FreeRtos操作系统
2.摇杆遥控器:实现了摇杆遥控超远距离的控制,模块用到了stm32f103CT86最小系统板,无线通信模块NRF2401(带有晶震,距离可以用100m),一个一个OLED屏,一个无源蜂鸣器,两个PS游戏手柄3D摇杆电位器模块,一个纽扣电池,一个开关模块,以及母座,PID算法,FreeRtos操作系统
对于这两个小项目,我并没有用老师发的学习版来做,而是另外买了stm32f103最小系统板来使用,至于为什么用它来做,其实是为了提高自己的动手能力,其实觉得自己的动手能力挺差的,来学硬件也是为了提高一下自己的动手能力的,也是想看stm32f407和stm32f103这两个MCU有什么区别吧,也是抱个好奇心去学的,最后发现其实也差不太多,在和温工老师学习stm32f407的时候也是去试着用stm32f407um版本的chm帮助文档去写代码的,我就想着自己去找一下stm32f103的um版本的chm帮助文档去使用,主要是用ChatGpt的OPEN AI大模型搜索引擎帮我去github上面找相关的链接,最后还是找到了,其实stm32f407老师那个um版本的chm帮助文档,其实我也找到了,是一样的,我也是着去找了一下关于GD32这个国内最近非常火热的MCU的帮助文档,最后还是没找到他的这个chm帮助文档,但是在官方网站上可以找到相关GD32版本MCU的程序,外设什么的相关源码,其实和chm帮助文档是一样的,只不过是以文件夹的形式存在,没有chm帮助文档,那么方便,
为了做这两个项目,我需要额外去学习stm32f103CT86最小系统板的使用,原理图的制作和PCB的制作和以及嘉里创打板子,stm32f103CT86的FreeRtos的移植,面包板的使用,在第一次使用stm32f103和面包板搭配使用时候,其实也遇到一些问题,比如MCU没有插好,导致某个IO口无法使用,但是看教程上可以使用,其实也是买的他家的stm32f103,我还去找了是不是stm32f103的一些IO口是不是有别的功能,或者没有这个功能了,发现还真的有人和我发现了同一样的困难,其实不然,是我MCU没有完全插入面包板导致的,但是其他的IO口可以使用的,所以我没有考虑到是否是MCU没有插好。
在平衡车项目中,我实现了小车的模型搭建,并且通过移植别人的MPU6050陀螺仪模块代码和DMP去实现小车的俯仰角,翻滚角,偏航角,其实也需要用到github某个大佬的源码,在调PID的时候是真的痛苦,具体的步骤如下:
确定机械中值:
通过MPU6050传感器获取小车自然直立时的欧拉角,作为初始平衡角度。直立环调参:
- 调整KP:增加KP直到小车有明显的平衡响应,但避免过大产生低频震荡。
- 加入KD:调整KD以抑制低频震荡,确保小车反应迅速稳定。
速度环调参:
- 关闭直立环,调节速度环的KP和KI,使小车能够自动修正漂移并保持静止。
- 极性验证:确认速度环的反馈方向与期望一致。
转向环调参:
- 关闭直立环和速度环,仅调节转向环的KD,使小车能够自我修正方向并避免自旋。
加入拿起与放下检测功能:
通过检测欧拉角变化,判断小车是否被拿起,超过一定时间关闭电机,放下后重新初始化PID控制。,
在确定机械中值的时候,需要注意几点,在你看别人确定机械中值的需要确定你MPU6050的摆放方向是否和他的一样,你也可以将俯仰角,翻滚角,偏航角这几个通过串口一起打印出来,看那个值变化最大,就选哪个作为你要确定机械中值的目标了,最后会发现你往那边倾斜小车就会往那边倒,这个时候机械中值就确定了,PID算法就是P是一个比例系数,I是英文中的increase,起到增益的效果,D就是decrease,起到预测未来的作用,可以提前知道小车的状况,直立环用到的是PD,速度环用到的是PI。
在做遥感遥控器项目中,起初我是用面包板搭建的,并且可以实现NRF2401无线超远通信,因为我的PCB还没到,在11月10日,我得知我的PCB板子到了,我欣喜若狂的去快递店拿快递,打开包装,开始拿器件焊接,我其实我挺害怕我打的PCB有问题,因为我是很少打板子的,焊接完成好,开始调IO,最终发现板子没有问题,但是NRF2401他可以发送,但是另外一个MCU接受不到,但是当我把这个MCU的NRF模块给拔掉,就接收到了,就证明我的NRF2401其实没有问题,是受到干扰了,或者电源供应不足导致的,信号受到干扰我开始觉得是我的PCB板子的线的长度不一样,导致电阻不一样,而造成信号的不好的,另外一种情况就是因为NRF2401这个模块也是用的2.4GHZ频段的信号,而wifi基本上也是,为了证明我的猜想是对的,我有去借了一个别人的stm32f103MCU重新接线,调GPIO口,好了之后,我用遥感遥控可以发现偶尔可以发送出去,并且另外一个MCU可以接受到消息,最后偶然的发现,他可以在某个地方可以一直发送成功,我就觉得是不是这个晶振被影响了,然后我遮住晶振,发现确实是晶振被影响力,最终解决了这个问题。
,在弄完这两个项目之后,我还额外去学习了用MicroPython去烧录ESP32,并打算用它去实现智能门锁,此前我并没有用过Python去操作MCU,所以我也变学习边弄的,想用Python去写ESP32其实是因为他内置函数比较多,也没有和C语言那个一样需要写相关的初始化,MicroPython它是一步完成的,虽然方便但有弊端,内存占用太多,运行没有C语言那么快,在代码比较少的时候其实是差不多的,但是一旦代码变多了,就显而易见了,在用MicroPython进行ESP32开发的时候,老是遇到RAM内存不够的情况,即超出了,占内存的情况有比如你
import导入了比较多的模块,因为Python它是用解释器的,而不是像C是用编译器线进行编译,然后在执行代码,每行每一行的运行,可能之前都是在Window上进行学习的,没有什么内存顾虑,但是在嵌入式开发上应该会经常和这些问题打交道,一般在嵌入式开放上应该是需要用到那个类或函数或变量,就导入哪个,这样应该可以大大减少内存的使用,还有一个减少内存使用的方法是使用MicroPython官方提供的一个工具,用于将.py文件转换为.mpy格式的字节码文件 ,这样可以减少内存30%~50%的使用,类似于编译,需要用到多线程的话,需要导入import asyncio模块,这个模块是使用的是协程,而不是和FreeRtos一样使用的是任务,其实FreeRtos也可以使用协程,需要打开相应的开关,用法都是差不多的其实感觉,都是来回调度任务,在FreeRtos上它是用到xTaskDelay(),而在asynico上它是使用的是await来跳转到别的任务。


