Arduino + ESP32 + MAX98357A == I2S

博客讲述了作者使用ESP32通过I2S从SD卡播放MP3文件遇到的问题及解决过程。在尝试多种在线音源失败后,最终通过本地Python HTTP服务器实现了播放。此外,还介绍了如何通过串口输入新网址实现音源切换,无需重新编译上传。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GitHub - schreibfaul1/ESP32-audioI2S: Play mp3 files from SD via I2SPlay mp3 files from SD via I2S. Contribute to schreibfaul1/ESP32-audioI2S development by creating an account on GitHub.https://github.com/schreibfaul1/ESP32-audioI2S或许手气不好,在线装的几个库没成功。下载这个zip, 导入库,例程编译上传没问题,但是还是无法播放。用浏览器测试例程里的在线广播网址是可以听的,估计是网站加强了浏览器识别。于是本地用 python 跑一个http server ,打通任督二脉(关闭防火墙),终于 MAX98357A 的喇叭愉快地响了起来。

1. 如果用在线音源,SD卡可以不接,即例程里只需要连接3条线,加上电源共5条。

2. 串口输入新的网址可以切换,不用重新编译上传。

### 使用 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 协议传送的数据格式后传递出去供外部功放解码发声。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值