温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,汇文网负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
网站客服:3074922707
基于
ESP32
S3
Mi
ython
音乐
播放
开发
李昊
2023.6电脑编程技巧与维护1概述游戏开发板是基于ESP32-S3芯片和数字电路模块搭 建 的 开 发 平 台。开 发 板 主 要 由ESP32-S3芯 片、74HC165D矩阵键盘、MAX98357、ST7735S、MPU6050和带有自定义模块的Micropython固件组成。其中,载有ESP32-S3芯片的开发板用来支撑整体的MP3播放器软件的开发和运行,并将所有的控制单元有机地结合成一个整体。设备运行时游戏开发板界面如图1所示。2背景知识随着科技的发展和进步,信息传输的效率不断提高,物联网逐渐崛起,而嵌入式软件与硬件的结合开发是未来发展的一个重要趋势。考虑到这方面的迅速发展,同时关注到当下欠缺一款多功能的物联网开发平台,于是开发者在查询了大量相关知识并进行研究、准备和研讨后,制订了相关计划,研发了这款集成式开发平台。基于目前的硬件市场,对于小型开发平台的制作需要考虑到两方面因素,一方面是成本,另一方面是性能,而能兼顾这两方面因素的令人相对满意的开发平台制作比较困难。因此,选择了低成本、高性能的微控制器进行控制。市面上有许多的游戏开发平台,但性能相对较差、框架不够成熟,因此对其展开了相关的探讨和研究。在编程语言方面,选择了相对火热、上手快的Mi-cropython语言,进行程序的设计开发。熟练掌握Mi-cropython后,开发者对其底层源码进行了深入研究,掌握了Micropython固件模块的制作方法,并制作出MP3解码播放模块,提供了多种功能方法,搭建并实现了MP3播放器的功能。3整体架构开 发 平 台 在 此MP3播 放 器 中 主 要 使 用 由 载 有ESP32-S3芯片的开发板、ST7735S显示屏、MP3模块、MAX98357、74HC165D等硬件元件。用作美化界面的图片都转换为二进制编码存储在“mp3Pic.bnbapic”文件中。音频文件全部存储在TF卡中名为“MP3”的文件夹中,相关的代码及驱动存储于开发板的闪存中。开发平台由多种模块相互配合最终形成一个整体,在此MP3播放器中,开发者将所有的MP3音频文件都存储于TF卡中,再由模块读取TF卡中的内容,实现TF卡文件的读取。读取MP3数据后首先会经过自制的Micropython模块“hzmp3”解码第1帧数据获取MP3文件的基本信息,之后逐帧解码送入的音频数据,解码后由此模块内置的I2S写出音频数据,最终由MAX98357输出相应电频信号。MP3文件数据经过多种模块和硬件工具的转化后,形成符合开发板要求的数据信息后被输出。开发者同时搭建了相对美观的图形化操作界面,提基于 ESP32-S3 和 Micropython 的音乐播放器开发李昊,杜洋,蔡依婷,刘新,吴亚峰*(华北理工大学,河北 唐山063210)摘要:介绍了基于 ESP32-S3 芯片和 Micropython 开发的一款具有图形化操作界面的 MP3 音乐播放器。此播放器借助载有 ESP32-S3 芯片的游戏开发平台,并使用带有自主研发模块的 Micropython 固件。在平台的研发中,将 ESP32-S3 芯片和 ST7735S 显示屏等多种模块相互结合于此电路板上,搭建了一台可以开发简易游戏的平台。讲解了基于上述游戏平台及固件开发的一款 MP3 音乐播放器。关键词:ESP32-S3 芯片;数字电路模块;MP3 解码;自制 Micropython;多核心作者简介:李昊(2002),学士;杜洋,学士;蔡依婷,学士;刘新,学士;吴亚峰(1978),男,通信作者,硕士,教师,研究方向为图形学及深度学习。图1游戏开发板界面158DOI:10.16184/prg.2023.06.0392023.6电脑编程技巧与维护供了切换音乐、显示TF卡文件列表、暂停、快进、循环播放、单曲循环、播放时间进度等功能。用户通过操作界面选择想要欣赏的音乐,按下相应的按键即可播放选中的音乐,操作简单便捷,符合当下主流的音乐播放器的要求。音乐开始播放后,用户可在预留的耳机接口上插入耳机收听MP3音乐。4开发板主体的制造4.1硬件选择在硬件的选择上,选择了国货之光乐鑫科技公司生产的在2.4 GHz频带支持160 MHz频宽的ESP32-S3芯片。在显示屏上,选择了支持262 K彩色图形型号为TFT-LCD的单芯片控制器ST7735S,它是一款表现力良好的TFT液晶显示屏。在音频的输出方面,选用了成本较低的支持896 kHz采样速率的MAX98357,这款音频产品支持单声道和双声道,低射频(RF)敏感度,可抑制全球移动通信系统(GSM)发射的时分多址(TD-MA)噪声,并且具有体积小巧,邮票孔设计可直插或贴装在项目印制电路板(PCB)上或面包板上的特性,非常符合集成化电路板的制作要求,在与屏幕的结合下,会对使用者产生良好的视觉与听觉效果。在内存方面,由于存储空间十分有限(共有4 MB),所以改变了设计思路。在开发中,MP3数据读取采用分批次读取原则,即每次只读取合适大小的数据进行解码播放,空间闲余时,再继续读取下一批数据。同时开发平台还配备了整合性6轴运动处理组件MPU6050,可以较为精确地读取到当前开发板的三轴加速度数值及三轴陀螺仪数值,解决了组合独立陀螺仪与加速度计时间轴偏差的问题,为体态的识别和一些动作操控类游戏的设计提供了硬件支持。4.2TF 卡音频文件的加载考虑到用户拥有大量的MP3文件资源,但是开发平台内存非常有限,因此在开发板上设计了TF卡模块,可以读取上限为32 GB的TF卡、存储上限为32 GB的资源文件,大大提高了播放器存储音乐数量的上限,使其具有一定的商业价值。为了在上述内存容量较小的开发平台实现播放大量MP3的功能,采用了分批读取、分批解码、逐步输出的设计理念。在程序运行开始时,首先,会读取TF卡根目录下MP3文件夹下所有的MP3文件名称列表,将此名称列表中的元素依次绘制在屏幕左侧。其次,会对单个文件数据的加载进行分批次处理,因首批数据为基本信息数据,则将数据分为首批数据和普通数据,先将首批数据进行解码,读取MP3的基本信息后,分批次读取普通数据,解码获取到音频数据后,逐帧送入I2S音频总线输出。因为TF卡的文件读取,和最后的音频输出分别在两个不同的核心CPU内进行,所以,从TF卡读取一批数据后,会将此批数据传入消息队列,送入另一个核心CPU等待解码播放时,可继续读取下一批数据,直至读取结束。此番操作可以减少开发平台的内存压力,实现播放任意大小的MP3音频文件。4.3客制化 Micropython考虑到Micropython语言本身的性能,在Micropy-thon固件中进行了客制化开发,增加了MP3解码器的功能,将解码的部分在Micropython固件中以C+语言实现,通过软件开发工具包(SDK)和Micropython相互串联起来,并运用FreeRTOS中对于进程的创建销毁和资源访问互斥信号量及消息队列等机制,实现了Mi-cropython自身无法实现的双核心CPU工作机制,大幅度提高了此播放器的性能。在固件的MP3模块中,提供了MP3解码器、播放MP3、获取播放时间、快进、快退和暂停等常用的MP3播放器功能的访问接口,并将I2S初始化、销毁和写入音频数据的相关操作置于固件层,节省出Micropython的算力进行画面的绘制和呈现,以及操控功能的实现等直接和用户对接的部分。对于Micropython端的开发,只需调用模块提供的访问接口,便可轻松地实现双核心的MP3数据解码和播放的功能,而Micropython端的开发者便可将注意力集中在图形化界面的操控功能设计上。为了适配自制的开发硬件,开发者对Micropython的相关硬件配置进行了研究和更改,因为Micropython是由ESP-IDF搭建而成,所以学习ESP-IDF的使用技巧后,在Micropython官方网站下载了源码进行分析研究,经过一段时间的努力后,熟悉了Micropython的代码架构和相关配置文件的编写更改。在进行一定的实践后,着手更改Micropython的底层源码,使Micropython更好地配合硬件,发挥出硬件的最大性能,同时开发了一些性能要求高的模块放置于Micropython中,例如,MP3模块。5整体程序架构由于性能问题,将一部分耗费算力较大的任务放入了带有自主研发的模块的Micropython中,所以该MP3播放器大面积调用了自主研发模块的应用程序编程接口(API)。首先看一下数据从读取到传入播放部分。if(isFirst):isFirst=FalseneedBytes=frameSizeFirst1592023.6电脑编程技巧与维护#如果没有送入成功,则继续送入当前数#据,不读取下一帧数据if(re):inputData=bytearray()#组装出目标长度的数据while(needBytes0):if needBytes512:inputData=inputData+mp3File.read(512)needBytes=needBytes-512else:inputData=inputData+mp3File.read(needBytes)needBytes=0#将读取到的数据解码并播放inputData-数据缓#冲,volume-音量大小,#sampleNum-数据帧数,frameSizeCommon-一帧#普通数据的大小if(utime.ticks_ms()-sendStartTime60):sendStartTime=utime.ticks_ms()re=hzmp3.playMp3(inputData,volume,len(inputData)/frameSizeCommon,frameSizeCommon)hzmp3模块的getTime方法会获取当前的播放时间,由Micropython调用TF卡模块读取TF卡中对应的MP3文件,首先会判定是否读取的是首批数据。MP3的文件标准中,首批数据会存储MP3的声道数、采样率、文件大小等信息,而首批数据与普通数据的长度并不相同。读取一批数据后送入模块的playMP3方法,经上述playMP3方法后,固件的hzmp3模块解码出音频数据,之后音频数据传入MAX98357通过I2S音频总线输出。5.1图形化界面绘制图形化界面是用户视觉上的直观感受,是一款合格的MP3播放器中重要的组成部分,这也是在此选取ST7735S这款画面表现力比较强的液晶显示屏的原因。因此,对界面的设计进行了细致入微的美化,使其看上去较为美观、潮流,在配色上选择了经典的红白配色,在布局上借鉴了一些古典音乐播放器的布局,并对其进行美化和改造。在界面中,左侧是文件列表,右侧是功能区域与信息显示区域。最终设计的界面在满足用户需求的前提下,达到了较为符合预期的目标。同时为了方便绘制图形,组装出美观、大方的用户界 面,开 发 者 对 屏 幕 的 驱 动 进 行 了 二 次 开 发,在ST7735S显示屏驱动中设计多种绘制模式及相关方法,其中包括绘制矩形、绘制圆角矩形、绘制圆形、绘制指定颜色的文字、绘制图片等。通过这些工具方法,设计了一个简洁、美观大方的图形化界面。在界面的左侧绘制了MP3文件名称列表,供用户选择想要播放的音乐,用户按下相应的按键可以移动选中框,选择想要播放的音乐,被选中的音乐会有特殊标识,文件名来自TF卡读取的文件;在界面的右侧,绘制了当前播放的MP3音乐的时间信息、播放进度和名称。在右侧下方,放置了上一首、下一首、暂停、切换播放模式和调整音量大小等功能按钮,供用户选择不同的操作,满足了用户对于MP3音乐播放器的基本要求。5.2操作功能设计在操控方面,借鉴了复古式MP3播放器的操控理念,通过按键来选择图形化界面中对应不同功能的按钮,按下确定键后执行对应功能。采用8位并行读取或串行输入移位寄存器74HC165D这款支持多键无冲的键盘器件用于处理用户的各种操作,8个按键的74HC165D键盘足以支撑MP3播放器中的所有功能操作。在经典的MP3音乐播放器中,合理的按键设计和位置