Библиотека PDM
Библиотека PDM позволяет использовать микрофоны с импульсно-плотностной модуляцией (Pulse-density modulation), установленные на платах Nano RP2040 Connect и Nano 33 BLE Sense.
Обзор
Библиотека PDM позволяет использовать микрофоны PDM (Pulse-density modulation), такие как встроенный MP34DT05 на плате Arduino Nano 33 BLE Sense.
Чтобы использовать эту библиотеку:
#include <PDM.h>
Библиотека заботится об аудио, которое также будет доступно через библиотеку ArduinoSound.
Функции
begin()
Описание
Инициализирует интерфейс PDM.
Синтаксис
PDM.begin(channels, sampleRate)
Параметры
channels: количество каналов, 1 — моно, 2 — стереоsampleRate: частота дискретизации в Гц
Возвращает
1 при успехе, 0 при неудаче.
Пример
if (!PDM.begin(1, 16000)) {
Serial.println("Failed to start PDM!");
while (1);
}
end()
Описание
Деинициализирует интерфейс PDM.
Синтаксис
PDM.end()
Параметры
Нет.
Возвращает
Ничего.
Пример
if (!PDM.begin(1, 16000)) {
Serial.println("Failed to start PDM!");
while (1);
}
//
PDM.end();
available()
Описание
Возвращает количество байт, доступных для чтения из интерфейса PDM. Это данные, которые уже поступили и были сохранены в приёмном буфере PDM.
Синтаксис
PDM.available()
Параметры
Нет.
Возвращает
Количество байт, доступных для чтения.
Пример
// буфер для чтения сэмплов, каждый сэмпл — 16 бит
short sampleBuffer[256];
// количество прочитанных сэмплов
volatile int samplesRead;
//
// запрос количества доступных байт
int bytesAvailable = PDM.available();
// чтение в буфер сэмплов
PDM.read(sampleBuffer, bytesAvailable);
read()
Описание
Считывает данные из PDM в указанный буфер.
Синтаксис
PDM.read(buffer, size)
Параметры
buffer: массив для сохранения данных PDMsize: количество байт для чтения
Возвращает
Количество прочитанных байт.
Пример
// буфер для чтения сэмплов, каждый сэмпл — 16 бит
short sampleBuffer[256];
// количество прочитанных сэмплов
volatile int samplesRead;
//
// запрос количества доступных байт
int bytesAvailable = PDM.available();
// чтение в буфер сэмплов
int bytesRead = PDM.read(sampleBuffer, bytesAvailable);
// 16 бит, 2 байта на сэмпл
samplesRead = bytesRead / 2;
onReceive()
Описание
Устанавливает callback-функцию, которая вызывается, когда новые данные PDM готовы к чтению.
Синтаксис
PDM.onReceive(callback)
Параметры
callback: функция, которая вызывается, когда новые данные PDM готовы к чтению.
Возвращает
Ничего.
Пример
// буфер для чтения сэмплов, каждый сэмпл — 16 бит
short sampleBuffer[256];
// количество прочитанных сэмплов
volatile int samplesRead;
//
// настройка callback приёма данных
PDM.onReceive(onPDMdata);
// инициализация PDM:
// - один канал (моно режим)
// - частота дискретизации 16 кГц
if (!PDM.begin(1, 16000)) {
Serial.println("Failed to start PDM!");
while (1);
}
//
void onPDMdata() {
// запрос количества доступных байт
int bytesAvailable = PDM.available();
// чтение в буфер сэмплов
int bytesRead = PDM.read(sampleBuffer, bytesAvailable);
// 16 бит, 2 байта на сэмпл
samplesRead = bytesRead / 2;
}
setGain()
Описание
Устанавливает значение усиления (gain), используемое интерфейсом PDM.
Синтаксис
PDM.setGain(gain)
Параметры
gain: значение усиления, 0–255, по умолчанию 20, если не указано.
Возвращает
Ничего.
Пример
// опционально установить усиление, по умолчанию 20
PDM.setGain(30);
// инициализация PDM:
// - один канал (моно режим)
// - частота дискретизации 16 кГц
if (!PDM.begin(1, 16000)) {
Serial.println("Failed to start PDM!");
while (1);
}
setBufferSize()
Описание
Устанавливает размер буфера (в байтах), используемого интерфейсом PDM. Должна быть вызвана до PDM.begin(...); если не вызвана, используется размер буфера по умолчанию 512 байт. Этого достаточно, чтобы удерживать 256 16-битных сэмплов.
Синтаксис
PDM.setBufferSize(size)
Параметры
size: размер буфера в байтах.
Возвращает
Ничего.
Пример
PDM.setBufferSize(1024);
// инициализация PDM:
// - один канал (моно режим)
// - частота дискретизации 16 кГц
if (!PDM.begin(1, 16000)) {
Serial.println("Failed to start PDM!");
while (1);
}