要使用ESP32控制INMP441采集并用MAX98357播放音频实现对讲机

要使用ESP32控制INMP441采集并用MAX98357播放音频,您需要遵循以下步骤:

1.准备所需的硬件和软件

ESP32开发板

INMP441麦克风模块

MAX98357音频放大器模块

Arduino IDE

2.将ESP32与INMP441连接

将ESP32和INMP441连接如下:

ESP32 3.3V引脚 -> INMP441 VCC引脚

ESP32 GND 引脚 -> INMP441 GND 引脚

ESP32 GPIO22引脚 -> INMP441 LRCL引脚

ESP32 GPIO21引脚 -> INMP441 BCLK引脚

ESP32 GPIO32引脚 -> INMP441 DAT引脚

3.将ESP32与MAX98357连接

将ESP32和MAX98357连接如下:

ESP32 GND 引脚 -> MAX98357 GND 引脚

ESP32 GPIO25引脚 -> MAX98357 LRCL引脚

ESP32 GPIO26引脚 -> MAX98357 BCLK引脚

ESP32 GPIO27引脚 -> MAX98357 DIN引脚

ESP32 3.3V引脚 -> MAX98357 VIN引脚

4.编写Arduino代码

您需要在Arduino IDE中编写代码来控制ESP32、INMP441和MAX98357来采集、播放和处理音频数据。以下是一个简单的代码示例:


#include "Arduino.h"
#include <driver/i2s.h>

#define INMP441_LRCL 22
#define INMP441_BCLK 21
#define INMP441_DOUT 32

#define MAX98357_LRCL 25
#define MAX98357_BCLK 26
#define MAX98357_DIN 27

#define SAMPLE_RATE 16000

i2s_config_t i2sIn_config = {
  .mode = i2s_mode_t(I2S_MODE_MASTER | I2S_MODE_RX),
  .sample_rate = SAMPLE_RATE,
  .bits_per_sample = i2s_bits_per_sample_t(32),
  .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
  .communication_format = I2S_COMM_FORMAT_I2S_MSB,
  .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
  .dma_buf_count = 4,
  .dma_buf_len = 512
};

i2s_config_t i2sOut_config = {
  .mode = i2s_mode_t(I2S_MODE_MASTER | I2S_MODE_TX),
  .sample_rate = SAMPLE_RATE,
  .bits_per_sample = i2s_bits_per_sample_t(16),
  .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
  .communication_format = I2S_COMM_FORMAT_I2S_MSB,
  .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
  .dma_buf_count = 4,
  .dma_buf_len = 512
};

void setup() {
  Serial.begin(115200);
  
  i2s_driver_install(I2S_NUM_0, &i2sIn_config, 0, NULL);
  i2s_set_pin(I2S_NUM_0, NULL);
  
  i2s_driver_install(I2S_NUM_1, &i2sOut_config, 0, NULL);
  i2s_set_pin(I2S_NUM_1, NULL);

  pinMode(MAX98357_LRCL, OUTPUT);
  pinMode(MAX98357_BCLK, OUTPUT);
  pinMode(MAX98357_DIN, OUTPUT);
  
  // MAX98357 setup
  digitalWrite(MAX98357_LRCL, LOW);
  digitalWrite(MAX98357_BCLK, LOW);
  digitalWrite(MAX98357_DIN, LOW);
  delay(10);
  writeRegister(0x08, 0x08);
}

void loop() {
  size_t bytes_read;
  int16_t data[256];
  
  i2s_read(I2S_NUM_0, &data, sizeof(data), &bytes_read, portMAX_DELAY);
  i2s_write(I2S_NUM_1, &data, sizeof(data), &bytes_read, portMAX_DELAY);
}

void writeRegister(uint8_t reg, uint8_t val) {
  pinMode(MAX98357_LRCL, OUTPUT);
  pinMode(MAX98357_BCLK, OUTPUT);
  pinMode(MAX98357_DIN, OUTPUT);
  
  int i;
  for(i = 7; i >= 0; i--) {
    digitalWrite(MAX98357_LRCL, LOW);
    digitalWrite(MAX98357_BCLK, LOW);
    digitalWrite(MAX98357_DIN, (reg >> i) & 1);
    digitalWrite(MAX98357_BCLK, HIGH);
  }
  
  for(i = 7; i >= 0; i--) {
    digitalWrite(MAX98357_LRCL, LOW);
    digitalWrite(MAX98357_BCLK, LOW);
    digitalWrite(MAX98357_DIN, (val >> i) & 1);
    digitalWrite(MAX98357_BCLK, HIGH);
  }
}

在以上代码中,我们使用了I2S库来控制INMP441收集音频数据和MAX98357播放音频数据。在setup()函数中,我们初始化I2S库和MAX98357芯片的配置。

在loop()函数中,我们使用i2s_read()函数读取I2S缓冲区中的音频数据,并使用i2s_write()函数将数据写入MAX98357中进行播放。

此外,我们还提供了一个函数writeRegister用于向MAX98357芯片写入寄存器数据,使其能够正确配置MAX98357芯片。

5.上传和运行代码

将代码上传到您的ESP32开发板,并在串行监视器中查看输出以确保一切正常。您应该能够从INMP441收集音频数据,并从MAX98357扬声器中听到声音。

物联沃分享整理
物联沃-IOTWORD物联网 » 要使用ESP32控制INMP441采集并用MAX98357播放音频实现对讲机

发表评论