这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【过程贴】使用INMP441进行声音采集

共2条 1/1 1 跳转至

【过程贴】使用INMP441进行声音采集

助工
2026-03-17 15:46:44     打赏

硬件

由于网上购买的灯带还没有回来,现阶段先将麦克风的数据采集到单片机并显示在电脑上,后面无论是接屏幕还是接灯带,都只是水到渠成的事。

目前先验证 声音采集 功能,所以接线非常精简。这阶段不需要外部电源,直接用一根 USB 数据线连接电脑和 Teensy 4.0 即可。

以下是针对这一阶段的接线规划:

核心硬件

1、TEENSY 4.0 主控板

2、INMP441 全向麦克风模块

3、面包板与几根杜邦线

4、Micro USB 数据线(连接电脑,既供电又传数据)

INMP441.jpg


INMP441 麦克风 -> Teensy 4.0 接线表

把 Teensy 4.0 插在面包板上,然后按照下表用杜邦线将麦克风连接起来:

INMP441 模块引脚Teensy 4.0 引脚接线说明
VDD3.3V麦克风电源正极。(千万不要接 5V 或 VIN,会烧坏麦克风)
GNDGND电源地线。
L/RGND声道选择。接到 GND 代表输出“左声道”数据。
WSPin 20字选择时钟 (Word Select)。告诉主控现在传的是左声道还是右声道。
SCKPin 21串行时钟 (Serial Clock)。同步数据传输的节拍。
SDPin 8串行数据输出 (Serial Data)。真正的音频数据从这里传给主控。

!!!接线避坑小贴士

1、引脚确认: Teensy 4.0 的引脚非常紧凑,接线时请对照开发板边缘印刷的数字。Pin 8、20、21 都是 Teensy 硬件 I2S 接口的默认引脚,接对这几个,后面写代码时就能直接调用官方音频库,极其省事。

2、麦克风收音孔: INMP441 模块的收音孔通常在 PCB 板的 背面(没有焊盘的那一面),测试的时候记得把那一面朝向声源。接好线之后,硬件准备就完成了。这里附上 错误接法,排针反着接就对了。接下来我们要在 Trae 里面建工程了。

1773735027896785.jpg

实物图

1773737197870261.jpg



软件

在 Trae 里新建一个 PlatformIO 工程,然后按照下面两步替换文件内容。

第一步:配置 platformio.ini 文件

打开工程根目录下的 platformio.ini 文件,将里面的内容全部替换为以下代码。这会让系统知道我们用的是 Teensy 4.0,并且使用 Arduino 框架。

[env:teensy40]

platform = teensy
board = teensy40
framework = arduino

; 串口波特率,用于串口监视器和绘图器
monitor_speed = 115200


第二步:编写测试代码 src/main.cpp

打开 src 文件夹下的 main.cpp 文件,将以下代码复制进去。代码里我加了详细的中文注释,逻辑非常简单:就是不断把麦克风收到的声音“波形数据”打印到电脑上。

#include <Arduino.h>
#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>

// --- Teensy 音频库图形化工具生成的代码 ---
// 1. 创建一个 I2S 音频输入对象(负责跟麦克风通信)
AudioInputI2S            i2s1;           
// 2. 创建一个录音队列(负责把音频数据抓取出来供我们读取)
AudioRecordQueue         queue1;         
// 3. 用一根虚拟的“线”,把麦克风的左声道(0)连接到录音队列
AudioConnection          patchCord1(i2s1, 0, queue1, 0); 
// ------------------------------------------

void setup() {
  Serial.begin(115200);
  
  // 等待串口打开(如果你一上电就想看数据,这句很有用)
  while (!Serial) {
    ; 
  }
  Serial.println("麦克风测试开始!");

  // 为音频系统分配内存积木(单位是块,每块128个采样点,分配10块足够了)
  AudioMemory(10);

  // 启动录音队列,开始抓取声音
  queue1.begin();
}

void loop() {
  // 检查队列里有没有准备好的音频数据块(每块包含 128 个 16 位整数的声音数据)
  if (queue1.available() >= 1) {
    
    // 读取这个数据块的内存地址
    int16_t *buffer = queue1.readBuffer();
    
    // 我们不需要把 128 个点全打印出来,那样串口太容易卡顿了。
    // 每隔 4 个点打印一次,足够我们在电脑上看清声音波形了。
    for (int i = 0; i < 128; i += 4) { 
      Serial.println(buffer[i]);
    }
    
    // 【非常重要】用完这个数据块后,必须把它释放掉,否则内存几秒钟就会爆满卡死!
    queue1.freeBuffer(); 
  }
}


第三步:测试和看效果

1、编译上传: 用 USB 线把 Teensy 4.0 连上电脑,点击 PlatformIO 的“向右箭头”图标(Upload)把代码烧录进去。

2、打开串口绘图器: 打开 VOFA+,在左侧“数据引擎”中,把协议改为 FireWater,观看仪表盘看到一条的直线。试着对着麦克风吹气、拍手或者说话,电脑屏幕上的线条就会像心电图一样剧烈跳动!声音越大,波幅越高。线条能跟着声音准确跳动,说明最核心的硬件采集环节已经完美搞定!

01-1.gif

下一篇分享引入 FFT 算法的测试代码



院士
2026-03-17 17:40:20     打赏
2楼

谢谢分享DIY过程总结。


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]