1. 产品简介
这是一款体积迷你的MEMS工艺数字I2S输出麦克风模块。支持在具有I2S接口的主控上直接输出音频,例如ESP32等。和传统的模拟量麦克风相比,I2S数字麦克风具备噪音低、灵敏度高、可靠性高、体积小等优良特性。这些特性可让I2S麦克风应用在语音识别、录音、AI学习、蓝牙语音传输等多种应用场景。
本模块采用顶部开孔的MEMS贴片封装I2S麦克风传感器,底部没有安装元件。小巧的体积让你可以非常灵活的将模块应用到自己的项目当中。并且,DF的开发团队基于ESP32开发了I2S麦克风的Arduino库,你可以在ESP32上轻松的将本模块使用起来。
2. 产品特性
- 体积小巧
- 低功耗、高性能
- I2S数字输入,噪音低
- MEMS工艺传感器,可靠性高
- 提供Arduino库,支持ESP32
3. 应用场景
- 语音识别
- AI学习
- 录音
- 蓝牙语音传输
- 智能家具音频项目
4. 引脚排列图

| 引脚名称 | 引脚功能 | 功能说明 | 
|---|---|---|
| 3V3 | 电源正极 | DC 3.3V | 
| GND | 电源负极 | 电源负极 | 
| SCK | I2S时钟 | 针对I2S接口的串行数据时钟。 | 
| SEL | 左右通道设置 | 设置麦克风的左右通道。该引脚设置低时,麦克风在I2S上设置为左通道输出;为高时,麦克风设置为右通道输出。 | 
| WS | 数据字段选择 | 左右声道数据选择,接在I2S接口的WS端。 | 
| DO | 数据输出 | I2S麦克风的串行数据输出。 | 
5. 规格参数
- 工作电压:DC 3.3V
- 麦克风封装工艺:MEMS
- 方向性:全向
- 数据接口:I2S
- 声压等级:140dB
- 信噪比:59dB
- 产品尺寸:11mm×16mm
6. 产品尺寸图

7. ESP32使用教程
7.1 麦克风输入实验
7.1.1 硬件准备
- FireBeetle 2 ESP32-E主控板 (SKU:DFR0654) ×1
- I2S麦克风模块(SKU:SEN0526)×1
- 杜邦线若干
7.1.2 软件准备
- 下载Arduino IDE: 点击下载Arduino IDE
- 安装SDK:点击进入FireBeetle 2 ESP32-E主控板 WIKI页面 查找SDK安装教程
- 下载Arduino库:https://github.com/DFRobot/DFRobot_MSM261 关于如何安装库文件: 如何加载库文件
7.1.3 硬件连接

管脚连接说明:
I2S麦克风:VCC引脚---(连接)---ESP32-E主控:3V3;
I2S麦克风:GND引脚---(连接)---ESP32-E主控:GND;
I2S麦克风:SEL引脚---(连接)---ESP32-E主控:4/D12;
I2S麦克风:DO引脚---(连接)---ESP32-E主控:26/D3;
I2S麦克风:SCK引脚---(连接)---ESP32-E主控:25/D2;
I2S麦克风:WS引脚---(连接)---ESP32-E主控:16/D11;
7.1.4 例程代码
代码功能:麦克风读取左声道数据,并打印数据
#include "DFrobot_MSM261.h"
#define SAMPLE_RATE     (44100)
#define I2S_SCK_IO      (25)
#define I2S_WS_IO       (16)
#define I2S_DI_IO       (26)
#define DATA_BIT        (16)
#define MODE_PIN        (4)
DFRobot_Microphone microphone(I2S_SCK_IO, I2S_WS_IO, I2S_DI_IO);
char i2sReadrawBuff[100];
void setup() {
  Serial.begin(115200);//串口速率115200
  pinMode(MODE_PIN,OUTPUT);
  digitalWrite(MODE_PIN,LOW);//将麦克风配置为接收左声道数据
  while(microphone.begin(SAMPLE_RATE, DATA_BIT) != 0){
      Serial.println(" I2S init failed");//初始化失败
  }
  Serial.println("I2S init success");//初始化成功
}
void loop() {
  microphone.read(i2sReadrawBuff,100);
  //输出左声道数据
  Serial.println((int16_t)(i2sReadrawBuff[0]|i2sReadrawBuff[1]<<8));
  delay(100);
}
运行结果
打开串口视图选项,对着麦克风模块吹气,对应吹气时间段出现波峰波谷

7.2 麦克风录音实验
7.2.1 硬件准备
- FireBeetle 2 ESP32-E主控板 (SKU:DFR0654)×1
- MicroSD Module (SKU:DFR0229)×1
- 闪迪至尊高速移动microSD (SKU:FIT0394)×1
- 川宇C289 TF卡/MicroSD卡读卡器 (SKU:FIT0548))×1
- I2S麦克风模块(SKU:SEN0526)×1
- 杜邦线若干
7.2.2 硬件连接

