Первый будильник на Arduino я собрал из того, что уже умел: светодиод, резистор, мигание по расписанию. Работал он безупречно — и однажды утром я проспал, а красный огонёк честно моргал мне в лицо минут двадцать. Сигнал для глаз во сне бесполезен: глаза закрыты, и никакая частота мигания этого не исправит. Будит звук, и только звук. В следующий вечер на макетке встал пьезозуммер за сорок рублей из стартового набора, и с тех пор поделки научились разговаривать: пикать на нажатие, пищать перед поливом, выть сиреной при тревоге.
В этом уроке заведём проекту голос: подключим пьезозуммер к пину 8 через резистор 100 Ом, освоим tone() и noTone() — функции, которые играют на любом цифровом пине прямоугольную волну заданной частоты, — и соберём три классических сигнала: короткий beep, ползущую вверх-вниз сирену и двухтональную тревогу с красным маяком. По дороге разберёмся, чем пассивный зуммер отличается от активного (мой первый экземпляр полчаса издевательски пищал одной нотой), почему ШИМ-пины для звука не нужны и как tone делит таймер с analogWrite из урока про ШИМ.
Пьезозуммер: керамика, которая колеблется по команде
Пьезозуммер — диск пьезокерамики, приклеенный к металлической мембране. Подайте на него меняющееся напряжение — керамика то сжимается, то разжимается, мембрана дёргается и толкает воздух: так рождается звук. Внутри нет ни катушки, ни бумажного диффузора, как у настоящего динамика, поэтому деталь ест копейки тока, весит грамм и не боится тряску. Басов не ждите: пьезоизлучатель честно играет от сотен герц до нескольких килогерц и звучит как брелок домофона, но для сигнала тревоги большего и не нужно.
Зуммеры бывают двух пород, и перепутать их — классическая ошибка первых недель. Активный зуммер содержит генератор внутри: подайте 5 вольт — он сам запищит своей частотой, обычно около 2–4 кГц; управлять можно только вкл/выкл, и для этого хватает digitalWrite. Пассивный зуммер — голый излучатель, динамик без усилителя: от питания он молчит и звучит ровно на той частоте, которую вы подадите через tone(). Проверка занимает десять секунд: суньте ножки прямо в 5V и GND — запищал сам, значит активный; тихо щёлкнул при касании — пассивный. Мой первый зуммер для мелодий оказался активным: код менял частоты, звук стоял один и тот же, и полчаса я грешил на провод к пину 8, пока не допёр, что генератор уже сидит внутри детали.
По току пьезозуммер — лёгкая нагрузка: типовые экземпляры едят 20–25 мА. Пин Uno отдаёт до 40 мА, но комфортен вдвое меньший, поэтому в схеме живёт резистор 100 Ом: пиковые токи подрезает, громкость почти не съедает. Подключение: ножку «+» через резистор — на пин 8, ножку «−» — на GND. Полярность у большинства корпусов маркирована; перепутаете — не сгорит, по сути это конденсатор, но громкость осядет. В симуляторе на сайте зуммер не требует проводов: как только скетч вызовет tone(), плата сама подрисует зуммер и провод к его пину.
tone() и noTone(): частота вместо скважности
tone(pin, frequency) запускает на пине прямоугольную волну со скважностью 50% и нужной частотой — и играет её, пока вы не скажете стоп. tone(8, 440) — нота ля первой октавы: та самая, по которой настраивают оркестры. tone(8, 1000) — аккуратный сервисный beep из любой бытовой техники. tone(8, 2000) — резкий писк парктроника, от которого домашние оглядываются через плечо. Нижняя граница tone() на Uno — 31 Гц: ниже таймер не успевает рисовать волну, и вместо тона выходит треск; верх уходит далеко за 20 кГц — туда, где первым сдаётся ухо.
Третий аргумент — длительность в миллисекундах: tone(8, 1000, 200) пикнет двести мс и замолчит сам, скетч не замирает — отбой звука делает таймер. Классический ритм сигнала собирается парой «тон плюс пауза»: tone(8, 1000, 200); delay(300); — пик, затем тишина. Без третьего аргумента звук не остановится никогда: tone(8, 1000) играет до noTone(8), и забытый noTone — причина номер один у «писка, который висит вечно». В симуляторе поведение то же самое: вызов с длительностью снимается сам, вызов без неё ждёт noTone.
Два жёстких ограничения. Первое: tone на Uno один за раз — таймер единственный, и новый вызов tone(9, 500) мгновенно заглушит tone(8, 1000); аккордом это не станет. Второе: тон живёт на Timer2, а Timer2 же кормит ШИМ пинов 3 и 11 — пока играет мелодия, analogWrite на этих двух пинах молчит; пины 5, 6, 9 и 10 сидят на других таймерах и не страдают, delay() работает как работал. При этом analogWrite и tone живут на одном пине, но говорят на разных языках: ШИМ управляет скважностью при фиксированных 490 или 980 Гц — это язык яркости; tone управляет частотой при скважности ровно 50% — язык уха. Пытаться пищать через analogWrite — значит путать язык яркости с языком звука.
const int BUZZER = 8; void setup() { pinMode(BUZZER, OUTPUT); Serial.begin(9600); Serial.println("Napominanie: tri piska");} void loop() { for (int i = 0; i < 3; i = i + 1) { tone(BUZZER, 1000, 80); // пик 80 мс delay(200); // пауза между пиками } delay(5000); // тишина до следующего раза}Какие пины умеют tone: любой цифровой, и это не опечатка
Вопрос из моих первых недель: «tone работает только на пинах с волнистой чертой?» Нет. tone() и noTone() живут на любом цифровом пине Uno — от 0 до 13: волну генерирует таймер, а пину достаточно уметь дёргаться вверх-вниз, что он делает с первого урока. ШИМ-черта на корпусе платы для звука не нужна и даже не используется. Мой зуммер сидит на пине 8 — обычном, без всяких черт, — и никто не страдает. Единственная ценность ШИМ-пинов тут обратная: на них всё ещё можно повесить analogWrite — кроме 3 и 11, которые во время мелодии молчат.
Собирается сигнал за минуту. Резистор 100 Ом одним концом в пин 8, другим — в «+» зуммера; «−» зуммера — в GND. Если ножки не лезут в макетку, зажмите их в двух перемычках рядом: у меня «пищалка» от разобранного будильника прижата прищепкой уже второй год. Ток 20–25 мА через резистор — щадящий режим, а не бюрократия: пины Uno сгорают молча и по одному, и добрая половина мёртвых плат с барахолки — это чьи-то эксперименты без резисторов.
Про громкость честно: пьезоизлучатель орёт не на всех частотах одинаково. У корпуса с отверстием есть резонанс — обычно 2–4 кГц, там он во весь голос; на 440 Гц тот же зуммер говорит вполголоса. Поэтому сигнал тревоги делают на 2–2,5 кГц — не потому что так принято, а потому что керамика там отдаёт максимум, а слух самый чуткий. Если зуммера не слышно из соседней комнаты — поднимите частоту до резонанса и только потом ищите усилитель.
const int BUZZER = 8; void setup() { pinMode(BUZZER, OUTPUT); Serial.begin(9600); Serial.println("Sirena: 400 -> 1800 Hz");} void loop() { for (int f = 400; f <= 1800; f = f + 20) { // вверх tone(BUZZER, f, 8); delay(8); } for (int f = 1800; f >= 400; f = f - 20) { // вниз tone(BUZZER, f, 8); delay(8); }}const int BUZZER = 8;const int LED_RED = 9; void setup() { pinMode(BUZZER, OUTPUT); pinMode(LED_RED, OUTPUT); Serial.begin(9600); Serial.println("Trevoga: 800/1200 + mayak");} void loop() { tone(BUZZER, 800, 250); // низкий тон digitalWrite(LED_RED, HIGH); // маяк горит delay(250); tone(BUZZER, 1200, 250); // высокий тон digitalWrite(LED_RED, LOW); // маяк погас delay(250);}| Частота | Звучит как | Где пригодится |
|---|---|---|
| 31 Гц | нижний предел tone() на Uno: ниже — треск | граница диапазона, не для музыки |
| 440 Гц | нота ля первой октавы | базовый тон, проверка зуммера |
| 1000 Гц | сервисный beep бытовой техники | сигнал нажатия и событий |
| 2000 Гц | писк парктроника | тревоги: на резонансе корпуса громче всего |
| 490 Гц | частота ШИМ analogWrite | зуммер в ШИМ-пине запищит и без tone |
- Определите породу своего зуммера: подайте ножки прямо на 5V и GND — запищал сам, значит активный, только щёлкнул — пассивный. Верните на пин 8 через резистор 100 Ом и запишите вердикт на бумажке.
- Подберите голос сигнализации: прогоните 440, 880, 1200 и 2000 Гц и послушайте из соседней комнаты, какая частота слышна лучше; впишите её в константу наверху скетча.
- Перепишите сирену без третьего аргумента: tone(BUZZER, f); delay(8); noTone(BUZZER); — сравните с вариантом из урока. Оба должны звучать одинаково, а выбрать придётся по читаемости.
- Соедините тревогу с RGB-светодиодом: пусть маяк не просто мигает, а дышит через analogWrite — и наступите на грабли Timer2, если поставите его на пин 3.
- Сыграйте гамму: до, ре, ми, фа, соль, ля, си — это 262, 294, 330, 349, 392, 440 и 494 Гц. Прогоните через tone(..., 250): заготовка пригодится в уроке про мелодии и массивы нот.
Клавиши двух октав играют через Web Audio, код tone(8, Гц, мс) растёт из каждой ноты, секвенсор поведёт кузнечика.
Подгружаем интерактив…
- Активный зуммер пищит сам от питания и умеет только вкл/выкл; пассивный — излучатель, которому частоту задаёт tone(). Проверка 5 В различает породы за десять секунд.
- tone(pin, freq) играет прямоугольную волну со скважностью 50%; tone(pin, freq, ms) отбивается сам; noTone(pin) глушит принудительно.
- tone работает на любом цифровом пине — ШИМ-черта не нужна; но таймер один: второй вызов tone глушит первый, а Timer2 молчит на пинах 3 и 11.
- Ориентиры: 31 Гц — нижний предел tone() на Uno, 440 Гц — нота ля, 1000 Гц — beep, 2000 Гц — писк парктроника и резонанс корпуса.
- Ток зуммера 20–25 мА: резистор 100 Ом последовательно бережёт пин; полярность маркирована, при переполюсовке деталь не гибнет — оседает громкость.
- 1. Зуммер пищит одной нотой, даже когда вы меняете частоту в tone(). Что перед вами?
- 2. На каких пинах Uno работает tone()?
- 3. Играет tone(8, 1000), и вы вызываете tone(9, 500). Что услышите?
- 4. Почему во время мелодии молчит analogWrite на пине 3?
Зуммер научил проект разговаривать, и это уже не мигалка, а прибор с характером: beep подтверждает нажатие, сирена пугает, тревога зовёт из другой комнаты. Дальше — музыка: ноты те же частоты, только собранные в массив, и «Мелодии на зуммере» покажут, как играть последовательности и не душить скетч delay'ами. А пока три дела: проверьте питанием, пассивный ли ваш зуммер, подберите частоту, которую слышно из соседней комнаты, и присмотритесь к маяку: мигающий красный светодиод из урока про RGB-светодиод напрашивается в пару со звуком — такой тревожный комплект переживёт половину проектов.
Частые вопросы по теме урока
- Зуммер пищит одной нотой, даже когда вы меняете частоту в tone(). Что перед вами?
- Активный зуммер содержит собственный генератор: дали питание — он пищит своей частотой. Высоту тона задаёт только пассивный излучатель; проверка питанием различает их за секунды. Активный зуммер: генератор внутри, внешняя частота ему безразлична
- На каких пинах Uno работает tone()?
- tone() генерирует прямоугольную волну силами таймера, пину достаточно дёргаться вверх-вниз. Волновая черта нужна analogWrite, не tone. На любом цифровом пине: волну рисует таймер, ШИМ не нужен
- Играет tone(8, 1000), и вы вызываете tone(9, 500). Что услышите?
- Звуковой таймер на Uno один: двух тонов одновременно не бывает. Для аккордов нужен второй генератор — другой таймер или внешняя деталь. Только 500 Гц: таймер один, новый вызов снял старый тон
- Почему во время мелодии молчит analogWrite на пине 3?
- Timer2 один и на tone, и на ШИМ пинов 3 и 11, поэтому во время мелодии эти пины молчат. Пины 5, 6, 9 и 10 сидят на других таймерах и не страдают. tone занимает Timer2, а он кормит ШИМ пинов 3 и 11