Библиотека PDM

Библиотека PDM позволяет использовать микрофоны с импульсно-плотностной модуляцией (Pulse-density modulation), установленные на платах Nano RP2040 Connect и Nano 33 BLE Sense.

Автор: Arduino
Последнее изменение: 27.01.2022

Обзор

Библиотека 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: массив для сохранения данных PDM

  • size: количество байт для чтения

Возвращает

Количество прочитанных байт.

Пример

// буфер для чтения сэмплов, каждый сэмпл — 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);
}