
STM32电子桌面宠物小狗
简介
复刻平台上别的大佬的开源工程,本人降低了代码复杂度,并且附上了项目开发的全流程心得。开发笔记颇长,有5000字,而且整体逻辑稍微有点乱。本人正在着手开发2.0版本,平时也会带着完善开发笔记的。
简介:复刻平台上别的大佬的开源工程,本人降低了代码复杂度,并且附上了项目开发的全流程心得。开发笔记颇长,有5000字,而且整体逻辑稍微有点乱。本人正在着手开发2.0版本,平时也会带着完善开发笔记的。开源协议
:GPL 3.0
描述
STM32电子桌宠狗子----复刻笔记
源码放在了页面最末尾的附件中
总体路线:尽量少加改动,尤其不要有创新性的改动。
- 做好新的语言模块的适配设计改动;
- 做好蓝牙模块的适配;
- 5v充电宝模块适配;
- 考虑加入超声波避障;
- 还有红外悬崖检测;
- 甚至,加入巡线功能!还能顺便把PID研究了!
- 加入“情书存储、显示”功能,甚至是加入WIFI连接功能远程修改文字内容!
- 能否实现一个辨别声音来源方向,进而在听到一些动静后转向面对着它的功能?
1. 总体设计规划
1.1. V1.0版本设计要求:
简介:整体项目的1.0版本基于V1.0的硬件电路。现在这个的基础上尽可能实现更多的功能,相当于一个工程机、验证机,怎么弄都行,不必考虑美观,直接大量飞线都成,重点是积累各模块的使用经验。
待得这些功能都调试较为成熟之后,可以着手重新设计一个板子,这时你对这个新板子有哪些需求就已经十分熟悉了,设计板子就可以考虑周全
- 采用锂电池供电,这一点不做强制要求,可以退一步采用有线供电,拿出可以实际使用的成品就好,能够完成其它的功能;
- 能够通过串口控制狗子的动作,实现基本的动作控制功能;
- OLED显示屏可以正常显示、切换表情;
- 加入语音模块的控制功能,并且包含各种必要指令;
- 总体装配,包括线缆整理、粘贴固定、显示屏固定;
- 直接把线缆裁掉一部分吧;
- 加入超声波避障;
- 加入呼吸灯实现;
- 整合两个开源项目的各种动作设表情设计;
- 丰富表情互动;
- 加入红外悬崖检测;
1.2. V2.0版本设计规划
- 实现锂电池独立供电,板子的硬件要升级;
- 重新设计电路板,取消STM32,直接焊接ASRPRO核心板到底板上作为主控;
- 舵机接线端子改为采用防反接设计,取消杜邦线使用;
- 板子可以考虑使用鲜艳色彩;
- 代码全部重写,全部基于ASRPRO的图形化编程实现
- 代码全面重构舵机动作实现逻辑,不适用延时函数,舵机控制速度可调;
- 实现电池电量检测、低电量报警功能;
- 重新设计外壳,使之方便安装舵机、电路板以及18650电池;
- 方便3D打印;
- 完善整体代码逻辑,模块化编程,尝试使用结构体传参;
- 配置休眠模式,延长续航时间;
目前的关键技术不足:
- 串口中断回调机制等的使用;
- 这个留到0版本解决,1.0版本重在做出一个成品,粗糙点没事;
- 这个到时候要先专门花时间研究理论,看看视频、看看示范代码、和AI讨论一番
- 模块化编程的理论和实战;
- 也是留到0版本解决
- 同上
2. 硬件电路
2.1. 初次打板测试
2.1.1. PCB设计规划
- 元件、封装绘制;
- 先是画元件
- 去芯片手册中寻找引脚定义,
- 至于尺寸倒不必太在意,能塞下所有引脚定义的名字即可
- 再是画封装
- 还是去芯片手册,这次是找尺寸图了;
- 各焊盘的大小、间距以及整体的尺寸都要严格按照手册上的来;
- 对于芯片要注意标注方向,某些二极管也可以标一下,方便焊接;
- 最后要关联元件图和封装图;
2.1.2. PCB打样后测试
问题
- 电源模块下面忘记开一个方形孔了,现在板子在那里凸出来一块,有些碍事
- 通过排针解决了问题,缺点是焊接起来很麻烦;
- 语音模块插在板子上之后无法正常下载程序,暂时不知道问题所在
- 怀疑是电平冲突之类的原因,因为底板是打算把他的串口0用作串口通信引脚的并且连接到了STM32的串口引脚上,但是语音模块上又将串口0的两个引脚同CH340连接起来,用来进行串口烧录程序,于是就发生冲突了;
- STM32核心板也遇到了类似问题,佐证是我将CH340芯片拆掉后就恢复正常了
- 解决方法不难,不要使用语音模块的串口0就好,下次设计电路板要注意,这一次先飞线将就吧;
- OLED模块接口GND和VCC顺序设计错误
- 最好加入防反接设计,这样整个电路中任何一处出现短路都可以提供一定的保护作用。
- 还有排母是竖着的,这样子OLED的不方便安装
- 使用弯脚排母;
- 板子四角要挖孔,调试时用铜柱支撑,否则触点可能和金属接触导致短路;
- 孔的直径要和外壳对应,方便安装
- 充电宝模块上的电量指示灯一直常亮,有点遮挡呼吸灯的光亮了,不太优雅
- 模块整体体积偏大,插件太多,同时颜色不同意,不够美观
- 当充电宝模块连上电源给电池充电时,板子主供电无法断开
- 参考正点原子无人机遥控器电源选择部分的设计,用一个单刀双掷开关实现USB供电和电池供电切换等;
- 供电问题,当多个舵机同时启动时,充电宝模块的供电就开始断断续续乃至一直卡在那里;
- 推测是供电模块的动态响应不足,所以尽管最大功率大于需求功率也还是不行。
- 加入的电容数量容量可能依然不够大;还有摆放位置的问题;
- 软件上也要下功夫做改进,不要搞这种所有舵机同时最大功率启动的最难工况!
- 升压电路重新设计,加大电感值、电容值;
- 最好再加入加压电路,可以用来学习测试;
- 单片机的串口1无法正常接收数据,无法进入中断,然而串口3却没事
- 手边的18650电池跟当前的外壳不适配,不好安装;
- 电池连接线要足够粗,不能用劣质线了;
- 模块的质量、稳定性要设法提升;
2.2. V2.0版本
2.2.1. 设计要求
- 电源部分改进,要求能够满足5个舵机同时工作(颇有挑战性)
- 尺寸把握改进,更好的装配到3D打印外壳上;
- 四角要打孔,方便使用螺丝固定;
- 舵机接线、各处正负极等,把丝印标注好;
- 比如两个串口引脚引出口,把引脚号标上;
- 锂电池供电、5V供电以及3V供电正负极要做好标记;
- 加入3,3V供电输出;
- 电池供电端加入输入防反接;
- 新的物料准备
- 弯脚排母,用于OLED接口;
- 准备尺寸合适的电池;
- OLED接口看看好不好留出两个,以适配不同OLED引脚线序(非必需)
2.2.2. 行动计划
- 最关键的问题,是电机驱动的问题,怎么办?先去学习各方面的经验、理论知识!怎么学?
- 研究网上不同版本电子宠物的硬件电路设计,寻找与自己的不同之处;
- 做好记录
- 同Al深入探讨,根据已有实验的现象推测可能原因,你先把这些原因在理论上研究明白;
- 还是做好记录
- 再到网上找针对类似问题的经验帖,知网、B站
- 要有足够的耐心,更换不同的问法反复搜索;
- 将不同文章的观点汇总起来,形成一个总的概念;
- 求助老师,看看老师有什么建议;
- 综合上述内容,制定借此帮助自己制定上述实验步骤
2.2.3. 学习过程
3. 软件设计
3.1. 总体要求
- 配置两个定时器,输出比较模式;
- 完成四个舵机的驱动实现;
- 知道如何驱动舵机让它旋转到指定角度;
- 在指定角度范围内往复运动并能够控制速度;
- 将CCR控制函数进行封装,更换方便辨认的名字,便于使用;
- 配置Timer2的四个通道,同时控制4个舵机进行不同的运动;
- 完成通过串口接收指令,来执行对应功能
- 能够通过串口与电脑收发数据;
- 研究江科大、AI的串口收发代码,学习其配置方法;
- 设计自己的实践验证步骤;
- 能够正常进入串口中断,并在其中执行相关代码;
- 研究比对小呆版、慢波版源码,参照AI生成的代码,
- 做出总结,设计自己的实践验证步骤
- 完成舵机驱动行走代码的移植,实现通过串口控制舵机执行不同动作;
- 通过AI、B站、正点原子例程,比较全面的学习一下模块化编程标准步骤,包括模块化封装、不同文件参数传递、宏定义使用等等;
- 设计适合自己使用的工程代码架构,并设计自己的验证步骤;
- 语音模块和蓝牙模块的使用
- 使用语音模块来发送串口指令控制动作;
- 使用手机通过蓝牙发送串口指令控制动作;
- 整体整合、完善细节
- 把呼吸灯部分的代码实现补充进来
OLED表情显示实现,可以自己画表情,也可以到网上去找,具体配置参照下图教程:
四个舵机前进后退等动作的实现,这个较为困难,可以参考下图教程:
3.2. 具体实现
3.2.1. PWM控制舵机
- 舵机控制--实现角度控制
- 控制原理:舵机需要周期为20ms的PWM信号进行驱动,其中高电平的时长在5~2.5ms范围内调整,对应舵机转动角度0~180度;
- 所以根据公式,可以设置PSC为72,ARR为20000(这样频率就是50Hz);然后CCR在500~2500范围内调整;
- 封装函数,一个是舵机初始化函数,一个是舵机旋转角度设置函数
- 舵机初始化函数,其实就是输出比较的配置,在这里放一个之前封装的PWM_Init就好,相当于二次封装,PWM_Init是更底层的驱动代码,还可以由其它函数调用
- 甚至可以考虑进一步模块化封装,让PWM_Init函数可以传递参数进去,这个日后考虑;
- 第二个旋转角度设置函数,我希望通过这个函数可以直接传递0~180的角度值,而不需要进行换算;
- 舵机初始化函数,其实就是输出比较的配置,在这里放一个之前封装的PWM_Init就好,相当于二次封装,PWM_Init是更底层的驱动代码,还可以由其它函数调用
- 问题汇总---处理办法
- 未在花括号末尾按两下回车
- 书写不规范,函数声明时,若没有传递参数,应该写上两个void
括号中要写上void
- 花括号没有一一对应,注释掉代码的时候漏了一个花括号导致逻辑错误
- 驱动舵机没有反应,先检查一下电路连接是否错误,再换一个确认没有问题的示例代码测试,看是不是代码问题;如果还是不行,说明不是代码问题,这时换两个新的舵机试试,看是不是舵机损坏,这玩意还挺容易坏的
- 使用的函数未被声明,需要在该函数被定义的文件对应的头文件中声明,并且将该头文件添加到当前使用该函数的文件中;
- 使用一个定时器同时输出4路PWM时,发现只有其中一路有效,其它的引脚没有输出;
- 看看代码,看是不是对应的通道没有开启,写的时候是复制粘贴的,很容易忘记修改成1234;
- 实现往复运动及运动速度配置
- 只需要使用呼吸灯的加加减减的逻辑就行;
- 看了开源项目的源码,别人并没有使用这种逻辑,而是直接给舵机发送转到某个角度的指令,再转回来,以此实现往复
- 这其中是没有旋转速度控制的,相当于一直全速运行;
- 咱可以先使用人家的实现逻辑,至于更灵有创新的,日后再说;
- 同时控制四个舵机进行运动;
3.2.2. 串口通信控制
- 实现串口数据收发
- 遇到很大的困难,起初是直接使用开源项目的完整代码测试,结果串口3正常而串口1却不能够进中断,代码怎么检查都没有毛病、硬件连接也测试过还是不行,然后自己又去把串口部分的理论几乎从头又学了一遍,照葫芦画瓢配置依然不行!!!
- 结果呢,今天忽然想到更换一块STM32板子,诶呦我去,行了!!!
- 可见问题还是出在硬件上,就在先前用的那块板子上。这下就顺利多了;
- 这块板子是“定制版”,引脚线序和寻常STM32核心板一样,但它板载了CH340N芯片,我怀疑这个芯片就是罪魁祸首!
- 我先是利用CH340芯片直接接上电脑,发现串口可以正常收发数据,而之前使用外置的USB转TTL模块连接PA9和PA10引脚就不能收发数据
- 据此推测,PA9和PA10引脚因为CH340的缘故而无法使用,具体尚待验证!!
-
- 实现通过串口中断执行相关指令;
- 当把前面的CH340问题解决后,再一次使用自己整合的工程文件代码,串口接收中断是可以正常进入了,然而在中断内操作了变量后,在main函数内调用的该变量的值却没有正常更新;
- 这似乎涉及到跨文件的传参问题,当下尝试实现的做法是将需要在多个文件中调用并且经常会被认为修改用以调试的参数,定义在一个专门的.c文件中,并且给它建立一个.h文件来声明这些变量,按理说应该已经可以外部调用这些参数了;
- 总的来说,就是模块化编程、传参问题;
- 问了一下AI,发现这个问题牵扯到的内容还蛮广的,所以暂时不做具体研究
- 目前不采用单独建立.c文件用来定义各种变量的方式,直接把这些变量放在main文件,再声明为外部可调用,毕竟现在需要修改的参数也不多;
- 好了好了,搞复杂了,真叫人哭笑不得,居然是按键的初始化代码的问题!由于按键的初始化代码是移植江科大的,人家原来的配置是按键一端是接地的,另一端与IO口相连。配置IO口时,配置为上拉输入模式。
- 我的呢?按键的一端是接的VCC!虽然我也意识到这一点了,把IO口改为了下拉输入模式,这是对的,然而还有一处需要修改。
- 那就是图中的两个判断时候等于1的地方,江科大的原代码写的都是0,而我应该改为1啊!不然程序就会一直卡死在“等待按键松手”那一行代码!根本无法执行其他指令,即便因为来了串口中断去更新了变量的值,也无法执行主循环后续的代码。
- 问题是通过调试模式发现的,调试时我注意到每次全速运行后暂停时,程序都停在这个while里,于是发现了端倪
- 这一经历可以提供许多启发:
- 按键代码,使用while死等的方法实现等待按键松手,显然是很不妥的,在这里它就直接导致了程序卡死。再说就算是运行正常,这种实现也会阻塞程序;
- 下面的延时消抖也是如此,不多说了;
- 移植别人的代码,有哪些注意事项?如何减少这种软硬兼容问题的发生?
- 调试程序有哪些标准步骤?技巧?有什么巧妙的发现问题的方法吗?
3.2.3. 动作实现
- 大体思路
- 整体上是直接移植代码的思路;
- 先研究明白源代码的结构,尤其是各种参数的传递流程;
- 先移植一小部分做测试;
3.2.4. OLED显示屏
- 尝试直接把原作者慢波版的OLED代码移植过来,却发现汉字字模定义的地方报错,这个问题遇见过许多次了;
- 去看江科大的视频、结合小呆的驱动代码,他可能会提到这一点的原因,顺便把显示图像的方法学过来;
- 问题还是先放,后面再考虑,当下还是优先做个成品出来;
- 发现小呆版的OLED代码移植过来后是没有问题的,明明也是来自江科大的代码;
- 既如此,那就先用起来好了!!
- 问题处理
- 重复定义问题,下图中是错误代码以及报警信息,报警信息提示o和main.o都定义了Face_Mode。
- extern是用来声明一个变量而不是定义。这里你写了extern uint16_t Face_Mode=5;,这实际上是一个定义,而不是声明。
- 正确的做法是:
在一个源文件(比如c)中定义这个全局变量,不使用extern,例如:
uint16_t Face_Mode= 5; - 在其他需要使用这个变量的源文件中,使用extern声明它,例如:
extern uint16_t Face_Mode; - 如果这个变量需要在多个文件中共享,通常会在一个头文件中声明为extern,然后在多个源文件中包含这个头文件,但定义只能在一个源文件中。例如,你可以创建一个头文件h,其中包含:extern uint16_t Face_Mode;然后在global.c(或main.c)中定义:uint16_t Face_Mode = 5;然后在需要使用的源文件中包含global.h。
4. 外壳设计
- 要预留螺丝孔用来安装舵机;
- 四条腿也重新设计一下,不用原版的;
- 给四条腿贴上防滑贴;
5. 总体装配
3D设计学习
从零基础到掌握SolidWorks制作身体零件和腿部零件的水平,只需要安装软件2h和学习6h。
参考下图教程:
- 对于各模块的固定问题,如果因为事先的设计问题而导致无法正常的用螺丝等进行安装,那么不要犹豫,直接上热熔胶!
- 舵机的线缆太长
- 可以利用外壳的镂空设计将它缠绕其上,直至长度合适;
- 更优雅的方式是使用剪刀和剥线钳,直接把线子剪去一截再接起来;
- 可以将电源线统统连在一起,然后只需走一个端口就好;
- 四根信号线则是接回“头”,插到对应的排针上;
- 供电的问题,一个电源模块可能供电不稳定,然而电路板的设计已经固定了,简单粗暴的解决办法就是用两个电源模块!第二个直接飞线连接、热熔胶固定!
- 虽然不是很优雅,但能解决问题才是王道!
设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。


评论