Громкий зуммер с маркетплейса, подписанный «95 дБ, 5 В», я в первый раз воткнул в плату как светодиод из первого урока: плюсом в пин D8, минусом в GND, без резисторов. Завыл он во весь голос — секунд десять, потому что потом плата ушла в перезагрузку, а ещё через вечер пин D8 стал выдавать 3,7 В вместо пяти, и светодиод на нём уже не загорался. Продавец не врал: деталь была громкая, а значит прожорливая — свои 95 дБ она набирала током за сотню миллиампер, который пин отдать физически не может. Тонкая пьезо-пищалка из стартового набора при этом годами живёт на пине без последствий, и разница между этими двумя деталями стоит одного вечера с даташитом.
Этот урок — про электрику звука, а не про ноты: саму механику tone() и noTone(), beep, сирену и двухтональную тревогу я уже собирал в уроке про пьезозуммер. Здесь обратная сторона: чем активный зуммер отличается от пассивного по схеме включения (у них даже полярность работает по-разному), почему пьезо-излучателю хватает пина, а громкому корпусу нужен транзистор, и какие точные границы у аргумента частоты — от неслышимых 20 герц до потолка 65535 Гц.
Две породы — две схемы включения
Разделить зуммеры на породы я научился тестом из прошлого урока: 5 В напрямую — запищал сам, значит активный. Для схем важнее другое следствие этого теста. Пассивный излучатель — диск пьезокерамики на металлической мембране, и по электрике он ведёт себя как конденсатор: внутри нет ни генератора, ни обвязки, поэтому полярность не критична — перепутаете ножки, потеряете немного громкости и всё. Активный корпус — уже прибор: внутри сидит генератор с транзисторной обвязкой, и вот её переполюсовка убивает молча и навсегда. Симптом один — идеальная тишина при живом скетче.
Схемы у пород разные. Пассивному нужен прямоугольник от tone() — он сажается на цифровой пин (у меня D8) через резистор 100 Ом, второй ножкой в GND. Активному частота безразлична: он пищит от постоянного питания, поэтому его включают как нагрузку — 5 В и GND, а щёлкают по нему транзисторным ключом, разрывая минусовую ветку. Повесить активный зуммер на пин напрямую можно, пока ток корпуса держится в 20-30 мА; корпуса мощнее идут только через ключ, и дальше я объясню, почему граница ровно там.
| Деталь | Ток | Схема включения | Пригодится для |
|---|---|---|---|
| Пьезо-излучатель из набора | 20-30 мА | пин D8, резистор 100 Ом, минус в GND | мелодии, beep, сирена — весь цикл этих уроков |
| Активный зуммер 5 В | 25-30 мА | пин через ключ, зуммер между 5 В и коллектором | сигнализация: пищит сам, пин только включает |
| Громкий корпус 90+ дБ | 80-150 мА | только транзисторный ключ, напрямую нельзя | сирена на улицу, звонок через дверь |
| Динамик 8 Ом | сотни мА | напрямую нельзя: нужен усилитель | настоящий звук, но это другой проект |
Ток: почему пьезо прощает, а громкий корпус нет
Пин Uno отдаёт до 40 мА на одну ножку, но даташит ATmega сразу оговаривает: комфортный режим — вдвое меньше, около двадцати. Пьезо-излучатель со своими 20-30 мА влезает в этот бюджет впритык, и резистор 100 Ом здесь не украшение, а страховка: он подрезает пиковый ток заряда ёмкости керамики, съедая при этом копейки громкости. Ставить больше 220 Ом я не советую — на 470 Ом пищалка заметно сядет голосом и мелодия станет бубнить.
Корпус с током за сотню миллиампер в бюджет пина не влезает никак: ножка перегревается, 5 В на плате проседает, и плата уходит в перезагрузки — ровно мой сценарий из первого абзаца. Лечение одно: транзисторный ключ, где пин управляет базой через резистор 1 кОм, а зуммер питается от 5 В по толстой дорожке. Такой ключ мы собирали на 2N2222 в уроке про транзистор — для зуммера он подключается один в один, только вместо мотора в коллектор встаёт пищалка.
Считайте и общий бюджет платы, а не только одну ножку. Даташит ATmega328P кладёт потолок в 200 мА на весь чип суммарно: пины, подсветка экрана, регулятор — всё из одной копилки. Один зуммер на 30 мА там теряется, но если рядом уже висят пара ярких светодиодов, сервопривод со своей сотней миллиампер в пике и дисплей с подсветкой, пьезо вешается на пин последним — и первым же переезжает на транзистор. Мой порядок сборки сложных макеток: сначала посчитать по строке на потребителя, потом воткнуть провода, а не наоборот.
const int BUZZER = 8; void setup() { pinMode(BUZZER, OUTPUT); Serial.begin(9600); Serial.println("Probnik tonov: 440, 1000, 2000");} void loop() { tone(BUZZER, 440); // играет, пока не скажешь Serial.println("ton=440"); delay(800); noTone(BUZZER); // ручная остановка delay(400); tone(BUZZER, 1000); Serial.println("ton=1000"); delay(800); noTone(BUZZER); delay(400); tone(BUZZER, 2000, 300); // третий аргумент: затихнет сам Serial.println("ton=2000"); delay(1200);}Аргумент частоты в tone() — целое число в герцах: tone(8, 440) дёргает пин вверх-вниз 440 раз в секунду. Внутри ядра частота живёт в unsigned int — 16 бит без знака, отсюда честный потолок 65535 Гц: больше компилятор просто не примет. Второй момент, который экономит нервы: звук не заканчивается сам — tone(BUZZER, 440) играет до noTone(BUZZER) или до отбоя по третьему аргументу в миллисекундах, который снимает звук силами таймера, не останавливая скетч. В пробнике выше оба способа подряд: первые две пробы гасятся руками, третья — сама.
Второе ограничение держите в голове при любой мысли об аккорде: звуковой таймер на Uno один, поэтому tone умеет ровно одну ноту за раз — и на одном пине, и на всей плате сразу. tone(8, 440), следом tone(9, 660) — второй вызов снимет первый, никакого аккорда не выйдет. Отсюда же привычка для отладки: если в журнале частоты прыгают, а звук стоит один — ищите второй вызов tone в другой ветке скетча. Кстати, beep-подтверждение на нажатие кнопки собирается из этого же пробника одной строкой — механика digitalRead разобрана в уроке про кнопку.
И про выбор пина, раз это урок про подключение. tone() живёт на любом цифровом пине от 2 до 13, но мои ходовые D2 и D3 уходят под кнопки и прерывания, D0 и D1 молча держат Serial, а на D13 висит бортовой светодиод, который мигает вместе с каждым тоном и путает отладку. Поэтому зуммер по умолчанию у меня на D8 — обычный пин без черты и без соседей, и в этих уроках он переезжает с места на место ровно один раз: никогда.
Границы частоты: что слышно, что играется, что молчит
Слух взрослого человека тянет от 20 Гц до 20 кГц, и оба края — теоретические: верх ползёт вниз с годами, к сорока — до 15-16 кГц, а ниже 50 Гц пьезокерамика не звучит в принципе, мембране маловато. tone() при этом играет и то, что ухо не слышит: от 20 кГц до потолка 65535 Гц идёт ультразвуковая зона — скетч «работает», зуммер молчит, и новичок два часа ищет обрыв провода. Собаки слышат до 40-45 кГц, поэтому «невидимые» частоты — не мусор: отпугиватели собирают именно там. Мой тест на живой плате: tone(BUZZER, 30000) — прибор должен молчать; услышали писк, значит рука дрогнула и влезла лишняя цифра.
Вторая граница — таймерная. Timer2, который генерирует волну, делит ресурсы с ШИМ пинов 3 и 11: пока играет мелодия, analogWrite на этих двух пинах молчит — я подробно разбирал это в уроке про ШИМ. Пины 5, 6, 9 и 10 сидят на других таймерах и мелодий не замечают. И последнее: между слышимым и играбельным лежит резонанс корпуса, у пьезо обычно 2-4 кГц — там излучатель орёт громче всего, поэтому частоты сигнализаций выбирают не из эстетики, а из физики.
- Активный зуммер пищит от постоянного питания и включается ключом; пассивному нужен tone() — по электрике это конденсатор с мембраной, полярность у него не критична
- Пин отдаёт 40 мА, комфорт — 20: пьезо на 20-30 мА живёт на пине через 100 Ом, корпус за сотню миллиампер — только через транзистор 2N2222
- tone(pin, freq) — частота в герцах, потолок аргумента 65535 Гц; звук снимают noTone() или третьим аргументом в миллисекундах
- Одна нота за раз: таймер один на всю Uno, а Timer2 заодно глушит ШИМ на пинах 3 и 11
- Слух — 20 Гц-20 кГц; выше, до 65535 Гц, tone() играет ультразвук, который ухо не слышит, а собаки слышат
- 1. Каков потолок аргумента частоты в tone() на Uno?
- 2. Как подключают тонкий пьезо-излучатель с током 20-30 мА к пину D8?
- 3. У активного зуммера с генератором внутри перепутали плюс и минус. Что будет?
- 4. Сколько нот tone() может играть одновременно?
- 5. Пока играет мелодия через tone(), что случилось с analogWrite на пине 3?
Частые вопросы по теме урока
- Каков потолок аргумента частоты в tone() на Uno?
- Частота в tone() живёт в unsigned int, 16 бит без знака: потолок 65535 Гц. Зона выше 20 кГц играется, но не слышна — это ультразвук. 65535 Гц — аргумент хранится в unsigned int
- Как подключают тонкий пьезо-излучатель с током 20-30 мА к пину D8?
- Резистор 100 Ом подрезает пиковый ток заряда керамики, почти не съедая громкость. Транзистор нужен корпусам с током за сотню миллиампер, не пьезо-пищалке. через резистор 100 Ом последовательно
- У активного зуммера с генератором внутри перепутали плюс и минус. Что будет?
- Пассивный излучатель — конденсатор, ему всё равно. У активного внутри генератор с обвязкой, и обратная полярность убивает её молча и навсегда. замолчит навсегда: электроника внутри переполюсовки не переживает
- Сколько нот tone() может играть одновременно?
- Звуковой таймер на Uno один: новый вызов tone снимает предыдущий тон, где бы он ни играл. Для аккордов нужен второй генератор — другой чип или внешняя деталь. одну — и на одном пине, и на всей Uno сразу
- Пока играет мелодия через tone(), что случилось с analogWrite на пине 3?
- Timer2 один и на tone, и на ШИМ пинов 3 и 11. Пины 5, 6, 9 и 10 сидят на других таймерах и во время мелодий работают как работали. замолчал: tone занял Timer2, который кормит ШИМ пинов 3 и 11