2023寒假一起练活动
项目介绍:
本项目参加的是利用PWM 制作一个音乐播放器,利用板上的蜂鸣器,播放一首歌曲。
蜂鸣器是电器设备中经常使用的一种声音器件,按其结构主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型,一种是电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。另一种是压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。多谐振荡器由晶体管或集成电路构成,当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,输出1.5~2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。
所需硬件:
树莓派Pico扩展板 x1,STEP Pico x1,一条Type-C 数据线,板上通过MicroUSB供电,能过够给扩展板提供3.3V的直流电压。
设计思路:
我的主要设计思路就是通过PWM波的波形周期不同,利用PWM生成不同频率,持续时间不同的音调,从而产生不同音符的效果,驱动蜂鸣器播放音乐,这里在程序中制作了一个标准的音符库,播放音乐的时候通过查找表的方式把该音符对应的频率的信号播放出来。
频率的高低决定了音调的高低, 因此要想准确控制音调, 只需要控制相应音调的频率即可。而早在我国春秋时期, 便一直使用一种名为三分损益法的方法来确定管或弦的长度和发音高低之间的关系, 此法又称十二不平均率。而十二平均率正是从这里演变而来, 它把一个音阶分为十二个相等的半音, 使各相邻两律间的频率比都是相等的。本设计正是依据此原理才能计算出每个音符的频率。当有了这些具体频率的数值之后, 我们只需要将其从基准频率中一次次分频即可得到该音符频率。
音长即音符的持续时间, 正如当我们演唱一首歌曲时, 在一些需要抒情的地方一定会将整句话或者末尾的字的持续时间拉长, 通过这种方法来渲染感情, 而这其中的字或句持续时间的拉长就是一个典型的对音长的控制。本次设计中音长的控制主要受音乐节拍的影响, 比如常见的二分音符、四分音符等等, 根据节拍数的不同完成不同的控制, 所以在实际设计中, 当我们确定了音符的节拍数之后, 便可以通过读取乐曲文件中音符的节拍来控制音长, 不同的地方在于, 拍数不同则读取的次数便不同, 如此往复即可完成对音长的控制。
框图和软件流程图:
片上资源:
- 2个按键输入
- 4个单色LED
- 12个WS2812B RGB三色灯
- 1个姿态传感器
- 1个128*64 OLED显示屏
- 1个蜂鸣器
- 1个可调电位计(用于电压表)
- 1路音频信号输入(用于示波器)
- 8位R-2R电阻网络构成的DAC(用于DDS信号发生器)
实现的功能及方式:
通过板上的蜂鸣器,播放一首音乐。
利用PWM生成不同频率,持续时间不同的音调,驱动蜂鸣器播放音乐,程序中制作一个标准的音符库,播放音乐的时候通过查找表的方式把该音符对应的频率的信号播放出来。
主要代码片段以及说明:
from buzzer_music import music
from time import sleep
from my_people_my_country import song
mymusic = music(song)
while True:
print(mymusic.tick())
sleep(0.04)
代码片段说明:
引入了一个蜂鸣器的音乐库;还有时间的库。把音乐的频谱提前定义好,命名为song,直接使用print函数就可以播放音乐,最后一行代码可以调节播放的速度。
遇到的主要难题及解决方法:
缺少和信号频率对应的音调,解决方法是设计了一个标准的音符库,把音乐的频谱提前定义好,然后只需要编码把库里的音序一一播放出来就可以了。
未来的计划或建议:
增加可供播放的曲库,在显示屏上可以浏览歌曲目录,设计一个按钮可以提供切换下一首歌曲的功能。蜂鸣器音乐播放实验成功发声并发出不同的音调,但并并没有对每个音符时间间隔给出一个通解,具有特殊性,同时程序编配上还具有最优解。实际生活中可以编配简单的歌曲,具有一定的经济意义。