sunsili 发表于 2023-8-18 23:10:06

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

本帖最后由 sunsili 于 2023-8-18 23:12 编辑

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

组件清单– 树莓派 Pico
– Adafruit PDM MEMS 麦克风拓展板
– 面包板
– 条线若干
关于 USBUSB 是一种于 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/ar ... o-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.o ... arted-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.gitcd pico-microphone
创建 build 目录,并切换到相应目录:mkdir buildcd build执行编译命令:make .. -DPICO_BOARD=picomake按住开发板上的 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
页: [1]
查看完整版本: 使用树莓派 Pico 制作 USB 麦克风