麦克风

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 硬件准备

7.1.2 软件准备

7.1.3 硬件连接

硬件连接1

管脚连接说明:

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 硬件准备

7.2.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. 更多资料

SEN0526 STP 3D 模型.rar

SEN0526 2D CAD 尺寸图.rar

SEN0526 2D CAD 尺寸图.pdf

SEN0526 电路原理图.pdf

MSM261S4030H0R 芯片手册.pdf

常见问题

还没有客户对此产品有任何问题,欢迎通过qq或者论坛联系我们!

更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖

DFshopping_car1.png DFRobot商城购买链接

WIKI文档修改历史

文档版本号 修改时间 修改人 修改内容
V1.0 2022.11.18 康啸 第一版发布

产品修改历史

产品版本号 修改时间 修改人 产品修改内容
V1.0 2022.11.18 谭晓兰 第一版发布