1 项目需求
- 具体要求:利用板上的蜂鸣器,播放一首音乐
- 实现方式:利用PWM生成不同频率,持续时间不同的音调,驱动蜂鸣器播放音乐,程序中制作一个标准的音符库,播放音乐的时候通过查找表的方式把该音符对应的频率的信号播放出来
2 完成的功能及达到的性能
- 将板卡连接至电脑,打开MicroPython并运行程序,板卡上的蜂鸣器根据不同的频率发出声音,通过控制每一个音的音调与持续时间来达到完整播放一首歌的效果。
3 项目介绍
3.1板卡介绍
STEP Pico专为嵌入式系统学习而设计,功能多而强大,其可以通过C/C++以及MicroPython编程来学习嵌入式系统的工作原理和应用。
板卡硬件包括:
- 2个按键输入
- 4个单色LED
- 12个WS2812B RGB三色灯
- 1个姿态传感器
- 1个128*64 OLED显示屏
- 1个蜂鸣器
- 1个可调电位计(用于电压表)
- 1路音频信号输入(用于示波器)
- 8位R-2R电阻网络构成的DAC(用于DDS信号发生器)
3.2软件介绍
采用thonny来进行代码的编译运行,该编译器简单易上手,适合我这样的新手来使用。其内置的python版本是3.10.6,支持中文,界面简洁直白,内置的功能都是完全面向新手,调试界面也非常直观,并且在电脑和pico之间传输文件很方便。
3.3代码介绍
项目一共由5个py文件组成,分别是music.py,buzzer_music.py,pwm_sound.py,board.py和song.py。首先是music.py部分,这相当于是一个主程序,运行它以后板卡就能够播放音乐。其次是board.py,这是对板卡的引脚起到配置作用。然后是pwm_sound.py,通过pwm生成不同的频率。接着是个人认为是最主要的代码,buzzer_music.py,其中包含了两个部分。第一个部分是一个音符与频率的一一对应关系,从C0对应16Hz一直到B9对应15804Hz,涵盖了一百多个音阶,实现了将音符转换成振动频率,从而可以控制板卡上的蜂鸣器发出对应的声音。第二个部分包含了一个Music类,里面定义了有关变量和函数,能够实现创建一个空的歌曲结构、用音符填充歌曲结构、查找歌曲结尾等,是一个十分方便的类库。最后就是歌曲song.py了,我用的是之前别人已经编好的《我和我的祖国》,不得不说其实最麻烦的一部就是把歌曲转换成代码了,不仅要考虑每一个音符,还要考虑延时等等。将这五个文件放置于pico的统一根目录下,然后运行music.py,就能让蜂鸣器播放出歌曲了。
3.4部分关键代码
以下是部分音符与震动频率一一对应的代码
tones = {
'C0':16,
'C#0':17,
......
'A9':14080,
'A#9':14917,
'B9':15804
}
以下是歌曲转换成音符的部分代码
song ="0 D#5 4 43 0.787401556968689;0 D#7 4 43 0.787401556968689;0 D#6 4 43 0.787401556968689;......
以下是主程序运行的代码
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)
4 原理图
4.1PWM流程图
- 时钟源输出时钟信号到分频器,分频器根据分频器参数进行分频
- 分频得到的信号作为计数器的时钟源,再进行计数
- 比较器通过比较输入值,输出对应的电平
4.2程序关系图
5 主要难点
- 如何播放自己想播放的任何一首歌曲,目前只实现了样例中的《我和我的祖国》歌曲播放,考虑到播放一首完整的歌曲需要将所有的音一一对应,对于没有乐理基础的人还是有些难度,目前能想出的解决方法是寻找能够进行在线格式转换的网站来进行操作。
- 之前没有过编程基础,也没有接触过嵌入式编程,上完15节网课后才对此有了了解。在读代码以及编写代码部分存在困难。
6 总结
虽然自己是电子信息工程专业的学生,但是对这种硬件和嵌入式并不是很了解,也非常感谢电子森林项目能够提供给我这样一个边学边做的机会。同时我也了解了STEP Pico的一些基本知识,学到了通过MicroPython来编写代码和运行程序。Pico功能强大,我所做的这个项目只是其中的一小部分,还需要更加努力地钻研。未来可以在完成这个小项目的基础上,继续研究pico的其它功能,通过led灯以及显示屏等其它硬件,完成更多有趣的项目。