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 | 谭晓兰 | 第一版发布 |