Tone on Multiple Speakers — воспроизведение тонов на нескольких динамиках
Учимся поочерёдно воспроизводить разные тоны на нескольких динамиках с помощью команды tone() в Arduino.
В этом уроке разберёмся, как использовать команду tone() для воспроизведения разных нот на нескольких выходах поочерёдно.
Как это работает
Команда tone() захватывает один из внутренних таймеров микроконтроллера ATmega, настраивает его на нужную частоту и использует для генерации импульсов на выходном пине. Поскольку задействован всего один таймер, одновременно можно воспроизводить только одну ноту. Зато ничто не мешает последовательно играть ноты на разных пинах — главное, перед переключением на следующий пин отключить таймер от предыдущего с помощью noTone().
Отдельная благодарность Грегу Боренштейну за уточнение этого момента.
Необходимые компоненты
- Arduino Board
- 3 динамика по 8 Ом
- 3 резистора по 100 Ом
- соединительные провода
- макетная плата
Схема подключения

Схема подключения трёх динамиков к Arduino UNO на макетной плате. Каждый динамик подключается через отдельный резистор 100 Ом к своему цифровому пину.
Принципиальная схема

Принципиальная схема: три динамика 8 Ом подключены через резисторы 10 кОм к цифровым пинам Arduino UNO. Второй конец каждого динамика — на GND.
Код
Скетч ниже последовательно воспроизводит тон на каждом из динамиков, предварительно отключая предыдущий. Обратите внимание: длительность каждого тона совпадает с задержкой delay(), следующей за ним — это гарантирует, что тон успеет прозвучать полностью до перехода к следующему.
/*
Воспроизведение нескольких тонов
Последовательно воспроизводит тоны на нескольких пинах
Схема:
- три динамика 8 Ом на цифровых пинах 6, 7 и 8
Создано 8 марта 2010 г.
Автор: Tom Igoe
На основе фрагмента кода Greg Borenstein
Этот пример кода находится в общественном достоянии.
https://www.arduino.cc/en/Tutorial/Tone4
*/
void setup() {
}
void loop() {
// отключить функцию tone для пина 8:
noTone(8);
// воспроизвести ноту на пине 6 в течение 200 мс:
tone(6, 440, 200);
delay(200);
// отключить функцию tone для пина 6:
noTone(6);
// воспроизвести ноту на пине 7 в течение 500 мс:
tone(7, 494, 500);
delay(500);
// отключить функцию tone для пина 7:
noTone(7);
// воспроизвести ноту на пине 8 в течение 300 мс:
tone(8, 523, 300);
delay(300);
}
Практические замечания
- Резисторы обязательны. Без резистора ток через динамик может превысить допустимый для пина Arduino (40 мА), что рискует повредить микроконтроллер. Резистор 100 Ом ограничивает ток и защищает схему.
- Порядок вызовов важен. Всегда вызывайте
noTone(pinN)перед тем, как вызватьtone()на другом пине. Если этого не сделать, таймер продолжит работать на старом пине и новый тон может не зазвучать или зазвучит некорректно. - Одновременное звучание невозможно. Архитектура ATmega позволяет использовать
tone()только на одном пине одновременно. Для полифонии потребуются внешние решения — например, ШИМ-синтез или специализированные микросхемы. - Динамики 8 Ом — стандартный выбор для подобных схем. Динамики с меньшим сопротивлением могут перегрузить пин даже с резистором.
Типичные ошибки
- Нет звука на одном из динамиков — проверьте, что
noTone()вызывается перед переключением, и убедитесь в правильности подключения резистора и полярности динамика. - Тон обрывается раньше времени — значение
delay()должно совпадать с длительностью тона, иначе следующий вызовnoTone()прервёт звучание досрочно. - Скетч компилируется, но звука нет — убедитесь, что номера пинов в коде совпадают с реальным подключением на плате.
Узнать больше
Больше базовых уроков можно найти в разделе built-in examples.
Также изучите language reference — подробный справочник по языку программирования Arduino.
Последнее обновление: 11.08.2015, SM