💡 划重点
- 基于 ESP32 双 I2S 通道,实现“录音—存储—复读”闭环。
- INMP441 采集孩子语音,MAX98357A 驱动扬声器播放,SD 卡保存音频文件。
- 拼图完成触发录音,机器人用原声或变声复读,增强互动与鼓励。
- 整机成本控制在 85 元内,适合家庭与幼儿园小规模落地。
需求洞察
目标用户是 3-8 岁儿童及其家长。真实痛点:传统拼图玩法静态,孩子拼完后缺少即时反馈;家长陪伴时间有限,难以持续回应孩子的自言自语;普通早教机内容固定,无法录入孩子自己的声音。儿童拼图机器人语音复读让拼图变成“会说话的伙伴”:孩子每拼好一块或完成一幅拼图,按下按钮,机器人录下孩子说的话,再播放出来,形成“我说—它学—它说”的循环。这种即时语音反馈能提升成就感,锻炼语言表达,也适合亲子共同改装。技术上,ESP32 的 I2S 双通道可同时处理麦克风输入和功放输出,SD 卡提供低成本存储,整体方案成熟且可扩展。
方案设计
- 感知层:INMP441 数字麦克风通过 I2S 采集语音;拼图触点或按键作为完成触发;可选光照传感器判断拼图是否放入。
- 控制层:ESP32 双核分工,核心 0 处理 I2S 录音与 SD 写卡,核心 1 处理播放逻辑与状态机;支持原声复读和简单变声(升调/降调)。
- 执行层:MAX98357A 功放驱动 8Ω 2W 扬声器;LED 指示录音/播放状态;按键用于启动录音和回放。
- 日志/联网层:SD 卡记录操作日志和音频文件;预留 WiFi 上传接口,可将孩子语音片段同步到手机(成本内暂不增加模块,仅软件预留)。
物料清单
| 物料 | 数量 | 用途 | 估算单价 | 合计 |
|---|---|---|---|---|
| ESP32 开发板 | 1 | 主控,双 I2S 与 WiFi | 15 元 | 15 元 |
| MAX98357A | 1 | I2S 功放,驱动扬声器 | 8 元 | 8 元 |
| INMP441 | 1 | I2S 数字麦克风 | 10 元 | 10 元 |
| SD 卡模块 | 1 | SPI 接口,读写音频 | 5 元 | 5 元 |
| MicroSD 卡 8GB | 1 | 存储录音文件 | 10 元 | 10 元 |
| 8Ω 2W 小喇叭 | 1 | 语音播放 | 5 元 | 5 元 |
| 轻触按键 | 2 | 录音/播放触发 | 1 元 | 1 元 |
| LED 与电阻 | 2 | 状态指示 | 1 元 | 1 元 |
| 锂电池与充电板 | 1 | 供电 5V/3.3V | 15 元 | 15 元 |
| 杜邦线/洞洞板 | 1 | 连接与固定 | 5 元 | 5 元 |
| 拼图改造件与外壳 | 1 | 结构集成 | 10 元 | 10 元 |
| 合计 | 85 元 |
接线与结构
- MAX98357A:BCLK=26,LRC=25,DIN=22,VIN=5V,GND,SD 接 5V 使能。
- INMP441:SCK=32,WS=33,SD=35,VDD=3.3V,L/R 接地选左声道。
- SD 卡模块:CS=5,SCK=18,MOSI=23,MISO=19,VCC=3.3V。
- 按键:录音键 GPIO34,播放键 GPIO35?注意 GPIO35 已给麦克风,改用 GPIO27 播放,GPIO14 录音。LED 用 GPIO2。
- 微调理由:原建议 MIC=32/33/35 正确;但播放键不能占用 35,改用 27 和 14,避免冲突。SPI 使用默认 VSPI 引脚,与 I2S 互不干扰。
核心代码
#include <driver/i2s.h>
#include <SPI.h>
#include <SD.h>
#define MIC_BCLK 32
#define MIC_WS 33
#define MIC_DIN 35
#define SPK_BCLK 26
#define SPK_LRC 25
#define SPK_DIN 22
#define SD_CS 5
#define BTN_REC 14
#define BTN_PLAY 27
#define LED_PIN 2
void i2s_mic_init() {
i2s_config_t cfg = {
.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),
.sample_rate = 16000,
.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
.channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
.communication_format = I2S_COMM_FORMAT_I2S,
.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
.dma_buf_count = 4,
.dma_buf_len = 1024
};
i2s_driver_install(I2S_NUM_0, &cfg;, 0, NULL);
i2s_pin_config_t pins = { .bck_io_num = MIC_BCLK, .ws_io_num = MIC_WS,
.data_out_num = -1, .data_in_num = MIC_DIN };
i2s_set_pin(I2S_NUM_0, &pins;);
}
void i2s_spk_init() {
i2s_config_t cfg = {
.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX),
.sample_rate = 16000,
.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
.channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
.communication_format = I2S_COMM_FORMAT_I2S,
.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
.dma_buf_count = 4,
.dma_buf_len = 1024
};
i2s_driver_install(I2S_NUM_1, &cfg;, 0, NULL);
i2s_pin_config_t pins = { .bck_io_num = SPK_BCLK, .ws_io_num = SPK_LRC,
.data_out_num = SPK_DIN, .data_in_num = -1 };
i2s_set_pin(I2S_NUM_1, &pins;);
}
void record_to_sd(const char* path) {
File f = SD.open(path, FILE_WRITE);
int16_t buf[512];
size_t bytes_read;
while (digitalRead(BTN_REC) == LOW) {
i2s_read(I2S_NUM_0, buf, sizeof(buf), &bytes;_read, portMAX_DELAY);
f.write((uint8_t*)buf, bytes_read);
}
f.close();
}
void play_from_sd(const char* path) {
File f = SD.open(path);
int16_t buf[512];
size_t bytes_read;
while (f.available()) {
bytes_read = f.read((uint8_t*)buf, sizeof(buf));
i2s_write(I2S_NUM_1, buf, bytes_read, &bytes;_read, portMAX_DELAY);
}
f.close();
}
void setup() {
pinMode(LED_PIN, OUTPUT);
SD.begin(SD_CS);
i2s_mic_init();
i2s_spk_init();
}
void loop() {
if (digitalRead(BTN_REC) == LOW) {
digitalWrite(LED_PIN, HIGH);
record_to_sd("/voice.wav");
digitalWrite(LED_PIN, LOW);
}
if (digitalRead(BTN_PLAY) == LOW) {
play_from_sd("/voice.wav");
}
delay(50);
}
调试步骤
- 供电检查:先不接麦克风和功放,测 ESP32 3.3V 与 5V 正常。
- SD 卡测试:运行
SD.begin()并打印卡容量,确认 SPI 接线正确。 - I2S 麦克风:用
i2s_read读取原始数据,串口观察是否有波形变化。 - I2S 功放:播放一段正弦波测试音,确认扬声器发声。
- 录音回放:按下录音键说话,松开后按播放键,听 SD 卡中的音频。
- 拼图联动:将按键替换为拼图触点,调整触发灵敏度,加入 LED 状态提示。
- 整体老化:连续录音播放 30 分钟,检查发热与丢帧。
设计图
儿童拼图机器人语音复读结构flow
1
感知输入
→
2
控制处理
→
3
执行反馈
→
4
数据上报