一起玩儿物联网人工智能小车(ESP32)——68 使用MAX98357A模块播放声音

摘要:本文介绍如何使用MAX98357A模块播放声音

本文将介绍MAX98357A模块的使用方法,这是一个采用标准的I2S作为数字音频输入,内置解码器,可将数字音频信号解码为模拟信号,并拥有内置放大器,可以直接驱动扬声器的D类放大器。因其工作效率高,可以以2.7V~5.5V的直流电压运行,因此非常适合便携式及电池供电的音频播放项目。

所谓的D类放大器,是指通过控制开关单元的ON/OFF,直接驱动扬声器的放大器。D类放大器是音频功率放大器的一种。音频功率放大器是最常使用的一种功率放大器,除此之外,还有用于射频信号传输的射频功率放大器和用来驱动电机和执行器的直流功率放大器。为了区分不同音频放大器的电路特性和行为,采用字母符号来进行标识。因此,音频功率放大器可以分为A、B、AB、C、D等,多种类型。

MAX98357A模块具有诸多的优点,其特点如下:

  1. 输出功率:4欧时为3.2W,THD为10% 8欧时为1.8W,THD为10%
  2. I2S采样率:8KHz-96kHz
  3. D类放大器增益可选:3dB/6dB/9dB/12dB/15dB
  4. 无需主控时钟(MCLK)
  5. 即插即用:只需单电源供电,即可自动配置35种不同的时钟和128种数字音频格式。
  6. 适用于蓝莓派、Arduino以及ESP32等具有I2S音频输出的微控制器或开发板系统

将ESP32与MAX98357A这两者结合起来,可以实现很多有用的功能,下面是一些简单的举例:

  1. 智能音箱:ESP32具有Wifi联网的功能,因此可以作为控制中心,保持设备时刻都可以接入互联网。配合语音助手服务,利用MAX98357A的音频输出能力,就可以很轻易的实现智能音箱的功能。
  2. 蓝牙音箱:ESP32芯片具有蓝牙功能,因此可以方便的利用蓝牙获取音频数据,并使用MAX98357A模块播放出来,这就是一个最简单的蓝牙音箱。
  3. 语音提醒:ESP32芯片可以采集各种传感器的数据,然后根据不同的情况,使用MAX98357A来播放不同的声音提醒。

MAX98357A模块如下图所示:

MAX98357A模块的引脚说明如下:

MAX98357A模块引脚

引脚说明

VIN

电源正(2.5V-5.5V)

GND

电源地

SD

关机和频道选择。SD MODE拉低以将器件处于关断状态。

GAIN

增益和频道选择。在TDM模式,增益固定为12dB

DIN

数字信号输入

BCLK

位时钟输入

### 使用 ESP32-S3 驱动 MAX98357A I2S 音频放大器 #### 硬件连接说明 为了使 ESP32-S3 正确驱动 MAX98357A I2S 音频放大器,硬件连接至关重要。具体来说: - **I2S 数据线 (SD)** 应连接到 ESP32-S3 的 GPIO 22 或其他指定用于 I2S 数据传输的引脚。 - **I2S 左/右时钟 (LRCLK)** 接至 GPIO 21。 - **位时钟 (BCLK)** 连接到 GPIO 23。 - **电源管理**:确保 MAX98357A 和 ESP32-S3 均有稳定供电,并注意接地共通。 这些配置使得两个设备间能够建立可靠的通信链路[^1]。 #### Arduino IDE 中设置 I2S 参数 在编写代码前,需先确认已安装适用于 ESP32 平台的支持包以及必要的库文件。接着,在Arduino IDE环境中初始化I2S接口参数如下所示: ```cpp #include "driver/i2s.h" #define I2S_NUM I2S_NUM_0 // 定义使用的I2S编号 #define BCK_PIN 23 // 比特时钟(BCLK)引脚定义 #define WS_PIN 21 // 字选择(LRCLK)引脚定义 #define DATA_OUT 22 // 数据输出(SDOUT)引脚定义 #define SAMPLE_RATE 22050 // 设置采样率 void setup() { i2s_config_t i2s_config = { .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX), .sample_rate = SAMPLE_RATE, .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, .communication_format = I2S_COMM_FORMAT_I2S_MSB, .intr_alloc_flags = 0, .dma_buf_count = 8, .dma_buf_len = 64, .use_apll = false, .tx_desc_auto_clear = true, .fixed_mclk = 0 }; i2s_pin_config_t pin_config = { .bck_io_num = BCK_PIN, .ws_io_num = WS_PIN, .data_out_num = DATA_OUT, .data_in_num = I2S_PIN_NO_CHANGE }; i2s_driver_install(I2S_NUM, &i2s_config, 0, NULL); i2s_set_pin(I2S_NUM, &pin_config); } ``` 此部分代码完成了对 I2S 总线的基本设定工作,包括但不限于模式选择、样本速率调整等操作[^2]。 #### 发送音频流给 MAX98357A 一旦成功建立了上述提到的基础架构之后,则可以通过调用 `i2s_write` 函数来发送 PCM 编码的声音数据帧给 MAX98357A 处理并最终由扬声器发出声音信号。下面是一个简单的例子展示如何读取存储于 Flash 内存中的 WAV 文件片段并通过 I2S 输出播放出来: ```cpp // 加载WAV头结构体 typedef struct wav_header{ uint8_t riff[4]; /* RIFF Header Magic header */ uint32_t chunkSize; /* Riff Chunk Size */ uint8_t wave[4]; /* WAVE Header */ uint8_t fmt[4]; /* FMT header */ uint32_t subchunk1; /* Sub-chunk size of above format data */ uint16_t audioFormat; uint16_t numChannels; uint32_t sampleRate; uint32_t byteRate; uint16_t blockAlign; uint16_t bitsPerSample; }wav_header; File file; uint8_t* buffer; size_t bytes_read; void loop(){ if (!file){ Serial.println("Opening file..."); file = SPIFFS.open("/audio.wav", FILE_READ); if(!file){ Serial.println("Failed to open file"); return; } // 跳过WAV头部信息 wav_header whdr; file.read((uint8_t*)&whdr,sizeof(wav_header)); } while(file.available()){ int ret=i2s_write(I2S_NUM,file.readBytes(buffer,bytes_read),&bytes_read,portMAX_DELAY); if(ret!=ESP_OK || bytes_read==0){break;} } delay(1000); } void stopPlayback(){ if(file){ file.close(); file=nullptr; } } ``` 这段代码实现了从内部闪存加载预录好的 WAV 格式的音乐文件,并将其转换成适合通过 I2S 协议传送的数据格式后传递出去供外部功放解码发声。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一起玩儿科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值