基于PWM制作一个音乐播放器
项目描述:具体要求为利用板上的蜂鸣器,播放一首音乐;实现方式为利用PWM生成不同频率,持续时间不同的音调,驱动蜂鸣器播放音乐,程序中制作一个标准的音符库,播放音乐的时候通过查找表的方式把该音符对应的频率的信号播放出来。
以下介绍如何使用Pulse Width Modulation(PWM)技术来制造一个音乐播放器。首先,将介绍PWM技术的基本原理,然后介绍如何使用PWM技术来制造一个音乐播放器
1.介绍PWM技术
Pulse Width Modulation(PWM)是一种用于控制电力的技术,它可以通过改变脉冲宽度来控制电力的大小。PWM技术可以用来控制电机,灯泡,电热元件,电池充电器等电子设备的电流。PWM技术也可以用来控制音量,音调和音乐播放的速度。
2.使用PWM技术来控制音量、音调和音乐播放的速度
使用PWM技术来控制,可以通过改变脉冲宽度来控制音量的大小、音调的高低和音乐播放的速度。当脉冲宽度变大时,音量会变大、音调会变高、音乐播放的速度会变快;当脉冲宽度变小时,音量会变小、音调会变低、音乐播放的速度会变慢。
简单的硬件介绍:
1、板卡硬件:
·2个按键输入
·4个单色LED
·12个WS2812B RGB三色灯
·1个姿态传感器
·1个128*64 OLED显示屏
·1个蜂鸣器
·1个可调电位计(用于电压表)
·1路音频信号输入(用于示波器)
·8位R-2R电阻网络构成的DAC(用于DDS信号发生器)
2、树莓派Pico模块的具体指标:
·21mm×51 mm尺寸
·RP2040微控制器芯片,由英国的树莓派自己设计
·双核Arm Cortex-M0+处理器, 灵活的时钟,最高可运行到133 MHz
·264KB片上SRAM
·2MB板上的QSPI Flash
·26多功能GPIO管脚, 包括了3个模拟输入
·2 × UART, 2 × SPI控制器, 2 × I2C控制器, 16 × PWM通道
·1 × USB 1.1控制器以及PHY, 支持host和device模式
·8 × 可编程I/O (PIO)状态机用于定制化外设支持
·供电电压1.8–5.5V直流
·工作温度:-20°C到 +85°C
·邮票孔模块可以直接焊接到载板上
·使用USB的存储模式进行拖拽编程
·低功耗sleep和dormant模式
·准确的片上时钟
·温度传感器
·片上有加速的整型和浮点库
实现功能及图片展示:播放音乐并能显示音乐名称
流程图:
主要代码片段及说明:
该段代码通过调用库中的函数,实现将每个音调延时0.04s的功能,从而能将音乐完整播放出来;
该端代码(仅截取部分)编好了一个音符库,只要对照该库和音乐简谱就能写出编程中的简谱啦,以下为完整简谱代码:
song ="0 G4 2 43 0.787401556968689;2 C5 2 43 0.787401556968689;4 D#5 2 43 0.787401556968689;6 C#5 2 43 0.787401556968689;8 C5 2 43 0.787401556968689;10 C#5 2 43 0.787401556968689;12 E5 2 43 0.787401556968689;14 C#5 2 43 0.787401556968689;16 C5 2 43 0.787401556968689;18 C#5 2 43 0.787401556968689;20 D5 2 43 0.787401556968689;22 E5 1 43 0.787401556968689;23 D5 1 43 0.787401556968689;24 D5 2 43 0.787401556968689;26 C5 2 43 0.787401556968689;28 E5 4 43 0.787401556968689;32 G4 2 43 0.787401556968689;34 C5 2 43 0.787401556968689;36 D5 2 43 0.787401556968689;38 C5 2 43 0.787401556968689;40 C#5 2 43 0.787401556968689;42 D5 1 43 0.787401556968689;43 E5 1 43 0.787401556968689;44 D5 2 43 0.787401556968689;46 C#5 2 43 0.787401556968689;48 C5 3 43 0.787401556968689;51 C#5 1 43 0.787401556968689;52 D5 2 43 0.787401556968689;54 D#5 1 43 0.787401556968689;55 E5 1 43 0.787401556968689;56 D5 2 43 0.787401556968689;58 C#5 2 43 0.787401556968689;60 C5 4 43 0.787401556968689;64 G4 2 43 0.787401556968689;66 C5 2 43 0.787401556968689;68 D5 2 43 0.787401556968689;70 C5 2 43 0.787401556968689;72 C#5 2 43 0.787401556968689;74 D5 1 43 0.787401556968689;75 E5 1 43 0.787401556968689;76 D5 2 43 0.787401556968689;78 C#5 2 43 0.787401556968689;80 C5 4 43 0.787401556968689;84 C#5 2 43 0.787401556968689;86 D5 1 43 0.787401556968689;87 E5 1 43 0.787401556968689;88 D5 2 43 0.787401556968689;90 C5 2 43 0.787401556968689;92 E5 4 43 0.787401556968689;96 G4 2 43 0.787401556968689;98 C5 2 43 0.787401556968689;100 D5 2 43 0.787401556968689;102 C5 2 43 0.787401556968689;104 C#5 2 43 0.787401556968689;106 D5 1 43 0.787401556968689;107 E5 1 43 0.787401556968689;108 D5 2 43 0.787401556968689;110 C#5 2 43 0.787401556968689;112 C5 4 43 0.787401556968689;116 D5 2 43 0.787401556968689;118 D#5 1 43 0.787401556968689;119 E5 1 43 0.787401556968689;120 D5 2 43 0.787401556968689;122 C#5 2 43 0.787401556968689;124 C5 4 43 0.7874015569686899;128 D5 2 43 0.787401556968689;130 C5 2 43 0.787401556968689;132 G5 2 43 0.787401556968689;134 C#5 2 43 0.787401556968689;136 C5 2 43 0.787401556968689;138 C#5 1 43 0.787401556968689;139 G5 1 43 0.787401556968689;140 D5 2 43 0.787401556968689;142 C#5 2 43 0.787401556968689;144 C5 4 43 0.787401556968689;148 D5 2 43 0.787401556968689;150 C#5 1 43 0.787401556968689;151 C5 1 43 0.787401556968689;152 C#5 2 43 0.787401556968689;154 G5 2 43 0.787401556968689;156 E5 4 43 0.787401556968689;160 C5 2 43 0.787401556968689;162 G#5 2 43 0.787401556968689;164 G5 2 43 0.787401556968689;166 C#5 2 43 0.787401556968689;168 C5 2 43 0.787401556968689;170 C#5 1 43 0.787401556968689;171 G5 1 43 0.787401556968689;172 D5 2 43 0.787401556968689;174 C#5 2 43 0.787401556968689;176 C5 4 43 0.787401556968689;180 D5 2 43 0.787401556968689;182 C#5 1 43 0.787401556968689;183 C5 1 43 0.787401556968689;184 C#5 2 43 0.787401556968689;186 D5 2 43 0.787401556968689;188 C5 4 43 0.787401556968689;192 D5 2 43 0.787401556968689;194 C5 2 43 0.787401556968689;196 G5 2 43 0.787401556968689;198 C#5 2 43 0.787401556968689;200 C5 2 43 0.787401556968689;202 G5 1 43 0.787401556968689;203 G#5 1 43 0.787401556968689;204 D5 2 43 0.787401556968689;206 C#5 2 43 0.787401556968689;208 C5 4 43 0.787401556968689;212 D5 2 43 0.787401556968689;214 C#5 2 43 0.787401556968689;216 C5 2 43 0.787401556968689;218 G5 1 43 0.787401556968689;219 E5 1 43 0.787401556968689;220 E5 4 43 0.787401556968689;224 D5 2 43 0.787401556968689;226 C5 2 43 0.787401556968689;228 G5 2 43 0.787401556968689;230 C#5 2 43 0.787401556968689;232 C5 2 43 0.787401556968689;234 C#5 1 43 0.787401556968689;235 G5 1 43 0.787401556968689;236 D5 2 43 0.787401556968689;238 C#5 2 43 0.787401556968689;240 C5 4 43 0.787401556968689;244 D5 2 43 0.787401556968689;246 C#5 1 43 0.787401556968689;247 C5 1 43 0.787401556968689;248 C#5 2 43 0.787401556968689;250 D5 2 43 0.787401556968689;252 C5 4 43 0.787401556968689"
遇到的难题及解决方法:因为从未接触过MicroPython,所以显示汉字的过程中遇到了很多困难,代码总是报错。最后通过请教及查阅资料、反复修改终于实现。虽然项目要求中并未有显示汉字的要求,但我总感觉没有名称的音乐少了些许灵魂。音乐播放的代码是借鉴了例程和电子森林中提供的库,对照着音乐简谱写代码还是有点耗时间的,而且最后效果并没有我预期中的好,因为《勾指起誓》中平调太多,为了区分只能选择前后升降半调,变得奇怪了些。
未来的计划及建议:未来计划更多地了解嵌入式系统以及microPython的应用,希望能播放出更悦耳的音乐;通过树莓派平台学习更多,进而实现更多、更复杂的功能。