前言
上篇我们搞定了最劝退的 ESP-IDF 环境搭建(MacOS 下子模块卡死、Python 版本打架那一套)。本篇接着往下走------把硬件真正接起来。
说实话,环境是"软"的,卡住能查日志;硬件是"硬"的,接错一根线,板子不响、mic 不识,你连报错都看不全。我这一周里,喇叭要带端子、得补杜邦线和焊锡、3.3V 引脚接反、麦克风 GPIO 对调......每个坑都实实在在踩了一遍。
本系列设计每篇聚焦一个难点,贴关键命令、与大家探讨一下原理、附实测结果,确保真实可复现验证。本文聚焦最容易被忽略但也最容易翻车的:ESP32-S3 接喇叭 + 麦克风时的供电与引脚接线。
提醒一句:如果你只是想先调通代码逻辑,完全可以用 Mac 的麦克风/喇叭模拟(后面会讲),但要做成"能给孩子讲睡前故事的实体盒子",这一步迟早要过。
一、先备齐硬件与辅料
环境好了,得先把手上的东西和"还缺的东西"理清楚。我一开始只有一块 ESP32-S3 开发板,其他都是后面补齐的。
| 物品 | 是否必备 | 我的说明 |
|---|---|---|
| ESP32-S3 开发板(带 PSRAM) | 必备 | 型号如 N16R8,PSRAM 跑唤醒词模型要用 |
| 喇叭(带端子) | 必备 | 一定要买带端子的,不然裸线根本接不上板子 |
| 麦克风模块(I2S 数字麦) | 必备 | 数字麦走 I2S,比模拟麦稳 |
| 杜邦线(公对公/公对母) | 必备 | 接喇叭端子、麦克风到板子全靠它 |
| 焊锡 + 电烙铁 | 推荐 | 端子如果松,焊一下更稳,免得接触不良 |
| USB 数据线 | 必备 | 供电 + 烧录 + 串口日志三合一 |
二、供电:别小看 3.3V 这档电
最开始我完全没有单独的供电方案,板上所有东西完全靠 USB 供电(插在 Mac 上烧录顺便供电)。这能跑,但要注意:
- ESP32-S3 的 I/O 电平是 3.3V,外接麦克风、喇叭模块必须吃 3.3V,不能直接上 5V,否则可能烧模块。
- 板子上 3.3V 引脚(标
3V3)不止一个,挑一个稳定的接就行。
同一个功能的 3.3V 引脚板子上可能有多处,某一路如果供电能力或接触不好,换一路 3V3 就通了。如果你也遇到"线都对、就是不识设备",优先怀疑 3.3V 那根线接的是不是稳、是不是接对了引脚。
三、麦克风与喇叭的 I2S 引脚接线
这是重点。ESP32-S3 用 I2S 总线 传音频:麦克风是输入(I2S 从机发数据给芯片),喇叭是输出(芯片发数据给功放)。小智固件通过 board_config.h 里的宏定义来认这些引脚。
官方默认引脚( Simplex 单工模式)
小智常见开发板的默认配置长这样(这是大多数教程给的):
c
#define AUDIO_I2S_METHOD_SIMPLEX
#ifdef AUDIO_I2S_METHOD_SIMPLEX
#define AUDIO_I2S_MIC_GPIO_WS GPIO_NUM_4
#define AUDIO_I2S_MIC_GPIO_SCK GPIO_NUM_5
#define AUDIO_I2S_MIC_GPIO_DIN GPIO_NUM_6
#define AUDIO_I2S_SPK_GPIO_DOUT GPIO_NUM_7
#define AUDIO_I2S_SPK_GPIO_BCLK GPIO_NUM_15
#define AUDIO_I2S_SPK_GPIO_LRCK GPIO_NUM_16
#endif
含义对照:
| 信号 | 引脚 | 接哪儿 |
|---|---|---|
| MIC WS(帧时钟) | GPIO 4 | 麦克风 WS |
| MIC SCK(位时钟) | GPIO 5 | 麦克风 SCK/BCLK |
| MIC DIN(数据入) | GPIO 6 | 麦克风 DOUT |
| SPK DOUT(数据出) | GPIO 7 | 喇叭 DIN |
| SPK BCLK | GPIO 15 | 喇叭 BCLK |
| SPK LRCK | GPIO 16 | 喇叭 LRCK/WS |
四、最终可用的 board_config.h(实测可复现)
:
c
#ifndef _BOARD_CONFIG_H_
#define _BOARD_CONFIG_H_
#include <driver/gpio.h>
#define AUDIO_INPUT_SAMPLE_RATE 16000
#define AUDIO_OUTPUT_SAMPLE_RATE 24000
// 如果使用 Duplex I2S 模式,请注释下面一行
#define AUDIO_I2S_METHOD_SIMPLEX
#ifdef AUDIO_I2S_METHOD_SIMPLEX
#define AUDIO_I2S_MIC_GPIO_SCK GPIO_NUM_4
#define AUDIO_I2S_MIC_GPIO_WS GPIO_NUM_5
#define AUDIO_I2S_MIC_GPIO_DIN GPIO_NUM_6
#define AUDIO_I2S_SPK_GPIO_DOUT GPIO_NUM_7
#define AUDIO_I2S_SPK_GPIO_BCLK GPIO_NUM_15
#define AUDIO_I2S_SPK_GPIO_LRCK GPIO_NUM_16
#else
#define AUDIO_I2S_GPIO_WS GPIO_NUM_4
#define AUDIO_I2S_GPIO_BCLK GPIO_NUM_5
#define AUDIO_I2S_GPIO_DIN GPIO_NUM_6
#define AUDIO_I2S_GPIO_DOUT GPIO_NUM_7
#endif
#define BUILTIN_LED_GPIO GPIO_NUM_48
#define BOOT_BUTTON_GPIO GPIO_NUM_0
#define TOUCH_BUTTON_GPIO GPIO_NUM_47
#define VOLUME_UP_BUTTON_GPIO GPIO_NUM_40
#define VOLUME_DOWN_BUTTON_GPIO GPIO_NUM_39
#define DISPLAY_SDA_PIN GPIO_NUM_41
#define DISPLAY_SCL_PIN GPIO_NUM_42
#define DISPLAY_WIDTH 128
#if CONFIG_OLED_SSD1306_128X32
#define DISPLAY_HEIGHT 32
#elif CONFIG_OLED_SSD1306_128X64
#define DISPLAY_HEIGHT 64
#elif CONFIG_OLED_SH1106_128X64
#define DISPLAY_HEIGHT 64
#define SH1106
#else
#define DISPLAY_HEIGHT 64
#endif
#define DISPLAY_MIRROR_X true
#define DISPLAY_MIRROR_Y true
// A MCP Test: Control a lamp
#define LAMP_GPIO GPIO_NUM_18
#endif // _BOARD_CONFIG_H_
五、硬件配置清单(实测可复现)
| 项目 | 说明 |
|---|---|
| 主控 | ESP32-S3(带 PSRAM,如 N16R8) |
| 供电 | USB / 充电宝 / 手机充电器(5V 进,板载 LDO 转 3.3V) |
| 麦克风 | I2S 数字麦,3.3V 取电(绿色线 = 3v3-vdd) |
| 喇叭 | 带端子喇叭,经杜邦线接 GPIO 7/15/16 |
| MIC I2S | WS=4, SCK=8, DIN=6 |
| SPK I2S | DOUT=7, BCLK=15, LRCK=16 |
| 辅料 | 杜邦线、焊锡(端子松时加固) |
六、下一步与系列预告
硬件接好了,喇叭会响、麦克风会被识别,但故事还没完 ------小智固件有 OTA 自动升级机制,升级时会把你改好的 board_config.h 覆盖回官方默认!我当时就因为这个,辛辛苦苦改对的引脚一升级又白调。
我们现在得阻止它自动升级,并把我们自己改好引脚的代码烧进去。"
下一篇我就写这个最阴间的坑:怎么锁死 OTA、把自定义引脚固化进固件、以及烧录小智的完整流程。
如果你也在折腾 ESP32 音频硬件,欢迎在评论区留下你的接线图或踩坑经历。动手是最好的学习方式,我们一起填坑。
下一篇:《系列之三:烧录小智固件,并锁死 OTA 防止自定义引脚被覆盖》
