×

适用于Arduino MKR和XMC的I2S MEMS麦克风IM69D130

消耗积分:0 | 格式:zip | 大小:0.47 MB | 2023-02-07

王越建

分享资料个

描述

本文介绍如何将IM69D130 立体声麦克风 Shield2Go与 Arduino MKR WiFi 1010 和两个为 Arduino IDE 启用的 Infineons 微控制器板、XMC4700 Relax Lite 套件XMC2Go 连接稍后,本项目将介绍如何使用I2S.h 库从麦克风接收音频数据。

1. 设置硬件

您可以在下方找到用于将 MEMS 麦克风 Shield2Go 与- 1.1 Arduino MKR WiFi 1010 - 1.2 XMC4700 Relax Kit - 1.3 XMC2Go控制器板连接的引出线和连接。

1.1. Arduino MKR WiFi 1010 - I2S MEMS 麦克风 IM69D130

Arduino 和麦克风之间的连接可以通过使用跨接电缆和以下配置来建立:

麦克风 - Arduino MKR WiFi 1010

  • 3V3——3V3【红色】
  • GND - GND [蓝色]
  • BCLK - Pin2 (SCK) [黑色]
  • 数据 - PinA6 (SD) [黄色]
  • WCLK - Pin3 (FS/WS) [灰色]

 

arduino_mkr_wifi_1010_shield2go_memsmic_im69d130_steckplatine_ZrvNTCRLzI.png?auto=compress%2Cformat&w=740&h=555&fit=max
Arduino MKR WiFi 1010 有线连接到 MEMS 麦克风 Shield2Go
 

 

1.2. XMC4700 Relax Lite 套件 - I2S MEMS 麦克风 IM69D130

将麦克风与 XMC4700 连接的最简单方法是使用My IoT Adapter 此适配器可以直接连接到 XMC4700。要使用麦克风,请将其插入转接板的第一个插座,如下图所示。

 
 
 
img_20211220_130317_w6BvYxsAH0.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
 
1 / 3XMC4700 Lite 套件,带有连接的 MyIoTAdapter 和顶部的 MEMS 麦克风 Shield2Go
 

如果您没有 MyIoTAdapter,请不要担心,因为也可以将其连接起来。我们只需要 XMC4700 Lite 套件和一些电线。连接将按如下方式组装:

麦克风 - XMC4700 Lite 套件

  • 3V3——3V3【红色】
  • GND - GND [蓝色]
  • BCLK - Pin3.9 (SPI:SCK) [黑色]
  • 数据 - Pin3.7 (SPI:MISO) [黄色]
  • WCLK - Pin3.10 (SPI:SS) [灰色]
xmc4700_wire_memsmic_im69d130_1donWAhNgQ.png?auto=compress%2Cformat&w=740&h=555&fit=max
XMC4700 Lite 套件有线连接到 MEMS 麦克风 Shield2Go
 

1.3. XMC2Go - I2S MEMS 麦克风 IM69D130

这是所有介绍的配置中最小的一个。XMC2Go专为适应 Shield2Go 的布局构建,因此无需使用跨接电缆将麦克风连接到 XMC2Go 板。最简单的方法是将公头焊接到其中一块板上,将母头焊接到另一块板上,然后将它们连接起来,如图所示。(我们在 XMC2Go 上使用母头,在麦克风上使用公头。)

 
 
 
im69d130_s2go_w_xmc2go_JnwS8ROHoL.png?auto=compress%2Cformat&w=740&h=555&fit=max
 
1 / 3XMC2Go 连接到 MEMS 麦克风 Shield2Go
 

也可以从 XMC2Go 到麦克风进行有线连接,但不建议这样做,因为所有有线连接都可能导致 I2S 连接出现错误。如果您仍然想要有线连接,请执行以下操作:

