ESP32S3读取数字麦克风INMP441的音频数据

ESP32S3 与 INMP441 麦克风模块的集成通常涉及使用 I2S 接口进行数字音频数据的传输。INMP441 是一款高性能的数字麦克风,它通过 I2S 接口输出音频数据。在 Arduino 环境中,ESP32S3 的开发通常使用 ESP-IDF(Espressif IoT Development Framework)或兼容的 Arduino Core for ESP32,后者允许你使用类似于 Arduino 的编程模型。

由于 Arduino Core for ESP32 对 I2S 的直接支持可能不如 ESP-IDF 那么全面,但你可以使用已有的库或编写自己的代码来与 INMP441 通信。以下是一个简化的步骤指南和示例代码,用于在 Arduino 环境中使用 ESP32S3 读取 INMP441 的数据信号。

软件编程(Arduino 语言风格)

在 Arduino Core for ESP32 中,I2S 的支持可能不如 ESP-IDF 那么直接,但你可以使用现有的库或自己编写代码来配置和使用 I2S 接口。以下是一个简化的示例代码框架,用于初始化 I2S 接口并尝试读取 INMP441 的数据。请注意,这个示例可能需要根据你的具体硬件连接进行调整。

硬件连接

1、电源和地线连接

  • INMP441 VCC → ESP32的3.3V:为麦克风模块提供工作电压,确保其正常运行。
  • INMP441 GND → ESP32的GND:完成电路的接地连接,确保电路的稳定性和可靠性。

2、I2S 信号线连接

  • INMP441 SCK(时钟)→ ESP32的GPIO 17:SCK是I2S通信的时钟信号,用于同步数据传输。ESP32的GPIO 17被配置为I2S的时钟引脚,以接收来自麦克风的时钟信号。
  • INMP441 WS(帧选择)→ ESP32的GPIO 18:WS用于选择左声道或右声道的数据帧。ESP32的GPIO 18被配置为I2S的帧选择引脚,以识别当前数据帧的声道信息。
  • INMP441 SD(数据)→ ESP32的GPIO 16:SD是传输数字音频数据的信号线。ESP32的GPIO 16被配置为I2S的数据引脚,以接收麦克风采集到的数字音频信号。

连线依据总结

这种连线方式是基于I2S协议的标准连接方法,确保了ESP32S3能够正确地与INMP441麦克风进行通信,实现音频数据的采集和处理。通过将麦克风的I2S信号引脚连接到ESP32的相应GPIO引脚,并配置ESP32的I2S接口,可以实现高质量的音频数据传输。

引脚名称 功能描述
VDD 电源引脚,连接1.8V至3.3V的电源
GND 地引脚,连接电源地
SD 串行数据输出引脚,通过I2S接口传输数字音频数据
SCK 串行时钟输入引脚,用于I2S接口的时钟信号
WS 字选择输入引脚,用于I2S接口的帧同步信号(也称为LRCK)
L/R 左/右声道选择引脚。当该引脚设置为低电平时,麦克风在I²S帧中输出其信号到左声道;当该引脚设置为高电平时,麦克风在I²S帧中输出其信号到右声道

这些引脚通过I2S协议实现音频数据的传输,其中SCK、WS和SD是I2S通信的关键引脚,L/R引脚用于选择声道。

Arduino代码

cpp 复制代码
#include <Arduino.h>
#include <driver/i2s.h>

// 定义I2S引脚
#define I2S_WS 18
#define I2S_SD 16
#define I2S_SCK 17
#define I2S_PORT I2S_NUM_0
#define bufferLen 1024  // 缓冲区大小

int16_t sBuffer[bufferLen];  // 存储音频数据的缓冲区

void setup() {
  Serial.begin(115200);
  Serial.println("Setup I2S...");

  // 初始化I2S
  i2s_config_t i2s_config = {
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),
    .sample_rate = 48000,  // 采样率
    .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_STAND_I2S),
    .intr_alloc_flags = 0,
    .dma_buf_count = 16,
    .dma_buf_len = bufferLen,
    .use_apll = false
  };

  i2s_driver_install(I2S_PORT, &i2s_config, 0, NULL);

  i2s_pin_config_t pin_config = {
    .bck_io_num = I2S_SCK,
    .ws_io_num = I2S_WS,
    .data_out_num = I2S_PIN_NO_CHANGE,
    .data_in_num = I2S_SD
  };

  i2s_set_pin(I2S_PORT, &pin_config);
  i2s_start(I2S_PORT);
}

void loop() {
  // 从INMP441读取数据
  size_t bytesIn = 0;
  esp_err_t result = i2s_read(I2S_PORT, &sBuffer, bufferLen * sizeof(int16_t), &bytesIn, portMAX_DELAY);
  if (result == ESP_OK && bytesIn > 0) {
    // 通过串口输出数据
    Serial.print("[");
    for (int i = 0; i < bufferLen; i++) {
      Serial.print(sBuffer[i]);
      if (i < bufferLen - 1) {
        Serial.print(", ");
      }
    }
    Serial.println("]");
  }
}

代码说明

  1. I2S配置

    • 使用I2S接口读取INMP441的音频数据。
    • 配置采样率为48000Hz,16位深度,单声道。
  2. 音频数据读取

    • 使用i2s_read函数从I2S接口读取音频数据。
    • 将数据通过UDP发送到接收端。

注意事项

  • 如果需要本地处理音频数据,可以将数据存储到文件或进行实时分析。

通过上述代码,你可以成功读取INMP441麦克风的数据信号,并通过ESP32S3进行处理或传输。

实验结果

相关推荐
mftang2 小时前
STM32G4系列微控制器深度解析
stm32·单片机·嵌入式硬件
cherry_rainyyy2 小时前
51单片机07 串口通信
单片机·嵌入式硬件·51单片机
零下273°3 小时前
51单片机俄罗斯方块计分函数
单片机·嵌入式硬件·51单片机
FmixZA3 小时前
【STM32F1】一种使用通用定时器实现各个通道独立输出不同指定数量脉冲的方法
stm32·单片机·嵌入式硬件·stm32外设应用
LaoZhangGong1234 小时前
Linux第106步_Linux内核RTC驱动实验
linux·stm32·嵌入式硬件·rtc
2401_843785237 小时前
STM32 软件SPI读写W25Q64
stm32·单片机·嵌入式硬件
small_wh1te_coder8 小时前
stm32生成hex文件详解
前端·stm32·嵌入式硬件
杜子不疼.8 小时前
51单片机独立按键的扩展应用
单片机·嵌入式硬件·51单片机
stm32发烧友10 小时前
基于 STM32 的智能电动车防盗与管理系统
stm32·单片机·嵌入式硬件
腾飞的信仰10 小时前
MCU应用踩坑笔记(ADC 中断 / 查询法)
笔记·单片机·嵌入式硬件