当前位置:首页 > 工业控制 > 电路设计项目集锦
[导读]在发现我那台25年的Onkyo立体声音响仍然可以正常工作后,我想让它焕发新生。我之前购入的一块M5StickC Plus(ESP32 Pico)可作为网络收音机播放器使用。它内置了WiFi、LCD显示屏、几个按钮以及用于数字音频输出的I²S接口。为了获得足够高的音频质量,我决定使用一个外接的数模转换器——PCM5102A,并配备线路输出端口。

在发现我那台25年的Onkyo立体声音响仍然可以正常工作后,我想让它焕发新生。我之前购入的一块M5StickC Plus(ESP32 Pico)可作为网络收音机播放器使用。它内置了WiFi、LCD显示屏、几个按钮以及用于数字音频输出的I²S接口。为了获得足够高的音频质量,我决定使用一个外接的数模转换器——PCM5102A,并配备线路输出端口。

幸运的是,类似项目已经存在,而且有一个非常实用的库——ESP32-audioI2S,它完成了大部分工作。因此,这个项目在合理的时间内得以完成。在项目过程中,我学到了不少关于音频流媒体的知识。

是的,我对最终效果非常满意,每天都在使用!同时,我也扩展了该项目,增加了蓝牙接收模式(第二部分)和基于IFTTT的歌曲列表功能(第三部分)。

主要特点

•收听网络广播电台

•显示电台和歌曲信息

•按压按钮可切换电台

•使用I²S和DAC实现音频播放,最高支持32位

•在换台时静音及轻柔取消静音

•启动时显示设备和网络信息

开发环境

本项目使用Visual Studio Code配合PlatformIO IDE。在项目的platformio.ini文件中,包含了M5StickCPlus库和ESP32-audioI2S库的依赖。

此外,我通过build_flags选项启用调试级别日志消息,并使用monitor_filters选项启用文件日志记录和异常栈跟踪解码。

源代码

注释后的源代码可在本项目的 GitHub 仓库中获取。要构建应用程序,您还需要在 src 文件夹中创建一个名为 WifiCredentials.cpp 的文件,并添加以下内容:

概述

下图展示了M5StickC(Plus)与PCM5102 DAC板(数模转换器)之间所需的连接。需要两根电缆为DAC板提供5V电源,以及三根电缆用于三线I²S数字音频连接。此外,SCK引脚必须连接至GND,可通过在DAC板上焊接桥接完成。

有关DAC板及其焊盘的实用文档可在Stackexchange上找到。PCM5102A集成电路的详细信息请参见其数据手册。

下图简要展示了网络电台处理流程的概览。水平的泳道代表主要组件:应用程序、音频库ESP32-audioI2S,以及ESP32本身及其API(应用编程接口)ESP-IDF。

应用程序会配置GPIO引脚,建立WiFi连接,并调用音频库函数以接入网络电台并处理来自电台的音频流。此外,应用程序还会在LCD屏幕上显示流媒体元数据,并对按键操作作出响应。

音频库根据Icecast协议生成所需的HTTP请求,并处理流媒体服务器的HTTP响应。它解压缩接收到的压缩音频数据帧,将原始音频数据(PCM)提供给ESP32 API,以便通过GPIO引脚生成I2S音频输出。

ESP32 API提供了必要的底层功能,例如创建操作系统任务、网络(TCP/IP栈、WiFi)以及访问ESP32的外设,如I²S、DMA和GPIO。有关I²S驱动程序和DMA缓冲区使用的一些详细信息,请参见我的音频可视化项目。

与流媒体服务器的HTTP通信

主机会以以下HTTP响应来回应该请求,将客户端重定向至其他位置:

当客户端向该新位置发送另一个请求后,会收到包含广播流信息的响应头,随后是实际的音频数据:

根据此响应,音频流包含音频/mpeg(即mp3)数据,每秒比特率192 kB。此外,每16000字节处会插入元数据(例如艺术家和歌曲标题)。在接收到该响应头后,客户端可定期从连接中读取音频数据。下图展示了音频数据通过连接的传输情况。

数字音频数据处理

从接收到的mp3音频数据流中,esp32-audioI2S库会提取出mp3帧。每个mp3帧包含1152个音频采样点。若采样率为44.1 kHz,则对应的时间长度约为26.1毫秒(1152 ÷ 44.1 ms)。每个mp3帧以一个4字节长的MPEG音频帧头开始。该帧头的前11位为同步位,始终设置为1。该头部信息包含多个字段,例如MPEG版本、MPEG层、比特率、采样率、声道模式以及填充标志。解码头部FF FB B2 44(见下图)可获得以下信息:

•MPEG版本1

•第III层

•比特率192 kB/s

•采样率44.1 kHz

•帧中额外增加一个填充槽位

MP3帧的字节数可根据比特率、采样率和填充标志计算得出。当比特率为192 kB/s、采样率为44.1 kHz且包含填充槽位时,帧的总字节数为627字节(包括帧头),即 floor(144 * 192/44.1) + 1。下图展示了通过HTTP接收的数据包中的一些MP3帧示例。

将此类MP3帧解压缩为PCM音频数据,即原始音频样本,结果为2通道 × 每个样本2字节 × 1152个样本 = 4608字节,这些数据随后传递给I²S驱动程序。I²S驱动程序通过DMA传输将音频样本发送至I²S控制器,而I²S控制器最终在ESP32的GPIO引脚上输出一个(数字)I²S音频信号。

数模转换

连接到M5StickC GPIO引脚的I²S DAC板将数字I²S音频数据转换为模拟信号,该信号随后可经由立体声放大器传输。在我的情况下,使用的是一个稍早一些的2 x 110 W Onkyo功放。

本文编译自hackster.io

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