Adafruit PDM Microphone Breakout:电子工程师的新宠

电子说

1.4w人已加入

描述

Adafruit PDM Microphone Breakout:电子工程师的新宠

在电子设计领域,一款优秀的麦克风对于音频相关项目至关重要。今天,我们要介绍的是 Adafruit PDM Microphone Breakout,这是一款独特的麦克风,为电子工程师带来了新的选择。

文件下载:3492.pdf

一、概述

PDM(脉冲密度调制)MEMS 麦克风是一种相对较新的麦克风类型,它不同于常见的模拟或 I2S 麦克风。在众多产品中,PDM 麦克风被广泛使用,但在创客项目中却较少见到。Adafruit 推出这款 PDM Microphone Breakout,旨在让更多人能体验到它的优势。

特点

  1. 无模拟输出:与许多驻极体麦克风组件不同,这款传感器不提供“模拟”输出,这对于没有模拟输入的芯片来说是一个很好的选择。
  2. 数字接口简单:其数字接口采用脉冲密度调制输出,既不是 PWM 也不是 I2S。不过,使用时需要确保芯片具有 PDM 接口,现在大多数 32 位处理器都具备这一特性。
  3. 类似 1 - 比特 PWM:PDM 有点像 1 - 比特 PWM,需要以 1 MHz - 3 MHz 的时钟速率对麦克风进行时钟控制,在数据线上会输出与时钟同步的方波。数据线输出 0 或 1 的逻辑值,方波的密度经过平均后可得到模拟值。

管理方式

管理这些麦克风有几种方式:

  1. 硬件外设和库支持:芯片自带硬件外设和库,能高速管理数据、收集样本、应用滤波器并给出模拟值,这是最理想的情况。
  2. 硬件外设但需自行处理:芯片有硬件外设提供值,但需要自己进行抽取/滤波操作。例如在 ATSAMD21 芯片组上就有相关示例代码。
  3. 无硬件外设但自行实现:芯片没有硬件外设,但可以通过自己的方法使其工作,如 ATtiny85 的示例。
  4. 手动生成时钟并添加滤波:手动生成高速时钟,然后在数据线上添加模拟滤波器,读取模拟值,这是一种可行但稍显“hack”的方法。

产品版本

每个 PDM 麦克风订单都包含一个完全组装和测试好的麦克风。有两种版本可供选择:

  1. 带引脚版本:带有一个小引脚,可用于面包板兼容性。
  2. 带 JST SH 连接器版本:配备 4 - JST SH 连接器,通过 3V、GND、DAT、CLK 连接,可使用 JST - SH 电缆实现灵活的麦克风布置。板上的焊接跳线可将麦克风从左声道切换到右声道。

二、引脚说明

这款麦克风的引脚非常简单:

  1. 3V:电源输入引脚,直接为芯片供电。如果有安静的电源引脚,建议使用。芯片支持 1.8 - 3.3V,但未在 1.8V 下进行测试。
  2. GND:电源和数据的接地参考。
  3. SEL:左右声道选择。该引脚为高电平时,输出在 CLK 的下降沿被视为“右”声道;为低电平时,输出在上升沿,即“左”声道。
  4. CLK:PDM 时钟输入,需要 1 - 3 MHz 的方波。
  5. DAT:PDM 数据输出。

三、Arduino 接线与测试

目前,仅针对 SAMD21 芯片组提供了使用 I2S 外设的示例代码。不过,使用 SAMD21 时,引脚选择有限,且数字滤波必须在软件中完成。实际上,对于 SAMD21 来说,模拟麦克风可能会更省心。

可用的 I2S 引脚

对于 Feather M0 / Metro M0 / Arduino Zero 系列,可用的 I2S 引脚如下:

  • 时钟引脚:PA10(D1 或 TX)、PB11(SCK)、PA20(D6)
  • 数据引脚:PA07(D9)、PA08(D4)、PA19(D12)

