💡 划重点

  • 基于 ESP32 双 I2S 通道,实现“录音—存储—复读”闭环。
  • INMP441 采集孩子语音,MAX98357A 驱动扬声器播放,SD 卡保存音频文件。
  • 拼图完成触发录音,机器人用原声或变声复读,增强互动与鼓励。
  • 整机成本控制在 85 元内,适合家庭与幼儿园小规模落地。

需求洞察

目标用户是 3-8 岁儿童及其家长。真实痛点:传统拼图玩法静态,孩子拼完后缺少即时反馈;家长陪伴时间有限,难以持续回应孩子的自言自语;普通早教机内容固定,无法录入孩子自己的声音。儿童拼图机器人语音复读让拼图变成“会说话的伙伴”:孩子每拼好一块或完成一幅拼图,按下按钮,机器人录下孩子说的话,再播放出来,形成“我说—它学—它说”的循环。这种即时语音反馈能提升成就感,锻炼语言表达,也适合亲子共同改装。技术上,ESP32 的 I2S 双通道可同时处理麦克风输入和功放输出,SD 卡提供低成本存储,整体方案成熟且可扩展。

方案设计

物料清单

物料 数量 用途 估算单价 合计
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 元

接线与结构

核心代码


#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);
}

调试步骤

  1. 供电检查:先不接麦克风和功放,测 ESP32 3.3V 与 5V 正常。
  2. SD 卡测试:运行 SD.begin() 并打印卡容量,确认 SPI 接线正确。
  3. I2S 麦克风:用 i2s_read 读取原始数据,串口观察是否有波形变化。
  4. I2S 功放:播放一段正弦波测试音,确认扬声器发声。
  5. 录音回放:按下录音键说话,松开后按播放键,听 SD 卡中的音频。
  6. 拼图联动:将按键替换为拼图触点,调整触发灵敏度,加入 LED 状态提示。
  7. 整体老化:连续录音播放 30 分钟,检查发热与丢帧。

设计图

儿童拼图机器人语音复读结构flow
1
感知输入
→
2
控制处理
→
3
执行反馈
→
4
数据上报