INMP441 — цифровой MEMS-микрофон
Цифровой микрофон с 24-битным АЦП на кристалле: наружу идёт готовый цифровой поток по интерфейсу I2S. Компонент читает поток через DMA на ESP32, считает уровень громкости и передаёт сырые сэмплы на компьютер для визуализации осциллограммы, спектра и спектрограммы звука в реальном времени.
🎤 Цифровой MEMS-микрофон INMP441
INMP441 — цифровой микрофон с 24-битным АЦП прямо на кристалле: наружу идёт не аналоговый сигнал, а готовый цифровой поток по интерфейсу I2S. Компонент читает этот поток через DMA на ESP32, считает уровень громкости и передаёт сырые сэмплы на компьютер для визуализации осциллограммы, спектра и спектрограммы звука в реальном времени — подробная физика в THEORY.md.
📋 Навигация
| Файл | Что внутри |
|---|---|
| WIRING.md | Подключение, таблица пинов, логика L/R-канала |
| THEORY.md | Физика звука, протокол I2S, Найквист, БПФ, почему нет абсолютных дБ SPL |
| Lesson.md | Методический план урока (уроков) для учителя |
| PREZ.md | Презентация модуля — тезисы для урока |
🛠 Состав компонента
include/Inmp441.h— интерфейс класса драйвера.src/Inmp441.cpp— настройка канала I2S и чтение через DMA.src/main.cpp— тестовый стенд: метр громкости и режим Serial Plotter.tools/visualizer.py— Python-визуализатор (осциллограмма, спектр, спектрограмма).
🚀 Сборка и прошивка (PlatformIO)
cd Sensors/Sound/INMP441
pio run -t upload && pio device monitorПо умолчанию пины настроены под ESP32 DevKit v1 (GPIO25/26/32) — см.
Inmp441::Config и WIRING.md. Перед первым запуском
обязательно проверьте пин L/R — от него зависит поле Config::channel, при несовпадении
микрофон будет отдавать одни нули (см. WIRING.md).
Тестовый стенд (Serial Monitor, 921600 бод)
По умолчанию стенд печатает метр громкости — пик, RMS и статус связи 10 раз в секунду:
[-18dBFS] peak= 4200 rms=3120.4 isAlive=1 ##############Команда p переключает в режим Serial Plotter (Tools → Serial Plotter в Arduino IDE) — сырая
волна звука в виде графика прямо в IDE, без Python.
🖥️ Python-визуализатор
cd tools
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
python3 visualizer.py /dev/ttyUSB0 # или свой порт, см. `ls /dev/ttyUSB*`Перед запуском переключите стенд в режим Plotter командой p в Serial Monitor — визуализатор
читает тот же поток чисел. Три синхронных графика — осциллограмма, спектр (БПФ) и
спектрограмма — разобраны в THEORY.md, раздел 7.
Никакого распознавания типа звука визуализатор не делает — это осознанное решение: график “похож на голос/свист/хлопок” ученик должен научиться читать сам, а не полагаться на эвристику, которая на самом деле просто сравнивает пару чисел с порогом.
🎤 Теория: цифровой звук и MEMS-микрофон INMP441
1. Что такое звук физически
Звук — это волна давления воздуха, бегущая от источника. Когда что-то колеблется (голосовые связки, динамик, ладони при хлопке), оно попеременно сжимает и разрежает воздух рядом с собой, и эта область сжатия/разрежения распространяется дальше со скоростью ~343 м/с (при 20°C).
Волну описывают две главные величины:
- Частота (Гц) — сколько раз в секунду давление колеблется туда-обратно. Определяет высоту звука: низкий бас — десятки-сотни Гц, свист — килогерцы.
- Амплитуда — насколько сильно меняется давление относительно атмосферного. Определяет громкость.
Человеческое ухо слышит примерно 20 Гц — 20 000 Гц. INMP441 по даташиту рассчитан на диапазон 60 Гц — 15 кГц — уже, чем весь слышимый диапазон, но с запасом покрывает речь (основная энергия голоса — 100 Гц — 4 кГц).
2. Микрофон INMP441 — как звук становится числом
Внутри INMP441 — MEMS-мембрана (микроскопическая кремниевая пластина), которая физически прогибается под давлением звуковой волны. Это механическое смещение сразу же, прямо на кристалле микрофона, оцифровывается встроенным 24-битным АЦП (аналого-цифровым преобразователем) — в отличие от аналоговых электретных микрофонов, где сырой аналоговый сигнал нужно было бы ещё передавать по проводу до АЦП на плате, рискуя подхватить наводки.
Результат — поток 24-битных чисел, выходящих по цифровому протоколу I2S (Inter-IC Sound): никакого аналогового сигнала наружу микрофона вообще не выходит.
3. Протокол I2S: три провода, одна идея
I2S передаёт поток аудиосэмплов тремя линиями одновременно:
| Линия | Роль |
|---|---|
| SCK (BCLK) | Тактовый сигнал — один импульс на каждый бит данных |
| WS (LRCLK) | Word Select — high/low, показывает, какой сейчас слот: левый или правый |
| SD (DOUT) | Сами биты данных, синхронно с SCK |
Конфигурация этих трёх линий в коде — Inmp441::begin(): драйвер
создаёт I2S-канал в режиме приёмника (I2S_ROLE_MASTER — ESP32 сам генерирует тактовый сигнал
для микрофона) и описывает распиновку в i2s_std_config_t::gpio_cfg
(Inmp441.cpp:16-24).
INMP441 не имеет входа для звука — только выход, поэтому dout в конфигурации ESP32 не
используется (I2S_GPIO_UNUSED), а данные идут только по din.
Зачем нужен L/R и что такое “слот”
I2S исторически проектировался для стерео: в каждом кадре WS отводит время сначала левому
каналу, потом правому. INMP441 — моно-микрофон, но должен как-то вписаться в этот стереоформат,
поэтому пин L/R говорит ему, в какой из двух слотов класть свои данные (см. подробности и
таблицу — WIRING.md). В коде это выбирает
slot_mask.
4. Частота дискретизации и теорема Найквиста
АЦП не пишет непрерывную кривую — он берёт мгновенные “снимки” давления через равные
промежутки времени. Число снимков в секунду — частота дискретизации
(sample_rate в Inmp441.h:24, по умолчанию 16000 Гц).
Теорема Котельникова-Найквиста: чтобы правильно восстановить волну частотой f, нужно делать не меньше 2f снимков в секунду. При 16000 Гц дискретизации корректно различимы частоты до 8000 Гц (частота Найквиста) — этого достаточно для речи (до ~4 кГц), но недостаточно, например, для верхних гармоник тарелок ударной установки (может доходить до 15-20 кГц). Если в звуке есть частоты выше половины частоты дискретизации, они не пропадают, а искажённо “складываются” обратно в слышимый диапазон — это называется алиасинг (aliasing).
5. От 24 бит к 16: что делает toSample16()
INMP441 кладёт данные в 32-битное слово так: 24 значащих бита выровнены по старшим разрядам,
младшие 8 бит — нули (формат I2S_DATA_BIT_WIDTH_32BIT с MSB-выравниванием, настроено в
Inmp441.cpp:15). Схематично 32-битное слово выглядит так:
[ 24 бита данных микрофона ][ 8 нулевых бит ]
биты 31..8 биты 7..0Inmp441::toSample16() сдвигает слово на 16 бит вправо, оставляя
старшие 16 бит исходных данных:
raw_word >> 16 → [ 16 старших бит из 24 ]Младшие 8 бит из 24 при этом отбрасываются — компонент жертвует частью точности (16 бит вместо
24), чтобы формат сразу подходил для Serial Plotter Arduino IDE (который понимает int16_t) и
для стандартного 16-битного WAV/PCM, с которым работает большинство простых Python-библиотек.
16 бит дают 65536 уровней амплитуды — с большим запасом достаточно для учебной визуализации.
6. Почему нет абсолютных дБ SPL
В профессиональной акустике громкость измеряют в дБ SPL (Sound Pressure Level) — абсолютной шкале относительно порога слышимости (20 мкПа). Даташит INMP441 приводит чувствительность −26 дБFS при 94 дБ SPL (тон 1 кГц, эталонный источник) — то есть у конкретного откалиброванного экземпляра эти два значения связаны.
Этот компонент не выполняет такую калибровку — ни один экземпляр модуля не проверялся эталонным источником звука. Поэтому во всех графиках и в тестовом стенде используется только относительная шкала:
- LSB (least significant bit) — то же самое “число из АЦП”, 16-битное значение от −32768 до
32767 после
toSample16(). - дБFS (dB Full Scale) — логарифмическая шкала относительно максимума этой 16-битной шкалы
(32767 = 0 дБFS). Используется в
main.cppдля метра громкости и показывает, насколько сигнал близок к клиппингу (переполнению), а не абсолютную громкость в паскалях.
Если понадобится настоящий дБ SPL — потребуется калибровка каждого физического экземпляра по эталонному источнику известной громкости (например, калибратору 94 дБ SPL/1 кГц) и корректировка формулы в коде под измеренное смещение.
7. Спектр и преобразование Фурье
Осциллограмма показывает звук во времени — как давление меняется мгновение за мгновением. Но любой сложный звук на самом деле состоит из наложения нескольких простых синусоид разной частоты и амплитуды (гармоник). Преобразование Фурье — математический инструмент, раскладывающий сложную волну на эти составляющие: превращает график “амплитуда от времени” в график “амплитуда от частоты” — спектр.
- Чистый тон (свист, камертон) даёт один острый пик в спектре.
- Голос даёт несколько пиков — форманты, определяемые резонансами голосового тракта; их расположение отличает гласные звуки друг от друга и делает голос каждого человека узнаваемым.
- Хлопок или стук — короткий импульс во времени превращается в широкий, размазанный по всем частотам спектр (чем короче импульс во времени, тем шире его спектр — фундаментальное свойство преобразования Фурье).
Python-визуализатор (tools/visualizer.py) считает спектр функцией
numpy.fft.rfft (быстрое преобразование Фурье для вещественного сигнала) и рисует три
синхронных графика: осциллограмму, спектр текущего окна и спектрограмму — как спектр
меняется кадр за кадром, то есть третье измерение (время) добавляется к паре
“частота-амплитуда” через цвет.
8. Почему за звуком не нужно “следить” постоянно: DMA
i2s_channel_read() в Inmp441::read() не “слушает” линию SD
напрямую в момент вызова — ESP32 непрерывно копирует поступающие биты в буфер памяти через
DMA (Direct Memory Access) в фоне, независимо от того, чем занят процессор в этот момент.
read() лишь забирает уже накопленные готовые сэмплы из этого буфера (и ждёт новых до
timeout_ms, если буфер пуст — поэтому вызов всё же блокирующий, просто недолго). Это значит,
что даже если loop() на десятки миллисекунд задержится на Serial.print(), звук не
потеряется — он подождёт в DMA-буфере, пока тот не переполнится.
🔌 Подключение: ESP32 DevKit v1 + INMP441
Таблица подключения
| INMP441 | ESP32 DevKit v1 | Назначение |
|---|---|---|
| VDD | 3.3V | Питание. Только 3.3V — модуль не 5V-толерантен, INMP441 рассчитан на 1.8–3.3В (datasheet). |
| GND | GND | Земля |
| SD | GPIO32 | Serial Data — выход 24-битных сэмплов |
| WS | GPIO25 | Word Select (LRCLK) — определяет, в каком слоте (левом/правом) сейчас данные |
| SCK | GPIO26 | Serial Clock (BCLK) — тактовый сигнал для каждого бита данных |
| L/R | GND или 3.3V | Выбор стереослота — см. ниже |
| NC (2 пина) | не подключать | Зарезервированы производителем |
Пины GPIO25/26/32 заданы по умолчанию в Inmp441.h, Config — измените их
там или передайте свою Inmp441::Config в конструктор, если разводка другая.
L/R: выбор канала
INMP441 — моно-микрофон, но передаёт данные в одном из двух стереослотов I2S в зависимости от напряжения на пине L/R:
| L/R | Слот на шине I2S | Channel в коде |
|---|---|---|
| GND | LEFT | Inmp441::Channel::Left (значение по умолчанию) |
| VDD / 3.3V | RIGHT | Inmp441::Channel::Right |
Это стандартная логика по даташиту INMP441 — L/R не меняет ничего в самом звуке, только то, в
каком из двух слотов I2S-кадра микрофон кладёт свои данные. Если подключили L/R к 3.3V, а в
коде оставили Channel::Left (или наоборот), mic.read() будет исправно возвращать ESP_OK, но
все сэмплы окажутся нулевыми — микрофон отдаёт данные в слот, который драйвер не слушает.
Если после сборки в режиме метра громкости (см. README.md) вы видите только
peak=0 rms=0.0, а isAlive=1 — это первое, что нужно проверить: соответствие пина L/R и
поля Config::channel.
Проверка перед первым включением
- Мультиметром между VDD и GND — должно быть 3.2–3.4В. Не 5В.
- L/R подключен либо к GND, либо к 3.3V (не оставлен “в воздухе” — плавающий вход даст непредсказуемый слот).
- Все 6 сигнальных линий (VDD, GND, SD, WS, SCK, L/R) на своих местах, NC-пины не подключены.
Если нужны другие GPIO
INMP441 не требует конкретных номеров пинов — I2S на ESP32 может быть переключён почти на любые GPIO. Не годятся:
GPIO0,GPIO2— участвуют в загрузке платы (bootstrapping).GPIO6–11— заняты встроенной Flash-памятью.GPIO34–39— только вход, без подтяжки; для SCK/WS (выходы ESP32 → микрофон) не подойдут, но теоретически годятся для SD (вход в ESP32).
Методическое пособие: урок «Как компьютер слышит звук» на INMP441
Стенд: ESP32 + Inmp441 (цифровой MEMS-микрофон) + метр громкости в Serial Monitor +
Python-визуализатор tools/visualizer.py (осциллограмма, спектр,
спектрограмма в реальном времени). Пособие связывает показания реального микрофона с темами
физики (механические волны, звук) и информатики (аналого-цифровое преобразование, Фурье-анализ)
8–11 класса.
Рассчитано на 2 урока по 40–45 минут: первый — физика звука и как микрофон превращает давление воздуха в числа; второй — спектральный анализ и преобразование Фурье. Уроки можно провести отдельно или подряд как один расширенный блок.
Кто чем пользуется
- Инженер собирает схему по WIRING.md (главное — не перепутать пин L/R, см.
там же), прошивает
src/main.cpp, один раз ставит зависимости Python (pip install -r tools/requirements.txt, см. README.md). - Учитель на уроке открывает Serial Monitor (метр громкости — сразу видно, жив ли
микрофон) и/или запускает
python3 tools/visualizer.pyдля графиков — заходить в код не обязательно.
Что уже готово, а что придётся включить на уроке
| Что | Как включить | Комментарий |
|---|---|---|
| Метр громкости (пик/RMS/дБFS) | Работает сразу после прошивки, Serial Monitor 921600 бод | Не требует Python — минимальный вариант для урока без компьютера с графикой |
| Serial Plotter (сырая волна) | Отправить p в Serial Monitor | Встроенный в Arduino IDE график, без установки Python |
| Три графика (осциллограмма/спектр/спектрограмма) | python3 tools/visualizer.py, стенд в режиме Plotter (p) | Главный инструмент для Урока 2 |
Урок 1. Звук — это волна, а микрофон — линейка для воздуха
Тема: механические волны, звуковое давление, аналого-цифровое преобразование, частота дискретизации.
Ход работы.
- Включить стенд, открыть Serial Monitor — на экране бежит метр громкости
(README.md, “Тестовый стенд”):
[-18dBFS] peak= 4200 rms=3120.4 isAlive=1 ############## - Постучать пальцем по корпусу микрофона рядом с отверстием мембраны —
peakи число#резко подскочат. Замолчать всем классом на 10 секунд — посмотреть на показания в тишине (они не будут нулевыми — см. шаг 4). - Сказать по очереди несколько имён — заметить, что
peakразный у разных голосов и разной громкости речи. - Вопрос классу: «Если в классе никто не говорит, почему
rmsне показывает ровно 0?» — разбор в THEORY.md, раздел 2: даже полная тишина содержит слабый электронный шум самого микрофона и едва слышный шум помещения (вентиляция, соседние комнаты) — абсолютной тишины физически не бывает.
Разбор. Звук — волна давления воздуха (THEORY.md, раздел 1).
Мембрана INMP441 физически прогибается под этим давлением, а встроенный 24-битный АЦП
оцифровывает прогиб 16000 раз в секунду — это и есть частота дискретизации
(THEORY.md, раздел 4). Число peak в
метре — это амплитуда, dBFS — насколько сигнал близок к “потолку” 16-битной шкалы; это не
абсолютная громкость в децибелах, которую печатают на коробках от колонок (объяснение —
THEORY.md, раздел 6) — важно не путать эти две вещи
с учениками.
Практическое задание. Найти для класса три источника звука разной громкости (шёпот, обычная
речь, хлопок в ладоши на расстоянии 1 м) и записать peak/dBFS для каждого. Построить
таблицу и обсудить: во сколько раз отличаются числа peak при том, что на слух хлопок кажется
“не в 10 раз громче” шёпота — повод поговорить о том, что человеческое восприятие громкости
нелинейно (отсюда и логарифмическая шкала дБ в технике).
Урок 2. Из чего состоит звук: преобразование Фурье
Тема: спектральный анализ, гармоники, форманты речи, преобразование Фурье.
Подготовка: запустить python3 tools/visualizer.py (см.
README.md, “Python-визуализатор”), стенд переключить в режим
Plotter клавишей p. На экране — три синхронных графика: осциллограмма, спектр, спектрограмма.
Ход работы.
- Кто-то из класса свистит одной ровной нотой несколько секунд. Все смотрят на график — осциллограмма превращается в почти идеальную синусоиду, а на спектре появляется один острый узкий пик.
- Тот же ученик произносит гласный звук “А-А-А” на той же громкости. Осциллограмма становится “рваной” и сложной, а на спектре — сразу несколько пиков (форманты).
- Хлопнуть в ладоши один раз. Осциллограмма — короткий острый импульс; спектр в этот момент — широкий, размазанный по всей ширине графика.
Разбор. Преобразование Фурье раскладывает сложную волну на сумму простых синусоид разных частот — график “давление от времени” превращается в график “энергия от частоты” (THEORY.md, раздел 7). Свист близок к одной чистой синусоиде — поэтому один пик. Голос — наложение нескольких резонансов голосового тракта (форманты) — поэтому несколько пиков, и именно их расположение делает голоса разных людей узнаваемыми. Хлопок — очень короткий во времени сигнал, а преобразование Фурье гарантирует: чем короче сигнал во времени, тем шире его спектр по частоте — фундаментальный факт, а не особенность конкретного микрофона.
Про частоту Найквиста. При частоте дискретизации 16000 Гц корректно различимы частоты только до 8000 Гц (THEORY.md, раздел 4) — это видно на графике спектра: он обрывается на середине оси частот, а не продолжается до бесконечности. Попросите класс попробовать свистеть максимально высоко — пик на спектре не может уйти правее этой границы.
Практическое задание. Каждый ученик по очереди произносит гласные “А”, “О”, “У” одинаковой громкости, класс фотографирует/зарисовывает форму спектра для каждой. Сравнить: у всех ли учеников гласный “А” даёт пики в одних и тех же местах, или узор индивидуален — обсудить, как этот принцип используется в распознавании речи и биометрии по голосу.
Приложение: тайминг и оборудование
| Урок | Длительность | Обязательное оборудование | Предмет |
|---|---|---|---|
| 1. Звук — это волна | 40–45 мин | Стенд, Serial Monitor (компьютер с Arduino IDE/PlatformIO) | Физика |
| 2. Преобразование Фурье | 40–45 мин | Стенд + Python-визуализатор (tools/visualizer.py) | Физика, информатика |
Оба урока требуют тихого помещения хотя бы на пару минут для демонстрации шума тишины (Урок 1, шаг 2) — по возможности проводите в кабинете, где можно ненадолго попросить класс замолчать.
Презентация: цифровой MEMS-микрофон INMP441
Слайд 1: Что это
INMP441 — цифровой микрофон: звук оцифровывается 24-битным АЦП прямо на кристалле микрофона и передаётся по интерфейсу I2S. Никакого аналогового сигнала наружу не выходит — в отличие от привычных электретных микрофонов.
Слайд 2: Характеристики (по даташиту)
- Интерфейс: I2S, 24 бита.
- Диапазон частот: 60 Гц — 15 кГц.
- SNR: 61 дБА.
- Питание: 1.8–3.3 В.
- Чувствительность: −26 дБFS при 94 дБ SPL / 1 кГц (заводской эталон, без калибровки конкретного экземпляра не используется в этом проекте — см. THEORY.md).
Слайд 3: Путь сигнала
Мембрана колеблется от звукового давления → встроенный АЦП оцифровывает → I2S передаёт поток
24-битных слов на ESP32 → DMA копирует их в буфер без нагрузки на процессор → Inmp441::read()
забирает готовый блок для обработки.
Слайд 4: Что видно на экране
- Метр громкости прямо в Serial Monitor — пик, RMS, дБFS, статус связи (
isAlive()). - Осциллограмма — звук во времени.
- Спектр (БПФ) — из каких частот состоит звук.
- Спектрограмма — как спектр меняется во времени.
Слайд 5: Где такое применяется
- Голосовые ассистенты и распознавание речи.
- Анализаторы шума и спектра.
- Любое устройство, слушающее мир: от домофонов до акустических датчиков разбитого стекла.