Пассивный бузер
Звуковой излучатель без встроенного генератора: сам по себе молчит даже под
постоянным напряжением. Чтобы зазвучал, нужен переменный сигнал нужной
частоты — за это отвечает tone(pin, frequency).
🔊 Пассивный бузер
Пассивный бузер — это звуковой излучатель без встроенного генератора: сам по себе он
молчит, даже если подать на него постоянное напряжение. Чтобы он зазвучал, нужно подать
на управляющий вывод переменный сигнал нужной частоты — за это отвечает функция Arduino
Core tone(pin, frequency). Этим он отличается от активного бузера, которому для звука
достаточно простого digitalWrite(); подробнее — в THEORY.md.
Раз частоту можно менять, пассивный бузер умеет больше, чем один фиксированный тон: сирена из двух чередующихся частот, писки на разной высоте и т.д.
📋 Навигация
| Файл | Что внутри |
|---|---|
| WIRING.md | Схема подключения через транзистор/MOSFET |
| THEORY.md | Физика звука, функция tone(), разбор паттернов |
| PREZ.md | Презентация модуля — 5 тезисов для урока |
🛠 Состав компонента
include/PassiveBuzzer.h— интерфейс класса драйвера.src/PassiveBuzzer.cpp— машина состояний неблокирующих сигналов.src/main.cpp— тестовый стенд с управлением по Serial.
Почти весь API неблокирующий (turnOn(), playSiren(), playBeepTriple()) — сигнал
играет, пока loop() продолжает опрашивать датчики. Исключение — beepBlocking():
она намеренно блокирующая и предназначена только для короткого сигнала на старте
программы (когда ещё нечему мешать), не для использования во время основной работы.
🚀 Сборка и прошивка (PlatformIO)
cd Components/PassiveBuzzer
pio run -t upload && pio device monitorПо умолчанию используется GPIO 15 (см. BUZZER_PIN в main.cpp) —
поменяйте на свой пин при необходимости.
Команды тестового стенда
1— короткий писк 2000 Гц, 100 мс (блокирующий,beepBlocking)2— непрерывный тон 1500 Гц3— паттернSiren(сирена)4— паттернBeepTriple(три коротких писка)0— выключить всё
🔊 Теория: пассивные бузеры и генерация звука
1. Активный vs пассивный бузер
- Активный бузер: внутри уже есть генератор. Подать постоянное напряжение — он сам издаёт звук фиксированной частоты.
- Пассивный бузер (динамик/пьезоэлемент): генератора внутри нет. Чтобы он зазвучал, на управляющий вывод нужно подавать переменный сигнал (меандр) нужной частоты. Зато можно менять частоту и играть разные тона — этим и пользуется этот драйвер.
2. Физика звука
Звук — механическая волна. Частота этой волны (в Герцах, Гц) определяет высоту звука:
- Низкие частоты (100–500 Гц): басовые, глухие звуки.
- Средние частоты (1000–3000 Гц): наиболее слышимые человеческим ухом (сирены, звонки).
- Высокие частоты (>5000 Гц): писк, свист.
3. Метод генерации: функция tone()
Arduino Core предоставляет функцию tone(pin, frequency) — она сама генерирует на
указанном пине прямоугольный сигнал (меандр) с заполнением 50% на заданной частоте,
не занимая процессор построением сигнала вручную. Останавливает генерацию noTone(pin).
В коде драйвера это tone()/noTone() в
PassiveBuzzer.cpp — например, turnOn()
(PassiveBuzzer.cpp:19-27).
4. Как драйвер строит паттерны поверх tone()
Оба паттерна реализованы без delay() — через машину состояний в
update(), которая на каждой итерации loop()
сравнивает millis() с моментом последнего переключения:
Pattern::Siren(PassiveBuzzer.cpp:56-63) — чередование двух контрастных частот,kSirenHighHz(1200 Гц) иkSirenLowHz(800 Гц), каждыеkSirenSwitchMs(150 мс) — см. PassiveBuzzer.h:73-75. Пока не вызовутturnOff().Pattern::BeepTriple(PassiveBuzzer.cpp:65-74) — три коротких писка на частотеkBeepTripleFreqHz(2000 Гц) поkBeepTriplePulseMs(100 мс), затем автоматическое выключение.
Частоты и интервалы — не характеристика конкретного бузера из даташита, а методический выбор: 800/1200 Гц хорошо различимы на слух и создают узнаваемый эффект сирены.
5. Блокирующий помощник beepBlocking()
В отличие от остального API, beepBlocking() (PassiveBuzzer.cpp:11-17)
использует delay() и останавливает программу на время сигнала. Это осознанное
исключение: он предназначен только для короткого сигнала при старте программы
(“устройство готово”), пока ещё нечему мешать. Использовать его в loop() во время
основной работы не стоит — для этого есть неблокирующие turnOn()/playSiren()/playBeepTriple().
6. Почему нет isAlive()
У пассивного бузера, как и у активного, нет канала обратной связи — только исходящий
сигнал tone(). Программно узнать, оборван ли провод или неисправен ли сам излучатель,
невозможно — это физическое ограничение схемы (см. @note в
PassiveBuzzer.h:27-30).
🔌 Схема подключения пассивного бузера
1. Подключение через транзистор (рекомендуется)
Микроконтроллер (ESP32) не может выдать большой ток, поэтому бузер стоит подключать через NPN-транзистор или MOSFET, а не напрямую к пину:
+3.3V / +5V
│
[BUZZER]
│
[Collector / Drain]
│
[ Пин ]──[Resistor 1k]──[ Base / Gate ]
│
[Emitter / Source]
│
GNDПин управляет не самим бузером, а транзистором — ток через GPIO остаётся маленьким.
Здесь предполагается обычный пьезоэлемент (типичный для управления через
tone(), как в этом драйвере) — у него нет катушки, поэтому защитный диод для гашения обратных импульсов тока не нужен. Диод-flyback нужен только для электромагнитных (катушечных) зуммеров — если в вашем комплекте именно такой, добавьте его параллельно обмотке.
2. Прямое подключение (только для маломощных пьезоэлементов)
| Пин бузера | Пин ESP32 | Описание |
|---|---|---|
| (+) Positive | GPIO 15 | Сигнал управления |
| (-) Negative | GND | Общий провод |
При прямом подключении обязательно используйте токоограничивающий резистор — ориентировочно 100–220 Ом (без даташита конкретной модели пьезоэлемента точное значение не гарантировано, подбирайте по факту используемого бузера).
Методический план урока: пассивный бузер, частота и высота звука
Паспорт урока
| Параметр | Значение |
|---|---|
| Место в курсе | Components, сразу после ActiveBuzzer |
| Длительность | 45 мин (или 2 × 45 с музыкальным блоком) |
| Возраст | 12–16, материал двухуровневый |
| Оборудование | ESP32, пассивный бузер, транзистор по WIRING.md, макетка — на пару |
| Предварительные знания | Урок про активный бузер; millis(); понятие частоты желательно |
| Предмет | Физика (колебания, частота), математика (пропорции, логарифмы — для уровня C), музыка |
Образовательные цели
По итогам урока ученик умеет:
| № | Цель | Блум | Миллер | Чем доказывается |
|---|---|---|---|---|
| 3.1 | Связать число в коде с высотой слышимого звука | понимать | делает | Предсказывает «выше/ниже» до запуска |
| 3.2 | Подобрать частоты для узнаваемого сигнала (сирена) | применять | делает | Сирена звучит как сирена |
| 3.3 | Объяснить, почему пассивному бузеру нужен tone(), а активному нет | понимать | знает как | Устный ответ через генератор |
| 3.4 | Сыграть последовательность нот по таблице частот | применять | делает | Узнаваемая мелодия |
| 3.5 | Обосновать, где уместен блокирующий сигнал, а где нет | анализировать | показывает как | Разбор beepBlocking() |
Чего на этом уроке делать НЕ надо. Не выводить формулу частоты нот (
f = 440 · 2^(n/12)) для всех — это материал уровня C. Не углубляться в устройство таймеров ESP32. Главное переживание урока: число в коде превращается в высоту звука, и это слышно.
Что должно быть готово заранее
- Схема собрана и проверена — та же, что у активного бузера, с транзистором
- Рядом лежит активный бузер для сравнения
- Распечатана таблица частот нот (до первой октавы — до второй)
- Проверено звучание
SirenиBeepTripleна реальной плате - Если есть — настроенный музыкальный инструмент или тюнер в телефоне для сверки
Полезный реквизит. Приложение-тюнер на телефоне превращает урок в измерительный: дети задают 440 Гц и видят на экране ноту «ля». Совпадение кода и физического мира производит сильное впечатление.
Сценарий занятия (45 минут)
| Время | Блок | Что делает педагог | Что делают ученики |
|---|---|---|---|
| 0–5 | Завязка | Возвращает загадку молчащего бузера | Вспоминают вывод прошлого урока |
| 5–12 | Теория частоты | Ведёт от колебаний к числу в коде | Предсказывают высоту звука |
| 12–20 | Первые тоны | Показывает tone() | Подбирают частоты, слушают |
| 20–28 | Паттерны | Демонстрирует Siren, BeepTriple | Разбирают, из чего сделана сирена |
| 28–38 | Практика | Раздаёт задания по уровням | Делают мелодию или сигнал |
| 38–45 | Итог и ДЗ | Фиксирует связь число ↔ высота | Записывают в журнал |
Ключевой методический принцип — предсказание до прослушивания. Каждый раз, прежде чем запустить новую частоту, ученик вслух говорит: «будет выше» или «будет ниже». Ошибка в предсказании ценнее правильного ответа — она показывает, что модель ещё не построена.
Блок 1. Завязка (0–5 мин)
Вернуть на стол бузер, который на прошлом уроке «не работал».
«В прошлый раз он молчал, и мы решили, что дело в отсутствии генератора внутри. Сегодня мы станем этим генератором. Вопрос: что именно нужно ему подавать?»
Довести до формулировки: не постоянное напряжение, а переменное — то включать, то выключать, много раз в секунду. И тогда сразу следующий вопрос:
«Сколько раз в секунду? От чего это зависит?»
Это и есть тема урока.
Блок 2. Теория: частота и высота (5–12 мин)
2.1. Базовый уровень (12–14 лет)
Демонстрация без кода: провести пальцем по зубцам расчёски медленно, потом быстро.
«Что изменилось в звуке? Сама расчёска та же.»
Ответ: скорость → высота. Записать правило:
Чаще колебания — выше звук. Реже — ниже. Число колебаний в секунду называется частотой и измеряется в герцах (Гц).
Ориентиры, которые стоит дать на доску (из THEORY.md, раздел 2):
| Частота | Как звучит | Пример |
|---|---|---|
| 100–500 Гц | низко, глухо | мужской голос, бас |
| 1000–3000 Гц | звонко, пронзительно | звонок, сирена |
| выше 5000 Гц | писк, свист | комар, сигнал микроволновки |
2.2. Углублённый уровень (14–16 лет)
Добавить количественную связь:
«Ля первой октавы — 440 Гц. Ля следующей октавы — 880 Гц. Заметили закономерность?»
Довести до вывода: октава — это удвоение частоты. Отсюда важное следствие:
Высота воспринимается не линейно, а по отношению. Разница между 100 и 200 Гц слышится так же, как между 1000 и 2000 Гц, хотя во втором случае разрыв в десять раз больше в герцах.
Это первое в курсе столкновение с логарифмическим восприятием — тем же, что позже встретится в дБм при работе с радиосигналом (FoxHunter). Связь стоит проговорить: ухо и радиоприёмник «считают» одинаково.
Блок 3. Первые тоны (12–20 мин)
Показать вызов tone(pin, frequency) — Arduino сам строит меандр нужной частоты
(см. THEORY.md, раздел 3).
Порядок работы — с предсказанием:
- Задать 440 Гц. Послушать. Если есть тюнер — проверить, что это «ля».
- Предсказать вслух, что будет при 880. Проверить.
- Предсказать, что будет при 220. Проверить.
- Найти границы: с какой частоты уже не слышно? (обычно 15–18 кГц у подростков, у взрослых ниже — это всегда производит впечатление)
Побочный эффект пункта 4. Дети обнаруживают, что слышат то, чего не слышит педагог. Это не повод для беспорядка, а хороший факт: слух с возрастом теряет верхние частоты. Можно предложить измерить порог у всех и построить таблицу.
Блок 4. Паттерны: из чего сделана сирена (20–28 мин)
Запустить Pattern::Siren и задать вопрос до всякого объяснения:
«Сколько разных звуков вы слышите?»
Ответ — два, чередующихся. Открыть THEORY.md, раздел 4 и найти числа: 1200 Гц и 800 Гц, переключение каждые 150 мс.
Затем — эксперимент, который стоит провести обязательно:
| Изменение | Что произойдёт | Вывод |
|---|---|---|
| Сблизить частоты (1000 и 1100) | сирена перестаёт узнаваться | нужен контраст |
| Замедлить переключение (500 мс) | звучит как две отдельные ноты | ритм создаёт образ |
| Ускорить (30 мс) | превращается в дребезг | есть предел восприятия |
Вывод урока: узнаваемый сигнал — это сочетание частот и тайминга, а не одно число.
Блок 5. Практика по уровням (28–38 мин)
Уровень A (базовый)
- Подобрать частоту, которая звучит как «писк микроволновки».
- Сделать сирену «скорой помощи»: подобрать свои две частоты и скорость.
- Сыграть три ноты подряд по таблице частот — любые.
Уровень B (средний)
- Сыграть узнаваемую мелодию из 8–12 нот (гамма, «В траве сидел кузнечик», первые такты чего угодно). Записать частоты в массив. Подсказка: длительность каждой ноты задаётся так же, как интервалы в паттернах.
- Сделать сигнал, высота которого растёт — эффект «взлёта». Подобрать шаг.
- Объяснить письменно, почему
beepBlocking()годится для старта программы, но не годится для работы вloop(). Материал: THEORY.md, раздел 5.
Уровень C (продвинутый)
- Реализовать расчёт частоты ноты по формуле
f = 440 · 2^(n/12), гдеn— номер полутона относительно «ля». Проверить тюнером. - Добавить в
enum class Patternсвой паттерн со сменой частоты по нелинейному закону (например, ускоряющийся сигнал парковочного радара). - Измерить реальную частоту на выходе осциллографом или по спектроанализатору в телефоне. Сравнить с заданной, объяснить расхождение.
Ответы на вопросы, которые прозвучат
«Почему мелодия звучит по-компьютерному, а не как музыка?» Потому что меандр — прямоугольный сигнал, а не синус. В нём много дополнительных гармоник, отсюда «жестяной» тембр. Так звучали игровые приставки 1980-х — и это узнаваемая эстетика, а не дефект.
«Можно сделать громче?»
Громкость почти не управляется через tone() — она задаётся схемой и питанием.
Управлять можно высотой и ритмом. Это ограничение стоит принять как условие задачи.
«А два звука одновременно?» Одним бузером — нет: он воспроизводит одну частоту в момент времени. Аккорд потребует второго бузера и второго таймера. Хороший повод объяснить, что такое полифония.
«Почему 800 и 1200, а не 810 и 1190?» Числа выбраны для наглядности, а не из даташита — об этом прямо сказано в THEORY.md. Полезная привычка: в чужом коде проверять, обоснованы ли константы.
«Бузер может сломаться от высокой частоты?» Нет. Он просто перестанет её воспроизводить эффективно — мембрана имеет свой резонанс, вне которого звучит тихо.
Итог урока: что записать в журнал
- Высота звука задаётся частотой: число в коде → колебания в секунду → тон.
- Октава — удвоение частоты; ухо воспринимает отношения, а не разницу.
- Узнаваемый сигнал строится из контраста частот и ритма.
Проверка понимания (экспресс, 2 минуты)
| Вопрос | Ожидаемый ответ |
|---|---|
| 440 Гц и 880 Гц — что общего на слух? | Та же нота октавой выше |
| Почему активный бузер не сыграет мелодию? | Частота зашита в его генератор |
Что делает noTone()? | Останавливает генерацию, тишина |
Где уместен beepBlocking()? | Короткий сигнал на старте, пока нечему мешать |
Типичные затруднения
| Затруднение | Причина | Что делать |
|---|---|---|
| Путают громкость и высоту | Бытовая речь: «сделай погромче» о высоте | Развести явно: громкость — сила, высота — частота |
| Мелодия «не получается» | Ноты без пауз сливаются | Показать, что тишина между нотами — тоже часть мелодии |
| Числа подбирают наугад | Нет таблицы под рукой | Раздать таблицу частот заранее |
| «Слышу не то, что написал» | Соседняя пара играет своё | Наушники или очередь по рядам |
Домашнее задание
Обязательная часть: записать, какие звуковые сигналы встретились за день (транспорт, техника, телефон), и для каждого определить на слух: один тон или несколько, высокий или низкий, какой ритм.
Уровень A: подобрать по таблице частоты для первых пяти нот знакомой песни и записать их в тетрадь. Проиграть на следующем уроке.
Уровень B: придумать звуковую схему для лифта: приезд, перегруз, авария. Обосновать, почему сигналы не перепутать. Учесть, что перегруз слышат часто, а аварию — редко.
Уровень C: посчитать по формуле частоты всех двенадцати полутонов октавы, сверить с таблицей, объяснить, почему получаются нецелые значения и как это влияет на звучание.
Связь с курсом
| Что дальше | Где |
|---|---|
| Звук как измерительный инструмент | ICS43434, INMP441 — микрофоны |
| Логарифмическое восприятие в радио | FoxHunter — дБм и громкость писка |
| Машина состояний | ActiveBuzzer, LED_middle |
Пара уроков про бузеры закрывает тему исполнительных устройств: плата научилась светить и звучать. Дальше курс переходит к датчикам — плата учится слышать и видеть. Этот переход стоит проговорить: он делит курс пополам.
Чек-лист педагога перед уроком
- Схема собрана,
SirenиBeepTripleпроверены на слух - Таблица частот нот распечатана на каждую пару
- Тюнер установлен на телефоне (для демонстрации 440 Гц)
- Активный бузер под рукой для сравнения
- Продуман порядок прослушивания, чтобы пары не мешали друг другу
- Карточки заданий A / B / C распечатаны
Презентация: пассивный бузер
Слайд 1: Звук любой частоты
В отличие от активного, пассивный бузер не пищит сам — на него подают переменный
сигнал через tone(pin, frequency), поэтому можно менять частоту и высоту звука
(физика — THEORY.md).
Слайд 2: Неблокирующая работа
turnOn(), playSiren(), playBeepTriple() строятся без delay() — через машину
состояний в update(). Звук играет, пока loop()
продолжает опрашивать датчики.
Слайд 3: Одно исключение — beepBlocking()
Этот метод намеренно блокирующий (внутри delay()) и предназначен только для
короткого сигнала при старте программы, когда ещё нечему мешать — см. тестовый
стенд main.cpp, сигнал “устройство готово”.
Слайд 4: Два готовых паттерна
Pattern::Siren— чередование 1200 Гц / 800 Гц каждые 150 мс, доturnOff().Pattern::BeepTriple— три коротких писка подтверждения, затем сам выключается.
Проверить оба можно в тестовом стенде — команды 3/4 в main.cpp.
Слайд 5: Что бузер не умеет
У бузера нет обратной связи — программа не может узнать, оборван ли провод или
работает ли сам излучатель. Поэтому в этом драйвере, как и в активном бузере, нет
isAlive() — подробнее в THEORY.md, раздел 6.