电子说
在电子设计领域,一款优秀的麦克风对于音频相关项目至关重要。今天,我们要介绍的是 Adafruit PDM Microphone Breakout,这是一款独特的麦克风,为电子工程师带来了新的选择。
文件下载:3492.pdf
PDM(脉冲密度调制)MEMS 麦克风是一种相对较新的麦克风类型,它不同于常见的模拟或 I2S 麦克风。在众多产品中,PDM 麦克风被广泛使用,但在创客项目中却较少见到。Adafruit 推出这款 PDM Microphone Breakout,旨在让更多人能体验到它的优势。
管理这些麦克风有几种方式:
每个 PDM 麦克风订单都包含一个完全组装和测试好的麦克风。有两种版本可供选择:
这款麦克风的引脚非常简单:
目前,仅针对 SAMD21 芯片组提供了使用 I2S 外设的示例代码。不过,使用 SAMD21 时,引脚选择有限,且数字滤波必须在软件中完成。实际上,对于 SAMD21 来说,模拟麦克风可能会更省心。
对于 Feather M0 / Metro M0 / Arduino Zero 系列,可用的 I2S 引脚如下:
需要从 github 下载最新版本的 ZeroPDM 库并进行常规安装。有两个示例可供选择,一个使用 DMA 功能获取数据,这种方式需要更多的设置,并且需要 ZeroDMA 库;建议从基本示例开始,它会将音频数据回显到 A0(模拟输出),可以连接耳机或示波器到 A0 来听取或查看音频。在上传代码之前,要确保修改实例化器以匹配引脚。
使用 CircuitPython 可以很方便地使用 Adafruit PDM 麦克风扩展板,借助内置的 audiobusio 模块和 PDMIn 类,可以通过 PDM 记录来自麦克风的输入音频信号。
以 Feather M4 Express 为例,不同版本的接线方式如下:
如果使用 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)
可以下载以下文件:
Adafruit PDM Microphone Breakout 为电子工程师提供了一个新的音频解决方案。你在使用这款麦克风时遇到过什么问题吗?或者你有什么独特的应用案例,欢迎在评论区分享。
全部0条评论
快来发表一下你的评论吧 !