暖冬-新年音乐播放器
简介
基于STM32F103C8T6经典小蓝板和经典0.96寸OLED显示屏的新年音乐播放器,重点为无源蜂鸣器电路,可用两个按键控制播放列表播放不同的歌,比较简陋但是加上蛇年丝印还是有点氛围感
简介:基于STM32F103C8T6经典小蓝板和经典0.96寸OLED显示屏的新年音乐播放器,重点为无源蜂鸣器电路,可用两个按键控制播放列表播放不同的歌,比较简陋但是加上蛇年丝印还是有点氛围感开源协议
:GPL 3.0
描述
一、前言:
感谢嘉立创的活动!
感谢嘉立创的20元器件券,50元彩色丝印券!
本次活动,我本来是想参考立创开源硬件平台上的一个灶台自动关火装置进行改造(换用C8T6小蓝板控制,增加部分功能),然后添加能播放新年音乐的报警功能和本身的新年风格彩色丝印来契合本次活动的主题。
但是因为各方面原因,当我好不容易搞定蜂鸣器相关电路的时候已经过了一个月了(对,就是这么慢),看着还有一周多就要截止的活动,我实在没法舍弃50元元器件券,同时也没法舍弃好不容易弄好的蜂鸣器电路,于是想要弄个新年音乐播放的简易制作,此外之前改造小黑的oled多级菜单代码一直没有用上,这次干脆就一起用上。
二、功能介绍:
- 新年音乐播放器有两个按键KEY1和KEY2,配合STM32F103C8T6最小系统板上自带的复位按钮,能操控的就这3个按钮;0.96寸OLED在上电时会展现一个简易操作菜单;
- 两个按键KEY1和KEY2,前者为左侧按键,后者为右侧按键,KEY1是选择键,KEY2是确定键,用于在OLED显示的多级菜单上进行选择,OLED显示的多级菜单当前页面上永远会有一个※来表示当前选择的条目,按动选择键KEY1就可以上下切换待选择条目(翻到最下面那一条时会自动跳到最上面那一条),按动确定键KEY2,则进入※所在的当前条目的内容
- 目前,主菜单只有"1.Music"和"2.To be continued"其中第二条“2.To be continued”点进去还是两条To be continued,这部分内容后续可以自己自由添加,而"1.Music"点进去有
"1.Jin She Kuang Wu"
"2.Chun Jie Xu Qu"
"3.To be continued"
分别是“金蛇狂舞”“春节序曲”“未完待续”,其中只有“金蛇狂舞”已将乐谱录入,其他的同理可以自行添加,相关部分将在软件部分介绍
三、参考资料:
(1)参考微信公众号“硬件笔记本”
(2)参考B站up主:_WNNN
四、硬件(原理图):
因为GD32和STM32F103C8T6核心板的封装是一样的,于是这里原理图我用的是GD32,但是不影响我最终使用STM32
其中KEY1和KEY2对接两个按键,GPIO配置为上拉输入即可(因为功能简单所以我使用的不是外部中断而是直接轮询读取)
OLED相关使用IIC通信,这里使用的是更加灵活的软件IIC,而PB4需要注意其原功能与JTAG有关,相关代码在写时需要先关闭JTAG功能
蜂鸣器选用PA11引脚不是乱选的,这是高级定时器TIM1的CH4通道,产生PWM波,也就是我直接通过PWM波来控制无源蜂鸣器这样比较简单
这个无源蜂鸣器驱动电路是本次的核心电路,我参考了微信公众“硬件笔记本”里一个文章的电路图,后来我发现在立创开源平台上搜索无源蜂鸣器相关的工程,有几个也用的是同一个参数
上面两个图一个是我参考的图,一个是用李闯EDA在最终电路板上画的电路图,这里需要先解释一下我这里用3个并联的10kΩ电阻替代原设计的3.3kΩ电阻没有别的意思,纯粹是我手边没有3.3kΩ的电阻于是只能并联替代
这里简单解释一下:4.7kΩ电阻起限流作用,防止流过基极电流过大损坏三极管;3.3kΩ电阻为基极下拉电阻,这样在BEEP端悬空时能让三极管保持在可靠关断状态,且其可以提升高电平门限电压
三个电容的作用,原图C2(也是我这个的C2)为电源滤波电容滤除电源高频杂波,原图C1(也是我这个的C3)可以有效滤除强干扰环境下的干扰信号,原图C3(也是我这个的C1)可以滤除蜂鸣器本身产生的高频杂信号
二极管这里是续流二极管,因为无源蜂鸣器作为感性元件,上电下电的时候会在无源蜂鸣器两端有高电压
三极管这里我是从手头有的3种三极管里选了一个封装最好焊接同时耐压和限流最大的三极管,并不是最合理适合的选择
因为我本身对于其原理处于浅尝辄止的阶段,所以更多本电路相关信息可参见微信公众号“硬件笔记本”的文章《蜂鸣器驱动电路设计》
其他相关信息参见本开源描述最后一部分“过程中的问题解决”
显示电路其实在电路板上就是一个4Pin2.54mm直插排母,用于插接IIC通信的0.96寸OLED显示屏模块,这里为了防止产生玄学问题加了一个滤波电容
上图参考24年“温湿度检测器”训练营的设计,两节5号电池盒用的也是同型号,防反接的电路中三极管则不是原型号,而是用的手头仅有的P沟道三极管;因为我开关剩余不多,因此用4Pin2.54mm直插排针和跳线帽配合的方式来替代开关
按键部分延续的还是经典的“简易示波器”那一期的经典电路,由软件负责消抖
五、硬件(PCB):
上图是PCB正面没铺铜和没放彩色丝印时的情况
首先,我元器件的排布总体是对称的,核心板,OLED等都是一条线上,KEY1和KEY2两个按键排布左右;
其次,为了节省空间,我将蜂鸣器相关电路挤在了核心板两排引脚的中间,因为核心板我是通过排母插件连接在PCB板上,中间有很大一片足够宽与足够高的空间,在上上次的“彩色丝印-过隧道拯救者”最先尝试,此次依然成功
最后,我的布线都是仅限于正面,这样一方面美观,一方面尽可能让背面未来铺铜的铜皮完整
上图是PCB反面没铺铜和没放彩色丝印时的情况
可以看出方面确实没有走线,只是布置了两个电池盒
上图是PCB正面铺铜后,放彩色丝印前的情况(开源文档最后面的部分会放出含有彩色丝印的情况,这里就不放了)
可以看出铺铜面积还是很大的,此外我还在焊盘密集的地方放了一些禁止普通的区域以去除铺铜中的不必要尖端
上图是PCB反面铺铜后,放彩色丝印前的情况(开源文档最后面的部分会放出含有彩色丝印的情况,这里就不放了)
可以看出反面因为没有走线,所以铜皮确实很完整
最后我发现了一个尴尬的事,我画PCB忘记加泪滴了,还好最后出来的成品没问题可以用(汗)
六、软件:
软件部分,我对关键的三个(类)函数画了流程图,次关键函数直接分析代码,剩下的函数(比如GPIO配置等)代码都标有注释,这里不再额外解释
1、有流程图的三个函数
上图是main.c文件中main函数的流程图和关键点解释
上图是menu.c文件(菜单文件,主要实现功能就是多级菜单)中光标类函数的流程图和关键点解释
上图是menu.c文件(菜单文件,主要实现功能就是多级菜单)中菜单类函数的流程图和关键点解释
- 几个重要函数之蜂鸣器与按键相关
因为是轮询而不是外部中断,按键对应GPIO只有一个要点就是配置为“上拉输入”(由原理图可知按键按下则接地),其余请开代码注释即可
上图是发声函数,前提是已经对PWM进行配置了(PWM配置也此不赘述,因为属于基本功能,代码旁边注释也很清楚),发声函数会根据参数(频率值)调整PWM波的频率(注意这里占空比永远是50%因为一般无源蜂鸣器设计的时候都是按照50%的方波设计的,这一点蜂鸣器的手册上也提到过)
TIM_SetAutoreload函数和TIM_SetCompare4函数都是固件库的函数,直接根据固件库手册按照功能找出即可,arr之所以用1000000除以频率数是因为计数器对72M分频72分之1所以是1M,PWM通道是4通道所以TIM_SetCompare4后缀是4
由上图也可以看出当频率为正数时才进行频率调整,否则(比如我输入0)占空比直接为0,对应蜂鸣器停止发声
上图是对“选择键KEY1”进行判断的函数,需要两个参数select和line,因为选择键在本程序的目的就是让光标顺着菜单目录下移,并在移动到最后一个条目后重新回到第一行,所以需要参数select即当前光标位置,最后返回select相当于新的光标位置,还需要参数line表示当前菜单目录的行数,这样才能判断最后一个条目是第几行,光标是否需要返回第1行
函数里还包括3行代码,1个delay,1个while再加1个delay,此为按键的软件消抖,因为当检测到低电平的时候按键按下,才进入Key_Select函数,先经过10ms来判断,如果此时按键还按下则卡死在while中,一旦按键放开,则再delay10ms后再进行接下来的操作
上图是对“确认键KEY2”进行判断的函数,有关消抖的3行原理同上,此不赘述,它主要的功能是对OLED清屏,至于接下来的工作就不在这个函数里了而是在前文的菜单类函数中
在前文关于菜单类函数的流程图那一张图提到过,对于本函数来说,Menu_1_1_对应的不是菜单类函数而是功能终端,唯一的功能就是播放《金蛇狂舞》,上图中截屏了一小部分来解释怎样实现功能
我是直接对照《金蛇狂舞》的简谱,为了方便查看,我在代码中按照简谱那样每个小节之间空一格(《金蛇狂舞》是4拍即4分音符为1拍每小节为4拍),截图中为前2小节;同时还是为了方便查看,这里每个音符对应一行,所以并不是每一句代码占一行,所以一行不仅一句代码;
这里的tone函数就是前文的发声函数已经介绍过,唯一参数是此时应该发声的频率,这里的“_D6__”和“_1__”等都是在"beep_sing.h"里定义的宏定义,我总共对中央8度和相邻的两个8度进行宏定义,如下图
如上图只展示部分宏定义,这里D就是低音,G就是高音,s就是升半音
此外插一嘴,宏定义纯数字的时候一定要添加小括号,这是良好习惯以避免可能的bug
- Oled相关
OLED我用的是软件IIC,这里不需要了解具体原理,只是需要知道当需要换不同的SCL和SDA引脚的时候应该在代码的哪里做小改动,需要改动的是oled_i2c.h文件,相关的内容请参考B站up主_WNNN的视频,BV号为BV1HC411b7EY,在对应的OLED部分可以查看
- 其余代码
其余代码要么是常规代码,要么是不重要的代码,要么就是不需要理解直接应用的代码,代码本身含有注释,这里就不赘述了
七、实物制作注意事项:
1、【元件购买】
本次元件比较简单,没有什么注意事项
2、【彩色丝印】
本次活动用的蛇年窗花图案我发现好多人在用,我这个成品是原图两边压扁的形式,因为为了契合它瘦长的形状
3、【焊接】
这次就不放焊接顺序了,总之先焊矮的再焊高的,对于排针和排母这种我一般先在正面用热熔胶固定一下避免它东倒西歪,然后再在反面将它焊上,不过这种方式有一个缺点就是用热熔胶固定之后容易以为自己已经焊接好了,直接进行下一步结果发现连到上面的模块不工作以为模块坏了结果是没有焊接,这样的错误我犯了不只一回,大家需要注意
八、过程中的问题解决:
【问题1】搞不太懂蜂鸣器相关电路
【解决】买了2个上网查资料找,下面放出我弄懂它的全过程:
工程“【RA】厨房里的独眼仔”里面有“高响度蜂鸣器”,我去看看它是个什么东西,能不能放歌
回来了,看着跟普通蜂鸣器差不多嘛~应该能用PWM的方式让蜂鸣器唱歌~
好!今天的任务就是用C8T6让蜂鸣器唱歌!在此之前,我要先找到引脚,在这方面,之前的电气小车就是用的C8T6,看看那里的PWM用的是什么脚
蜂鸣器不响,而且用电压表测量两个脚发现已经短路;看手册电阻是16Ω,用万用表量是14Ω,并不是真正的短路,只是阻值比较低;
后面查了,有源蜂鸣器接直流电就能响且频率固定,无源蜂鸣器需要接方波才响,无论是哪种,理论上都不能直接将其接到正负极,而是要有一定的外围电路,如图:
上图是Ai8051U试验箱的原理图截屏
跟蜂鸣器并联的那个二极管,我在立创商城搜的1N5819都是“肖特基二极管”,我在CSDN上搜的文章上则说是“续流二极管”
上图是从我那个蜂鸣器的手册上截取下来的,原来手册上早有玄机;
50%的占空比也是规定好的,不能随便动……
可以发现二极管变成了1N4148,这玩意在立创商城搜出来就是普通的“开关二极管”
续流二极管是一种电子元件,通常选择快速恢复二极管或者肖特基二极管来作为“续流二极管”1。它在电路中一般用来保护元件不被感应电压击穿或烧坏,以并联的方式接到产生感应电动势的元件两端,并与其形成回路,使其产生的高电动势在回路以续电流方式消耗,从而起到保护电路中的元件不被损坏的作用
上文是搜的“续流二极管”,蜂鸣器本质是感性负载,续流二极管就常应用于感性负载
常见的感性负载有继电器线圈、电磁阀,喇叭,扬声器等
我就说每次上电下电时,无源蜂鸣器会发出沙沙声,原来是“感应电动势”,续流二极管针对的就是它……
上图截取自CSDN中的一篇文章,由此观之,两个都行,正好我手头有肖特基二极管1N5819(立创商城编号为C402218);开关二极管1N4148W(立创商城编号为C7420318),想了想还是用肖特基二极管吧
二极管已经确定了,现在需要确定那个NPN三极管的选型有没有什么讲究:
“Ai8051U试验箱”上的NPN三极管是SS8050;
“我那个无源蜂鸣器手册”上的NPN三极管是??C3199(前面两个??不确定是不是2S)
在立创商城上SS8050一搜一大堆,但以C3199和2SC3199进行搜索却只能发现2SC3399和KTC3199,因此我决定选择SS8050;
我有三种型号的三极管,但是都不是SS8050
上图是正确的驱动方式
上图是错误的驱动方式,
(1)对于左图:
当输入低电平时,三极管开通,LED正常工作;
当输入高电平时,Veb=5V-3.3V=1.7V>0.7V,三极管开通,LED正常点亮
综上,三极管没法关闭
- 对于右图:
当输入低电平时,三极管关断,LED不亮;
当输入高电平时,Vbe=3.3V-0.7V=2.6V,三极管开通,然后Ve≈5V,Vbe≈3.3V-5V<0.7V,三极管关闭;之后不停的自动开关,不能正常工作
这是“硬件笔记本”上有关无源蜂鸣器的电路,看上去对三极管也没有太特殊的要求,于是我又找了一个CSDN文章:
此外,因为古来夏大佬复刻过STC那个实验箱,我去看了一眼那个SS8050对应的立创商城编号,是C2150;
看了一眼手册,数据如下
我目前手边有的三极管有以下三种
因为可以“以大代小”,所以C87294和C5277999电流是2A,比C2934671的1A保险,且C87294耐压120V且为插件,应该比贴片的好操作,小白管不了那么多了,决定就用C87294了
于是我用洞洞板(嘉立创武器A洞洞板)将电路搭了一下(很正常的电路被我搭得很抽象)
尝试让蜂鸣器响但未遂,检查了一下代码,原来PWM输出的IO引脚需要设置为“复用推挽输出”而不是“推挽输出”
然后我先让PWM点亮LED,然后用第一期训练营做的简易示波器测量了一下,结果很amazing!我的示波器终于派上用场了!
可以看到示波器界面显示占空比和输入的频率,输入的频率显示为261Hz,这个频率就是我输入给他的中央C大调音符中央do
接下来的事情就好办了,小半个上午就能让他唱金蛇狂舞了~
----------------------------------------------------分割线--------------------------------------------------------------
2024年的最后一个PCB板有验证多种功能的作用,5个板分开,
原理图和PCB如下:
先验证的当然是蜂鸣器,其中涉及蜂鸣器的部分在原理图和PCB上如下:
参见上图PCB高亮部分
但是实际焊接的时候遇到了问题
如上图,三极管的封装太近了,对我这种小白不太友好,导致我焊接后用万用表测量的时候发现集电极和发射极短路了,现在这个图已经是我将三极管取下来之后的样子,之前用洞洞板测试的时候所有孔间距都是2.54mm所以没有意识到这个问题,还好提前在验证板上发现了这个问题,之后使用的时候我要把引脚间距改大一点
为了能继续验证电路,如上图,我将三极管的E(发射极)和B(基极)的焊接位置改了;
我本来想把上次“过隧道拯救者”里那个蜂鸣器拆下来,结果发现即使我用了吸锡器也不太好拆,于是换了个方式,最后我将两个PCB和一个面包板合并成了这么个东西(其实还包括“嘉立创武器A洞洞板”):
但是我发现,蜂鸣器不响……我又重新到了洞洞板那里发现那个电路就能响,一番反思,我用的这个电路是照搬的下图:
其实这个图后面还附有计算过程,根据上图计算的结果,BUZZER的门槛电压为2.3V,我想难道是因为BUZZER端我的输出不到2.3V?我用万用表测量发现输出是1.5V左右,但我想着这是因为我输出的是占空比为50%的PWM方波,3V×50%就正好是1.5V,此外我用的这个蜂鸣器的手册中如图:
这里的电阻标注的是470,这是不是说明我的4.7k太大了?
结果倒腾半天,发现是我引脚连错了(红温了!!)
评论