麦克风 - XMC2Go

  • 3V3-VSS【红色】
  • GND - VDD [蓝色]
  • BCLK - Pin0.8 (SPI:SCK) [黑色]
  • 数据 - Pin0.6 (SPI:MISO) [黄色]
  • WCLK - Pin0.9 (SPI:SS) [灰色]
xmc2go_im69d130_steckplatine_iQkCmGnuMC.png?auto=compress%2Cformat&w=740&h=555&fit=max
XMC2Go 有线连接到 MEMS 麦克风 Shield2Go
 

2. 设置软件

首先,我们需要一个可以正常运行的 Arduino IDE 安装,您可以在此处获取

2.1. Arduino MKR WiFi 1010

安装 IDE 后,我们必须将开发板添加到开发板管理器中。因此,单击工具菜单 -> 开发板 -> 开发板管理器并安装 Arduino SAMD 开发板(32 位 ARM Cortex-M0+)。为此,请在 Boards Manager 中单击,选择最新版本并单击安装。

之后,我们现在准备创建我们的第一个草图以使用 IM69D130 MEMS 麦克风 Shield2Go。

有关如何开始的更多信息,请查看此处。

从代码开始:

让我们快速浏览一下 Arduino 草图。这个草图的基本功能是从麦克风读取音频数据并处理它以通过 Arduino IDE 提供的串行绘图仪显示声压级。

首先,我们必须包含 I2S.h 库才能与麦克风通信。

#include 

之后我们必须为 Arduino 进行设置。为了在串行监视器中显示麦克风的输出,我们必须设置一个串行连接。此外,我们必须使用库的 begin 函数建立 I2S 连接。

void setup() {
  // Open serial communications and wait for port to open:
  // A baud rate of 115200 is used instead of 9600 for a faster data rate
  // on non-native USB ports
  Serial.begin(115200);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  // start I2S at 16 kHz with 32-bits per sample
  if (!I2S.begin(I2S_PHILIPS_MODE, 16000, 32)) {
    Serial.println("Failed to initialize I2S!");
    while (1); // do nothing
  }
}

在循环函数中,我们设置了一个整数变量数组。然后我们检查麦克风上 I2S 数据的可用性。之后,I2S 值从 I2S 缓冲区中读出并保存到我们的整数数组中。计算样本数组的平均值;为了标准化输出,我们从样本的每次迭代中减去平均值。然后我们计算样本的最小值和最大值。最后我们打印出它们之间的差异以显示基本压力水平。您可以在最后找到完整的代码。

void loop() {
  // read a bunch of samples:
  int samples[SAMPLES];

  for (int i=0; i    int sample = 0; 
    while ((sample == 0) || (sample == -1) ) {
      sample = I2S.read();
    }
    // convert to 18 bit signed
    sample >>= 14; 
    samples[i] = sample;
  }

  // ok we hvae the samples, get the mean (avg)
  float meanval = 0;
  for (int i=0; i    meanval += samples[i];
  }
  meanval /= SAMPLES;

  // subtract it from all samples to get a 'normalized' output
  for (int i=0; i    samples[i] -= meanval;
    //Serial.println(samples[i]);
  }

  // find the 'peak to peak' max
  float maxsample, minsample;
  minsample = 100000;
  maxsample = -100000;
  for (int i=0; i    minsample = min(minsample, samples[i]);
    maxsample = max(maxsample, samples[i]);
  }
  Serial.println(maxsample - minsample);
};>;>;>;>

2.2. XMC4700 Relax Lite 套件和 XMC2Go

现在我们来看看 XMC4700 Relax Lite 套件和 XMC2Go 的配置。

在这里,我们假设您有一个可以正常工作的 Arduino IDE,并且已将 XMC 库完全集成到 Arduino IDE 中。如果不是这种情况,请单击此处获取实施指南。

现在一切都应该设置好了,这样我们就可以查看代码了。这段代码的基本功能是从麦克风中读取音频数据并进行处理,通过Arduino IDE提供的串行绘图仪显示声压级。