管脚连接说明:
I2S麦克风:VCC引脚---(连接)---ESP32-E主控:3V3;
I2S麦克风:GND引脚---(连接)---ESP32-E主控:GND;
I2S麦克风:SEL引脚---(连接)---ESP32-E主控:4/D12;
I2S麦克风:DO引脚---(连接)---ESP32-E主控:26/D3;
I2S麦克风:SCK引脚---(连接)---ESP32-E主控:25/D2;
I2S麦克风:WS引脚---(连接)---ESP32-E主控:16/D11;
SD卡模块:+5V引脚---(连接)---ESP32-E主控:VCC;
SD卡模块:GND引脚---(连接)---ESP32-E主控:GND;
SD卡模块:MOSI引脚---(连接)---ESP32-E主控:23/MOSI;
SD卡模块:SS引脚---(连接)---ESP32-E主控:2/D9;
SD卡模块:SCK引脚---(连接)---ESP32-E主控:18/SCK;
SD卡模块:MISO引脚---(连接)---ESP32-E主控:19/MISO;
7.2.3 例程演示
代码功能:本例程演示了使用参数为16bit 44.1kHz录制20秒的音频并以WAVE文件保存在SD卡中。
注:采用16bit 44.1kHz(CD格式标志)
采样频率越高,声音质量越好,数据量越大。常用频率11.025kHz,22.05kHZ,44.1kHz,48kHz,96kHz
量化位数越大,声音质量越好,数据量越大。常用量化位数8位,16位,24位,32位
#include "DFrobot_MSM261.h"
#include "SPI.h"
#include <SD.h>
#include <FS.h>
#define SAMPLE_RATE     (44100) //修改采样频率
#define I2S_SCK_IO      (25)
#define I2S_WS_IO       (16)
#define I2S_DI_IO       (26)
#define DATA_BIT        (16) //修改量化位数
#define MODE_PIN        (4)
const int record_time = 20;  // 采样时间
const char filename[] = "/sound.wav";//保存的文件名称
const int headerSize = 44;
const int byteRate = 176400;//一秒采集的字节数量 计算方式:采样速率x声道数量x数据位数/8
const int waveDataSize = record_time * byteRate;//10秒采样字节
const int numCommunicationData = 512;//每次采集的数据量
byte header[headerSize];//WAVE文件的文件头
char communicationData[numCommunicationData];
DFRobot_Microphone microphone(I2S_SCK_IO, I2S_WS_IO, I2S_DI_IO);
File file;
void setup() {
  Serial.begin(115200);
  pinMode(MODE_PIN,OUTPUT);
  digitalWrite(MODE_PIN,LOW);//将麦克风配置为接收左声道数据
  //digitalWrite(MODE_PIN,HIGH);//将麦克风配置为接收右声道数据
  while(microphone.begin(SAMPLE_RATE, DATA_BIT) != 0){
      Serial.println(" I2S init failed");
  }
  Serial.println("I2S init success");
  if (!SD.begin(2)) Serial.println("SD begin failed");
    while(!SD.begin(2)){
      Serial.print(".");
      delay(500);
    }
  microphone.createWavHeader(header, waveDataSize,44100,2,byteRate,4);
  SD.remove(filename);
  //打开文件,如果没有文件就创建文件
  file = SD.open(filename, FILE_WRITE);
  if (!file) return;
  //将wave文件的头写入文件中
  file.write(header, headerSize);
  Serial.println("start");
  for (int j = 0; j < waveDataSize/numCommunicationData; ++j) {
    microphone.read(communicationData, numCommunicationData);
    for(uint32_t i = 0;i < (numCommunicationData>>2);i++){
      communicationData[(i<<2)] = 0;
      communicationData[(i<<2)+1] = 0;
      //communicationData[(i<<2)+2] = 0;
      //communicationData[(i<<2)+3] = 0;
    }
    file.write((uint8_t*)communicationData, numCommunicationData);
  }
  file.close();
  Serial.println("finish");
}
void loop() {
}
运行结果
烧录程序,打开串口,出现start开始录音,出现finish,完成录音

检查SD卡,出现录音文件

8. API函数
 /**
   * @fn begin
   * @brief 初始化设备
   * @param baudRate 通信速率
   * @param bit 数据位数
   * @return 返回初始化状态
   */
  uint8_t begin(uint16_t baudRate,uint8_t bit)
  /**
   * @brief 获取麦克风返回数据
   * @param buffer 获取数据得buffer
   * @param len    获取数据长度
   * @return 返回获取数据长度
   */
  uint32_t read(char *buffer,size_t len)
  /**
   * @brief 构建WAVE文件的头
   * @param header 构建WAVE的文件
   * @param totalDataLen 需要写入的数据长度
   * @param longSampleRate 采样频率
   * @param channels 声道数量
   * @param byteRate 字节速率 计算方式:采样速率x声道数量x数据位数/8
   * @param blockAlign 块对齐方式 计算方式:声道数量x数据位数/8
   */
    void createWavHeader(byte* header, int totalDataLen, int longSampleRate, uint8_t channels, int byteRate, uint8_t blockAlign)
  /**
   * @brief 初始化蓝牙和a2dp
   * @param name  蓝牙名称
   * @param callback a2dp发送数据的回调函数
   * @param volume 声音强度
   */
  bool begin(const char* name, esp_a2d_source_data_cb_t callback,uint8_t volume);
9. 更多资料
常见问题
还没有客户对此产品有任何问题,欢迎通过qq或者论坛联系我们!
更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖
WIKI文档修改历史
| 文档版本号 | 修改时间 | 修改人 | 修改内容 | 
|---|---|---|---|
| V1.0 | 2022.11.18 | 康啸 | 第一版发布 | 
产品修改历史
| 产品版本号 | 修改时间 | 修改人 | 产品修改内容 | 
|---|---|---|---|
| V1.0 | 2022.11.18 | 谭晓兰 | 第一版发布 | 
