APP下载

基于ESP32的音乐播放系统设计

2023-08-26胡华玉李嘉明

电脑知识与技术 2023年21期

胡华玉 李嘉明

关键词:音乐播放;ESP32;无源蜂鸣器;OLED;云端下载

中图分类号:TP37 文献标识码:A

文章编号:1009-3044(2023)21-0103-03

0 引言

音乐在人们的生活中扮演着重要的角色,听音乐有助于提高创造力、舒缓压力等,音乐播放器广泛应用于人们日常的生产生活中[1]。在音乐播放器的设计上,很多音乐芯片模块价格比较昂贵,对于只需播放纯音乐的应用场合,可通过单片机搭配无源蜂鸣器实现播放音乐的功能,单片机引脚输出PWM(PulseWidth Modulation) 波,用于控制蜂鸣器发声[2]。PWM 又叫脉冲宽度调制,是通过对一系列脉冲的宽度进行调制,等效出所需要的波形,对模拟信号电平进行数字编码。然而,基于单片机PWM模式的音乐播放系统[3-4]大多都没有接入互联网,只能播放本地音乐,受制于单片机较小的存储空间,可播放的音乐数量并不多,新音乐往往需要通过重新编程写入的方式实现,灵活性较差。

针对上述问题,结合嵌入式技术、信息通信技术、云计算技术,设计一款基于ESP32的音乐播放系统。该系统通过更改ESP32芯片上的通用I/O引脚输出的PWM信号频率,驱动无源蜂鸣器发出不同音调的响声。系统上电启动时会尝试连接代码中所设置Wi-Fi 信号,若Wi-Fi 连接失败,则只能播放本地音乐,若Wi-Fi连接成功,则可以通过相关按键的设置,下载存储在云端的音乐乐谱,音乐的播放、暂停、上一首、下一首、单曲循环等常见功能同样是通过相关按键的设置实现。此外,连接ESP32的OLED显示屏会实时显示当前正在播放的歌曲名称、Wi-Fi连接的状态,或是设置模式下的选项菜单。

1 基本工作原理

采用无源蜂鸣器播放的音乐是通过实时调节音调和节拍,使其发出特定的声音,而音色是没有区别的。音调反映的是声音的高低程度,频率越大音调越高,二者具体的对应关系见表1[5]。节拍则表示的是一个音符唱的时间,即无源蜂鸣器发出对应音调的持续时间,ESP32可通过Micropython固件库中封装的延迟函数来控制这种音调对应的频率维持多久,从而实现节拍的控制。在运行程序之前,需要将待播放的音乐转换成数据类型为列表的数据存放到ESP32的软件程序中,然后便可根据列表中给定的频率值和播放时长,依次逐个播放音符。在运行程序的过程中,音乐暂停功能是通过ESP32 引脚停止输出PWM 波实现的,此时会有相关的变量记录目前播放到哪首歌曲的哪个音符,继续播放音乐将会从刚刚暂停处,ESP32 重新输出相应的PWM波接着往下播放,播放上一首或下一首是通過改变列表中的索引实现不同音乐间的切换。

2 系统硬件设计

2.1 ESP32芯片

ESP32芯片是乐鑫信息科技(上海)股份有限公司推出的一款集成Wi-Fi功能的微控制器,拥有40nm 工艺、双核32 位MCU、2.4GHz 双模Wi-Fi 和蓝牙芯片、主频高达240 MHz,其引脚电路图如图1 所示。ESP32性能稳定,工作温度范围达到-40℃ ~ +125℃,内部集成了自校准电路,能够动态调整电压,并且适应外部条件的变化。本系统选用ESP32作为系统的主控芯片和通信芯片。ESP32芯片具有下列特点:

1) 两个或一个可以单独控制的 CPU 内核,时钟频率可调,范围从 80 MHz 到 240 MHz。

2) +19.5 dBm 天线端输出功率,确保良好的覆盖范围。

3) 传统蓝牙支持 L2CAP、SDP、GAP、SMP、AVDTP、AVCTP、A2DP (SNK) 和 AVRCP (CT) 协议。

4) 低功耗蓝牙 (Bluetooth LE) 支持 L2CAP、GAP、GATT、SMP和 GATT 之上的 BluFi,SPP-like 协议等。

5) 睡眠电流小于 5 μA,适用于电池供电的可穿戴电子设备。

6) Wi-Fi协议:支持802.11 b/g/n等协议,速度高达150Mbps。

7) 丰富的外设接口:GPIO、ADC、 SPI、UART、I2S、I2C等。

2.2 OLED显示屏

OLED(Organic Light-Emitting Diode) 有机发光二极管又称为有机激光显示,不同于LCD,OLED具有自发光的特性,所以不需要添加背光源,当有电流通过时,屏幕上的有机材料便会发光,具有体积小、功耗低等优势。本系统选用的OLED显示屏是仅支持I2C接口,供电电压为直流3.3V,尺寸为0.96寸,分辨率为128×64,即水平方向上128个像素点,竖直方向上64 个像素点。OLED显示屏的第1和第2引脚分别连接ESP32 开发板的3.3V 和GND,第3 和第4 个引脚与ESP32芯片的I2C接口连接,接收并显示ESP32发送的信息,其电路原理图如图2所示。

