使用树莓派 Pico 制作 USB 麦克风

MAKER:Sandeep Mistry/译:趣无尽(转载请注明出处)

简介
本指南将教你如何使用树莓派 Pico 和外部数字麦克风制作属于自己的 USB 麦克风。本项目通过 RP2040 微控制器(MCU)的编程 I/O(PIO)、直接存储器访问(DMA)和通用串行总线(USB)功能来实现。

组件清单

– 树莓派 Pico
– Adafruit PDM MEMS 麦克风拓展板
– 面包板
– 条线若干

关于 USB

USB 是一种于 1996 年发布的极其流行的标准,适用于有线计算机外围设备,例如键盘、鼠标、打印机、扫描仪和麦克风等。

树莓派 Pico 的 RP2040 MCU 具有*“USB 1.1主机/设备”*功能,正是因为这个功能,树莓派 Pico 既可以连接到现有的 USB 外围设备(主机模式),又可以创建自己的 USB 外围设备(设备模式)。另外,树莓派 Pico SDK 使用 TinyUSB 库作为其 USB 软件堆栈。

Tiny USB 库是一个开源的、跨平台的嵌入式系统 USB 堆栈,支持包括树莓派 RP2040 在内的多种 MCU,同时还支持设备和主机两种模式。我们可以利用它内置的 USB 音频类支持把树莓派 Pico 变成 USB 麦克风。

选择麦克风

RP2040 MCU 具有内置的 4 通道 12 位精度模数转换器(ADC)功能,可用于从外部模拟麦克风收集音频,但我们发现模拟麦克风的音频包含大量噪音,因此我们改用数字麦克风。

数字麦克风有两种常用接口:
– PDM
– I2S

虽然 RP2040 没有自带这两种接口的支持,但灵活的可编程 I/O (PIO) 特性使我们能通过软件创建 PDM 或 I2S 的外围接口。在本指南中,我们将使用 Adafruit PDM MEMS 麦克风拓展板来实现。为了从麦克风获取数据,我们会利用一个引脚来生成输出时钟脉冲信号,并使用另一个引脚来接收数据。

PDM 如何运转?

当 PDM 麦克风接收到时钟脉冲信号后,它会根据麦克风捕获的模拟音频值输出 0 或 1 信号。为了以每秒 16000 个样本(16 kHz)的采样率捕获音频,则必须将 PDM 麦克风的时钟输入驱动到 1.024 MHz,然后才可以对 PDM 麦克风数据信号进行过滤和降采样。对于每个样本,系统会将 64 个值的 0 或 1 输出进行平均,来创建一个介于 -32678 和 32767 之间的 16 位值,用于表示该样本的音频数据。

为了使数据更直观,你可以使用逻辑分析仪(比如 https://www.saleae.com/ )来查看 PDM CLK 和 DAT 信号。

处理流程

系统将执行以下操作:

1. 使用 PIO 在 PDM 麦克风中生成 1.024 MHz 时钟信号。
2. 在每个时钟周期,使用 PIO 从 PDM 麦克风捕获一次数字值。
3. DMA 将被配置为捕获 1 毫秒的音频,采样率为 16 kHz,每毫秒生成 16 个样本。这 16 个样本将由 64 x 16 = 1024 位组成。
4. 收到 16 个样本的原始 PDM 数据后,它将使用 *OpenPDM2PCM* 库将 1024 位原始 PDM 数据进行过滤并降采样,生成 16 个 16 位 https://en.wikipedia.org/wiki/Pulse-code_modulation(PCM)音频样本。
5. 最后,将 16 个 PCM 音频样本通过 USB 接口发送到电脑。

硬件设置

你需要在树莓派 Pico 和 Adafruit PDM MEMS 麦克风拓展版上焊接排针,以便把它们插在面包板上。如果要了解更多关于焊接排针的细节,请参阅 MagPi 网站的 https://magpi.raspberrypi.org/articles/how-to-solder-gpio-pin-headers-to-raspberry-pi-pico 指南。

焊接完这两个部分后,把它们放在面包板上,并按以下方式设置接线:

+---------+-------------------+
| PDM Mic | Raspberry Pi Pico |
|---------+-------------------|
|    3V   |        3V3        |
|---------+-------------------|
|    GND  |        GND        |
|---------+-------------------|
|    SEL  |        GND        |
|---------+-------------------|
|    DAT  |       GPIO2       |
|---------+-------------------|
|    CLK  |       GPIO3       |
+---------+-------------------+

注意:把 PDM Mic. SEL 连接到 GND 接口会导致它在时钟信号下降(从逻辑电平 1 变为 0)后输出新数据。

设置 Pico SDK 开发环境

首先,在电脑上安装树莓派官方提供的 Pico SDK 和所需的工具链。

若要了解更多信息,请参考 https://datasheets.raspberrypi.org/pico/getting-started-with-pico.pdf 手册。

该指南的第 2.1 节适用于所有操作系统,对于特点的操作系统,参考以下几个章节:

Linux:第 2.2 节
macOS:第 9.1 节
Windows:第 9.2 节

下载并编译 pico-microphone 库和示例

设置环境变量 PICO_SDK。

export PICO_SDK_PATH=/path/to/pico-sdk

打开终端,克隆源码并切换到相应目录:

cd ~/ 
git clone https://github.com/sandeepmistry/pico-microphone.git
cd pico-microphone

创建 build 目录,并切换到相应目录:

mkdir build
cd build

执行编译命令:

make .. -DPICO_BOARD=pico
make

按住开发板上的 BOOTSEL 按钮,同时用 USB 数据线把开发板连到电脑上。

把 examples/usb_microphone/usb_microphone.uf2 文件复制到树莓派 Pico 的 ROM 引导磁盘中:

cp -a examples/usb_microphone/usb_microphone.uf2 /Volumes/RPI-RP2/.

不出意外的话,电脑上会出现一个名为 “MicNode” 的新麦克风设备:

录制音频数据

现在我们已经把树莓派 Pico 开发板配置为 USB 麦克风,只需安装录音软件就能通过 USB 接口获取音频数据。本文中以 https://www.audacityteam.org/ 为例。

https://www.audacityteam.org/download/ 并安装 Audacity。安装完成后,打开 Audacity,然后选择 “MicNode” 作为输入设备。

你可以点击“录制” 按钮开始为录制音频,并在需要停止时按下“停止” 按钮。

总结

我们使用树莓派 Pico 和外部 PDM 麦克风制作属于自己的 USB 麦克风。本项目中使用了树莓派 RP2040 的 PIO、DMA 和 USB 硬件特性,以及 OpenPDM2PCM 和 TinyUSB 软件库,在 Arm Cortex-M0+ 架构的 RP2040 处理器上运行。

我们的 USB 麦克风从 PDM 麦克风捕获 PDM 音频数据,将 PDM 数据转换为 PCM 格式,然后通过 USB 实时将 PCM 数据发送到 PC!由于USB音频标准用于树莓派 Pico板和PC之间的通信,因此PC端不需要定制软件。

本文通过 USB 将音频数据从树莓派 Pico 传输到电脑,但你也可以把 https://github.com/sandeepmistry/pico-microphone 库与模拟(或 PDM) 麦克风搭配使用,并在设备上执行数字信号处理 (DSP) ,这样就可以在没有电脑的情况下对开发板的音频环境做出反应。

项目源码可在​项目文件库中下载:​
https://make.quwj.com/project/466

via



坐沙发

发表评论

你的邮件地址不会公开


*