INMP441 I²S 麦克风在树莓派上的使用
在这篇文章中,我将在 Raspberry Pi 4B 上使用 INMP441 麦克风模块,通过 I²S 接口实现音频录制。
一、硬件接线
INMP441 是一款 I²S 数字麦克风,使用 3.3V 供电
下面是与 树莓派 GPIO 的连接方式:
| 树莓派引脚 | INMP441 引脚 | 说明 |
|---|---|---|
| 3V3 | VDD | 电源 |
| GND | GND | 地线 |
| GPIO18(物理脚 12) | SCK | I²S 时钟(BCLK) |
| GPIO19(物理脚 35) | LRCL / WS | 左右声道时钟(LRCLK) |
| GPIO20(物理脚 38) | SD | 麦克风输出数据(接 Pi 的 DIN) |
⚙️ L/R(SEL)引脚说明:
- 接 GND = 左声道
- 接 3V3 = 右声道
- 若使用两只麦克风,可分别接左、右实现立体声。
单声道接线示意图如下:
立体声左右声道接线示意图如下:
二、I²S 协议简介与信号解析
在深入树莓派配置前,我们先了解一下 I²S(Inter-IC Sound) 协议的基本原理。
I²S 是一种专门用于 数字音频数据传输 的串行总线标准,由 Philips(现 NXP)提出,广泛应用于音频编解码器、数字麦克风与音频 DSP 之间的通信。
1. I²S 的三条主要信号线
| 信号线 | 名称 | 作用 |
|---|---|---|
| BCLK(Bit Clock) | 位时钟 | 每传输 1 位音频数据时产生 1 个脉冲。它定义了数据位传输节奏。 |
| LRCLK(Word Select / WS) | 左右声道选择 | 用于区分当前传输的是左声道(低电平)还是右声道(高电平)数据。 |
| SD(Serial Data) | 串行数据线 | 传输实际的音频采样值(例如 24 位或 32 位)。 |
通常,主设备(例如 Raspberry Pi)提供 BCLK 和 LRCLK,
从设备(如 INMP441 麦克风)在 SD 线上发送数据。
2. 数据格式与时序
在标准 I²S 模式下:
- 当 LRCLK 为低电平 时,传输左声道;
- 当 LRCLK 为高电平 时,传输右声道;
- 每个声道的数据在 LRCLK 翻转后一个 BCLK 周期开始;
- 高位(MSB)先出,常见格式为 32-bit 左对齐。
时序图大致如下:
1 | LRCLK: _------______------______ |
这样可以保证接收端在 LRCLK 变化后有稳定的时间读取正确的数据起始位。
三、启用 I²S 驱动(Device Tree Overlay)
Raspberry Pi 的音频系统通过设备树(Device Tree)加载 I²S 声卡驱动。
编辑配置文件并添加以下内容:
对应路径:
- Bullseye 及更早版本:
/boot/config.txt - Bookworm 及以后版本:
/boot/firmware/config.txt
在文件末尾添加一行:
1 | dtoverlay=googlevoicehat-soundcard |
保存后重启:
1 | sudo reboot |
这会启用一个虚拟的 I²S 声卡(常见名为 snd_rpi_i2s_card),可被 arecord、pyaudio 等工具识别使用。
四、使用 arecord 测试录音
系统重启后,使用以下命令查看声卡列表:
1 | arecord -l |
示例输出:
1 | card 1: sndrpii2scard [snd_rpi_i2s_card], device 0: ... |
假设卡号为 1,则可开始录音。
单声道录音(1 只麦):
1 | arecord -D plughw:1 -c1 -r 48000 -f S32_LE -t wav -V mono -v mic.wav |
立体声录音(2 只麦):
1 | arecord -D plughw:1 -c2 -r 48000 -f S32_LE -t wav -V stereo -v mic_stereo.wav |
参数详解:
| 参数 | 含义 |
|---|---|
-D plughw:1 |
指定设备(card 1) |
-c1 / -c2 |
声道数(单声道/立体声) |
-r 48000 |
采样率(48 kHz) |
-f S32_LE |
采样格式:32 位小端序 |
-t wav |
输出格式 |
-V mono/stereo |
录音电平显示 |
-v |
输出详细信息 |
录音结束后,可通过以下命令播放:
1 | aplay mic.wav |
五、常见问题与排错技巧
1. 录不到声音 / 声卡未出现
- 检查 overlay 配置是否写入正确路径(Bookworm 为
/boot/firmware/config.txt) - 确认重启后执行了
arecord -l能看到 I²S 声卡 dmesg有相关加载输出- 引脚是否按照 I²S 接口定义正确连接
2. 音量太小
INMP441 没有硬件增益,可以使用软件方式(如 .asoundrc + alsamixer 的 softvol 插件)提高录音音量。
3. 格式错误
部分版本 arecord 默认格式为 16 位,可手动指定为 S32_LE(32 位小端)匹配驱动。
六、Python扩展
如果希望在 Python 中使用,可以通过 pyaudio 或 sounddevice 库读取相同声卡:
1 | import sounddevice as sd |
七、参考资料
- Adafruit I2S MEMS Microphone Breakout – Wiring & Test (2024)
- Maker Portal – Recording Stereo Audio on a Raspberry Pi
- Pinout.xyz – PCM/I²S GPIO 功能说明