2.3 按键模块

按键模块用于人机交互,用户可通过按键实现音乐播放系统功能的设置,按键电路图如图3所示,触电一端接地,另一端连接ESP32 的通用输入输出口。ESP32与按键相连的几个I/O口都设置为输入引脚,并开启内部的上拉电阻,当按键未按下时,ESP32检测到这几个I/O口的电平为高电平,当按键按下时,按键的两个触电导通,相应的I/O口接地,检测到的电平由高电平转换成低电平,触发特定的信号,执行相对应的程序。图3中的按键S1较为特殊,所连接的不是通用I/O口,而是重启引脚,当S1按下时,整个系统将会软重启,重新运行程序。

2.4 蜂鸣器模块

蜂鸣器分为源蜂鸣器和无源蜂鸣器。有源蜂鸣器自带振荡源,接通电压时鸣响,振荡频率固定,通常作为报警器使用。无源蜂鸣器无内部振荡源,需要添加振荡信号,频率可以改变,因而可以发出不同音调的响声。本系统采用无源蜂鸣器,电路原理图如图4 所示,ESP32输出PWM波的引脚连接限流电阻R5后接入三极管Q1的基极,改变PWM的频率,即能改变无源蜂鸣器发出的响声。

3 系统软件设计

3.1 OLED软件设计

导入OLED显示屏专用的模块ssd1306.py,通过ssd1306.py中提供的库函数,可以方便地显示数字、英文字符、点、直线、矩形等。如果需要显示中文字符,则需要添加中文显示的库函数,以及待显示中文字符对应的点阵数据。

首先,利用PCtoLCD2002字模提取软件将OLED 显示的图形转换为点阵数据。PCtoLCD2002的字符模式界面如图5所示,将字宽和字高均设置为16,则每个中文字符占据的宽度为16像素,高度也为16像素。设置好分隔符、换行符、字体等信息之后,在图5 的文本框中输入需要转换的文字,接着,点击“生成字模”图标按钮,生成中文字体对应的字节点阵数据。

添加的中文库函数如图6所示。该函数封装在类里面,所以第一个参数为self,参数ch_str传入待显示的中文字符串,参数x_axis、y_axis分别是水平方向、竖直方向上的偏移,用于确定待显示的字符在OLED屏上显示的位置,参数fonts是数据类型是字典,包含待显示中文字符的utf-8编码与其字节点阵数据的对应关系。

3.2 系统主程序设计

系统主程序的程序流程图如图7所示。系统上电运行后,ESP32导入相关的模块并进行初始化操作,随后根据程序中预设的账号和密码连接Wi-Fi网络。若Wi-Fi连接成功,则程序中点亮ESP32核心板上的LED指示灯,OLED屏显示“Network OK”;若Wi-Fi连接失败,则在10秒内尝试重新连接,时间的间隔通过Micropython集成的utime模块中的time函数实现,time 函数会返回一个秒级的计数值,即每经过1秒,time() 函数返回的值增大1,刚开始连接Wi-Fi时调用time 函数,得到计时的初始值,将其存放到自定义变量start_time中,在进行重连的过程中,utime.time()减去start_time 的值即是连接Wi-Fi 经过的时间,单位是秒,10秒后如果还是连接不成功,则OLED屏上显示连接超时的提示信息“Network timeout”。无论Wi-Fi 是否连接成功,并开启外部中断,始终监听按键S2是否有被按下,若被按下,则转去执行对应的回调函数,回调函数执行完后再返回主程序继续运行。ESP32 会载入本地音乐的数据,Micropython固件库中的ma?chine模块内含有PWM模块,使用PWM模块创建pwm 对象,调用pwm 对象封装好的freq 函数可调整输出PWM的频率值,对应的持续时间采用time模块的延时函数sleep()实现,具体的频率值和延时的时长从本地音乐数据中有序提取。当音乐播放完结束之后,会更改一个全局变量的值,自动播放下一首,直至遍历完所有的本地音乐数据。

3.3 外部中断程序设计

从开启外部中断的那句代码开始,程序运行过程中会响应按键S2按下的信号,当S2按下时,会自动调用设定的回调函数。进入回调后,OLED屏清空之前显示的内容,显示相关的功能菜单,如下一首、开始播放、暂停播放、云端下载等,通过按键S3可以在功能菜單上不同功能间进行切换,按键S4按下则会去执行对应的功能,并退出设置模式,结束回调函数并回到主程序。云端下载的功能是在Wi-Fi连接成功,并且成功接入互联网的前提下才能生效,使用云端下载时,ESP32使用urequests模块的get方法获取云服务中存放的音乐,得到返回结果后调用相关的数据类型转换的函数,从返回的json格式数据中提取出音乐的id、音乐播放的频率值、音乐的名称、音乐的中文字符对应的点阵数据等,并将其替换本地音乐数据。

4 结束语

本文设计的基于ESP32的音乐播放系统,通过输出变化的PWM波,驱动无源蜂鸣器播放音乐,OLED 屏幕实时显示播放的音乐名称或者设置功能的菜单内容,支持从云服务器上下载音乐,具有成本低、功耗低、灵活易用的特点。