从代码开始:

首先,我们必须包含 I2S.h 库才能与麦克风通信。

#include 

o 能够在串行监视器中显示麦克风的输出,我们必须设置串行连接。然后我们必须使用库的 begin 函数建立 I2S 连接。

在此之前,我们还禁用两个麦克风并仅启用其中一个,这样信号就不会失真。

void setup()
{
    // Open serial communication with a baudrate of 115200
    Serial.begin(115200);
    // Wait until the serial port is connected
    while (!Serial);

    I2S.disableMicrophones();
    // Enable the microphone when word select is high
    I2S.enableMicrophoneHigh();

    // Start I2S at 11 kHz with 16 bits per sample
    if (I2S.begin(I2S_PHILIPS_MODE, 11000, 16) != 0)
    {
        Serial.println("Failed to initialize I2S!");
        // Do nothing and wait
        while (true);
    }
}

循环函数如下所示。首先,我们创建一个包含 128 个条目的示例数组。当缓冲区中保存了 128 个或更多样本时,我们将读取这些值并将它们保存到我们之前创建的数组中。然后计算平均值并从所有样本中减去平均值以标准化输出。之后计算最小和最大样本,然后打印到串行绘图仪中。您可以在最后找到完整的代码。

void loop()
{
    // Array to store the samples
    int32_t samples[128];
    if (I2S.available() > 128)
    {
        // Read 128 samples into the array
        I2S.read(samples, 128);

        float meanValue = 0;
        for (int i = 0; i < 128; i++)
        {
            meanValue += samples[i];
        }
        meanValue /= 128;

        // Substract it from all samples to normalize output
        for (int i = 0; i < 128; i++)
        {
            samples[i] -= meanValue;
        }

        // Get the peak to peak maximum
        float maxSample, minSample;
        minSample = 100000;
        maxSample = -100000;
        for (int i = 0; i < 128; i++)
        {
            minSample = min(minSample, samples[i]);
            maxSample = max(maxSample, samples[i]);
        }
        Serial.println(maxSample - minSample);
    }   
}

3. 串行绘图仪的配置和输出

要访问绘图仪,请转到Tools -> Serial Plotter 有必要选择我们在代码中设置的相同波特率。可以在串行绘图仪的左下角选择波特率。在我们的例子中,Arduino MKR Wifi 1010的波特率为 115200 ,XMC4700 Relax Lite 套件和 XMC2Go 的波特率为 1000000 。如果您遇到输出未正确显示的问题,您可以随时尝试调整波特率、频率和每个样本的位数。

在查看串行绘图仪的输出时,它可能如下所示:

arduino_ide_plotter_zebuDBqQqa.png?auto=compress%2Cformat&w=740&h=555&fit=max
播放歌曲介绍时的 Arduino IDE 绘图仪。
 

在这张图片中,我们可以在播放歌曲前奏时看到 Arduino IDE 绘图仪。绘图仪显示了整体歌曲音量的上升,高峰是歌曲的节拍。为了能够看到声级的大尖峰,您可以打响指或敲桌子。

如果你得到一个恒定的模糊图,没有明显的尖峰,这是由你的敲击或折断引起的,那么你的数据线连接可能有故障。要解决此问题,请尝试建立更短的电缆、焊接触点或使用屏蔽电缆以确保没有任何东西干扰数据连接。

4. 扩展阅读和更多示例

我们希望您能够遵循我们在此处提供的所有示例和代码片段。如果您对 IM69D130 MEMS 麦克风 Shield2Go 的更多示例和用例感兴趣,您可以查看其GitHub 存储库

如果您想知道如何将此扩展板与 Raspberry-Pi 一起使用,请查看我们关于该主题的其他hackster.io 文章。

此外,如果您想通过 Edge Impulse 将麦克风用于机器学习项目,您可以查看这篇hackster.io 文章


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !