基于STEP Pico的嵌入式系统学习平台完成的音乐播放器制作
本项目是使用基于STEP Pico的嵌入式系统学习平台制作音乐播放器,其原理是利用蜂鸣器和PWM生成不同频率和持续时间的音调,从而产生音乐
标签
嵌入式系统
PWM
2023寒假在家练
STEP Pico
Kanra
更新2023-03-28
北京理工大学
391

1. 项目简介

本项目是使用基于STEP Pico的嵌入式系统学习平台制作音乐播放器,其原理是利用蜂鸣器和PWM生成不同频率和持续时间的音调,从而产生音乐。项目的总流程框图如下图所示:

Fp630L8gh2VBianc5EJY47TpR9Oe

2. 项目原理介绍

STEP Pico是一款低成本,高性能的微控制器开发板,具有灵活数字接口(完全兼容Raspberry PiPico)。硬件上,采用Raspberry Pi官方自主研发的RP2040微控制器芯片,搭载了ARM Cortex M0+双核处理器,运行频率可高达133MHz,内置了264KB SRAM和2MB闪存,还板载有多达26个多功能的GPIO引脚。软件上,可选择树莓派提供的C/C++SDK,或者使用MicroPython进行开发,且配套有完善的开发资料教程,可方便快速入门开发并嵌入到产品中。MicroPython 是Python3语言的精简实现,包括Python标准库的一小部分,经过优化可在微控制器和受限环境中运行。

PWM的全称是脉冲宽度调制(Pulse Width Modulation),脉冲宽度调制是一种模拟控制方式,其根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。

蜂鸣器(Buzzer)是一种直流供电的一体化电子讯响器,按照是否带有信号源分为有源蜂鸣器和无源蜂鸣器两种类型,其中有源蜂鸣器只需要在其供电端加上额定直流电压,其内部的震荡器就可以产生固定频率的信号,驱动蜂鸣器发出声音;而无源蜂鸣器­需要在其供电端上加上高低不断变化的电信号才可以驱动发出声音,频率的变化可以使音调产生变化,因此可以发出不同音调的声音,也构成了本项目的基本硬件原理。

3. 项目设计流程

本项目实现的功能是音乐播放,首先要做的是调用库函数和端口,本项目用到的库函数是time库中的sleep,time库是Python中内置的基础时间库,sleep是睡眠时间,可以使程序休眠特定的时间长度,在此处可以用来调节音符的持续时间长度;machine库包含了和特定硬件相关的各种函数,它可以不受限制地直接访问系统的硬件功能(如CPU、定时器、总线等),在该库中需要调用的是PWM和Pin(端口)。代码如下:

from time import sleep 
from machine import PWM, Pin 

然后需要录入音调,这里需要音程为两个八度的全部音(包括全音和半音),升调使用“#”表示,空用“-”表示,定义其频率为0;完成后就可以录入需要播放的音乐片段,此处使用了游戏《愤怒的小鸟》主题曲部分片段。代码如下:

tones = {"C4":262, "C#4":277, "D4":294, "D#4":311, "E4":330, "F4":349, "F#4":370, "G4":392, "G#4":415, "A4":440, "A#4":466, "B4":494, 
         "C5":523, "C#5":554, "D5":587, "D#5":622, "E5":659, "F5":698, "F#5":740, "G5":784, "G#5":831, "A5":880, "A#5":932, "B5":988,
         "-": 0} #定义音调频率

angrybirds = ["E4","F#4","G4","-","E4","-","-","-","G4","A4","B4","-","E4","-","-","-","B4","C#5","D5","C#5","D5","C#5","D5","E5","D5","C#5",
             "B4","-","A#4","-","B4","-","E4","F#4","G4","-","E4","-","-","-","G4","A4","B4","-","E4","-","-","-","B4","C#5","D5","C#5","D5",
             "C#5","D5","E5","D5","C#5","B4","-","G4","-","E4","-","B4","C#5","D5","-","D5","-","D5","-","D5","-","D5","E5","D5","C#5","D5",
             "-","-","-","D5","-","D5","-","D5","-","D5","C#5","B4","-","E4","-","E4","-","B4","C#5","D5","-","D5","-","D5","-","D5","-","D5",
             "E5","D5","C#5","D5","-","D5","C#5","D5","-","D5","-","C#5","-","C#5","A4","E4","-","B4","-","B4"] #定义旋律

接下来设置19号端口(即蜂鸣器控制端口)为PWM的输入/输出端口,通过脉冲宽度控制蜂鸣器发声。代码如下:

buzzer = PWM(Pin(19))

以下是代码的主体部分,使用了for循环语句,对于录入旋律片段的所有音,将其与录入音调频率一一对应,对每个频率判断其是否为0,若为0,则设置占空比为0,蜂鸣器不发声;若不为0,则设置占空比为50%,并播放该频率的声音。两种情况都需要设置每个音的持续时间为同样数值,调节数值大小可以影响音乐的播放速度快慢。设置占空比时用到的函数是PWM中的duty_u16,其数值应设置在0和65536之间,对应0到100%,设置持续时间用到的函数是time中的sleep。代码如下:

or tone in angrybirds:
    frequency = tones[tone] #歌曲中每个音的对应频率
    if frequency == 0:
        buzzer.duty_u16(0) #设置占空比为0,即不发声
        sleep(0.13) #设置每个音的持续时间
    else:
        buzzer.duty_u16(int(32768)) #设置占空比为50%
        buzzer.freq(frequency)
        sleep(0.13)

 

以上代码就是全部功能实现部分,最后使用PWM中的deinit函数进行程序反初始化,停止PWM输出即可。

4. 项目主要难点及攻克方法

在选择需要播放的音乐时,选择无升降调的音乐需要定义的音调频率相对较少,但为了使本项目能完成播放的音乐范围更广,笔者还是选择了完成包括全音和半音的完整音程的频率定义,并且用完整的名称字符串而不是键盘上的某一字符代表每个音,以方便编写音乐旋律片段的代码。另外,在使蜂鸣器不发出声音时如果直接令频率为0,则系统会报错,因此最终采用的方法是使占空比为0,占空比表示导通时间占总时间的比例,因此占空比为0时蜂鸣器不发声。

5. 项目未来展望

本项目中可播放音乐片段有一定局限性,每个音的持续时间无法单独调节,若要调节则需要另外的算法完成,每段音乐都需要单独录入字符集合同样也是本项目的缺陷之一。由于蜂鸣器本身的发声方式,播放出的音乐较为单一,通过外接喇叭或能改进本项目,使播放MIDI音乐成为可能。

附件下载
angrybirds.py
团队介绍
北京理工大学本科生个人项目
团队成员
Kanra
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号