安装库

需要从 github 下载最新版本的 ZeroPDM 库并进行常规安装。有两个示例可供选择,一个使用 DMA 功能获取数据,这种方式需要更多的设置,并且需要 ZeroDMA 库;建议从基本示例开始,它会将音频数据回显到 A0(模拟输出),可以连接耳机或示波器到 A0 来听取或查看音频。在上传代码之前,要确保修改实例化器以匹配引脚。

四、CircuitPython 使用

使用 CircuitPython 可以很方便地使用 Adafruit PDM 麦克风扩展板,借助内置的 audiobusio 模块和 PDMIn 类,可以通过 PDM 记录来自麦克风的输入音频信号。

接线

以 Feather M4 Express 为例,不同版本的接线方式如下:

  • 引脚版本:Mic 3V 连接到 Feather 3V,Mic GND 连接到 Feather Gnd,Mic CLK 连接到 Feather TX,Mic DAT 连接到 Feather D12。
  • JST 版本:Mic 3V(红色线)连接到 Feather 3V,Mic GND(黑色线)连接到 Feather Gnd,Mic DAT(蓝色线)连接到 Feather D12,Mic CLK(黄色线)连接到 Feather TX。

如果使用 Circuit Playground Express,它内置了 PDM 麦克风,有专门的指南页面介绍如何使用。

代码示例

将以下代码保存为 code.py 到微控制器板上:

import time
import array
import math
import board
import audiobusio

# Remove DC bias before computing RMS.
def mean(values):
    return sum(values) / len(values)

def normalized_rms(values):
    minbuf = int(mean(values))
    samples_sum = sum(
        float(sample - minbuf) * (sample - minbuf)
        for sample in values
    )
    return math.sqrt(samples_sum / len(values))

# Main program
mic = audiobusio.PDMIn(board.TX, board.D12, sample_rate=16000, bit_depth=16)
samples = array.array('H', [0] * 160)

while True:
    mic.record(samples, len(samples))
    magnitude = normalized_rms(samples)
    print((magnitude,))
    time.sleep(0.1)

代码中首先导入所需的库,然后定义了两个辅助函数,用于计算平均值和归一化的 RMS 平均值。接着设置麦克风对象和样本变量,开始采集声音样本,计算样本的平均值(即幅度),并将其打印到串行控制台。需要注意的是,Mu 绘图仪需要元组值进行打印,所以打印时要使用正确的格式。

查找有效引脚组合

如果想知道哪些引脚组合支持 PDMIn,可以将以下代码保存为 code.py 到板上,连接到串行控制台查看:

import board
import audiobusio
from microcontroller import Pin

def is_hardware_PDM(clock, data):
    try:
        p = audiobusio.PDMIn(clock, data)
        p.deinit()
        return True
    except ValueError:
        return False
    except RuntimeError:
        return True

def get_unique_pins():
    exclude = ['NEOPIXEL', 'APA102_MOSI', 'APA102_SCK']
    pins = [pin for pin in [getattr(board, p) for p in dir(board) if p not in exclude] if isinstance(pin, Pin)]
    unique = []
    for p in pins:
        if p not in unique:
            unique.append(p)
    return unique

for clock_pin in get_unique_pins():
    for data_pin in get_unique_pins():
        if clock_pin is data_pin:
            continue
        if is_hardware_PDM(clock_pin, data_pin):
            print("Clock pin:", clock_pin, "t Data pin:", data_pin)

五、下载资源

可以下载以下文件:

  1. MP34DT01 - M 数据表
  2. GitHub 上的 Fritzing 文件
  3. GitHub 上的 3D 模型

Adafruit PDM Microphone Breakout 为电子工程师提供了一个新的音频解决方案。你在使用这款麦克风时遇到过什么问题吗?或者你有什么独特的应用案例,欢迎在评论区分享。

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

全部0条评论

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

×
20
完善资料,
赚取积分