Arduino:Библиотеки/Tone

Материал из Онлайн справочника
Версия от 21:07, 4 марта 2017; Myagkij (обсуждение | вклад)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Черновик


Библиотека Tone[1]

Это библиотека для Arduino, которая генерирует на любом контакте платы Arduino прямоугольные волны заданной частоты (с коэффициентом заполнения 50%). Также есть возможность задать продолжительность волны, но если этого параметра задано не будет, волна будет активна, пока в скетче не появится функция stop(). Этот контакт можно подключить к пьезодинамику или другому устройству, способному проигрывать звук. Обязательно попробуйте скетч «RTTTL»!

«Родная» библиотека Tone

В Arduino уже есть упрощенная версия библиотеки Tone, которая была внедрена вместе с версией 0018. Впрочем, она позволяет сыграть лишь одну ноту (потому что используется только один таймер). Соответствующую документацию можно почитать тут.

Также имеет смысл ознакомиться с руководством, написанным Томом Иго (Tom Igoe). В нем демонстрируется, как использовать функции tone() и noTone().

Внимание! Не подключайте контакт напрямую к устройствам звукового ввода. Их напряжение гораздо выше, чем у стандартных устройств с сигналом линейного уровня, поэтому может повредить входные контакты звуковой карты и прочих похожих устройств. Чтобы снизить напряжение, можно использовать делитель напряжения, но это по-прежнему не гарантирует, что оборудование останется в целости и сохранности.

Кроме того, на одной линии с динамиком ДОЛЖЕН БЫТЬ резистор. В противном случае контроллер будет поврежден.

Загрузка и установка

Последнюю версию библиотеки можно скачать отсюда. Об установке библиотек читайте тут.

Подключение

  • Просто подключите цифровой контакт к динамику (к той же линии должен быть подключен резистор примерно на 1 кОм), а другую сторону динамика – к «земле» (GND).
  • Для регулирования громкости можно использовать потенциометр (регулируемый резистор). Для этих целей подойдет потенциометр номиналом 10 кОм. Подключите его к той же линии, что и резистор на 1 кОм, подключенный к динамику.
  • Использование этой библиотеки повлияет и на выходную ШИМ, так что будьте осторожны.
  • Хотя библиотека использует последний таймер, ее работа повлияет и на timer0, который, помимо прочего, используется для функции millis().

Функции

  • Функция begin(pin) подготавливает контакт для проигрывания ноты. Аргумент pin – это номер подготавливаемого контакта.
  • Функция isPlaying() проверяет, проигрывается ли нота. Если проигрывается, функция возвращает true, если нет – false.
  • Функция play(frequency, duration) проигрывает ноту. Аргумент frequency – это частота ноты, а duration – это продолжительность проигрывания ноты в миллисекундах (когда это время закончится, звук автоматически замолкнет). Второй аргумент опционален, и если он не задан, нота будет проигрываться, пока в скетче не будет вызвана функция stop(). Функция play() – это неблокирующая функция. Будучи вызванной, она сразу же исполнит свою задачу.
  • Функция stop() останавливает проигрывание ноты.

Константы

Ниже список констант, отвечающих за частоты нот. Они идут в комплекте с библиотекой. Эти константы указываются в качестве аргументов в функции play().

Вот сам список (здесь первая запись – это название константы, а вторая – частота ноты):

| NOTE_B2 | 123 | | NOTE_C3 | 131 | | NOTE_CS3 | 139 | | NOTE_D3 | 147 | | NOTE_DS3 | 156 | | NOTE_E3 | 165 | | NOTE_F3 | 175 | | NOTE_FS3 | 185 | | NOTE_G3 | 196 | | NOTE_GS3 | 208 | | NOTE_A3 | 220 | | NOTE_AS3 | 233 | | NOTE_B3 | 247 | | NOTE_C4 | 262 | | NOTE_CS4 | 277 | | NOTE_D4 | 294 | | NOTE_DS4 | 311 | | NOTE_E4 | 330 | | NOTE_F4 | 349 | | NOTE_FS4 | 370 | | NOTE_G4 | 392 | | NOTE_GS4 | 415 | | NOTE_A4 | 440 | | NOTE_AS4 | 466 | | NOTE_B4 | 494 | | NOTE_C5 | 523 | | NOTE_CS5 | 554 | | NOTE_D5 | 587 | | NOTE_DS5 | 622 | | NOTE_E5 | 659 | | NOTE_F5 | 698 | | NOTE_FS5 | 740 | | NOTE_G5 | 784 | | NOTE_GS5 | 831 | | NOTE_A5 | 880 | | NOTE_AS5 | 932 | | NOTE_B5 | 988 | | NOTE_C6 | 1047 | | NOTE_CS6 | 1109 | | NOTE_D6 | 1175 | | NOTE_DS6 | 1245 | | NOTE_E6 | 1319 | | NOTE_F6 | 1397 | | NOTE_FS6 | 1480 | | NOTE_G6 | 1568 | | NOTE_GS6 | 1661 | | NOTE_A6 | 1760 | | NOTE_AS6 | 1865 | | NOTE_B6 | 1976 | | NOTE_C7 | 2093 | | NOTE_CS7 | 2217 | | NOTE_D7 | 2349 | | NOTE_DS7 | 2489 | | NOTE_E7 | 2637 | | NOTE_F7 | 2794 | | NOTE_FS7 | 2960 | | NOTE_G7 | 3136 | | NOTE_GS7 | 3322 | | NOTE_A7 | 3520 | | NOTE_AS7 | 3729 | | NOTE_B7 | 3951 | | NOTE_C8 | 4186 | | NOTE_CS8 | 4435 | | NOTE_D8 | 4699 | | NOTE_DS8 | 4978 |

К примеру, чтобы проиграть 440 Гц (четвертую ноту октавы A) на 13-ом контакте, понадобится следующий код:

Tone tone1;
void setup() { tone1.begin(13); tone1.play(NOTE_A4); }
void loop() { }

Подробнее о принципе работы библиотеки

Чтобы генерировать прямоугольно-волновые ноты слышимого диапазона, библиотека Tone использует аппаратные таймеры микроконтроллера Arduino.

Генерировать ноты можно на любом контакте Arduino. Количество нот, которые можно проигрывать одновременно, зависит от количества аппаратных таймеров (совместимых с CTC), имеющихся у контроллера.

  • ATmega8: два таймера (2 и 1)
  • ATmega168/328: три таймера (2, 1 и 0)
  • ATmega1280: 6 таймеров (2, 3, 4, 5, 1 и 0)

В скобках указан порядок распределения таймеров. Кроме того, timer0 – это очень чувствительный таймер, поскольку отвечает за функцию millis() и ШИМ.

Диапазон частот, которые может генерировать библиотека, зависит от тактовой частоты микроконтроллера и используемого таймера. Расчет этого диапазона осуществляется следующим образом (здесь первая запись – это частота микроконтроллера, вторая – нижняя граница диапазона для 8-битного таймера, третья – нижняя граница для 16-битного таймера, а четвертая – верхняя граница частотного диапазона):

|8 MHz |16 Hz |1 Hz (1/16 Hz) |4 MHz | 
|16 MHz |31 Hz |1 Hz (1/8 Hz) |8 MHz |

Хотя верхней границей частотного диапазона может быть и 8 МГц, верхняя граница диапазона человеческого слуха, как правило, не превышает 20 КГц.

Точность ноты зависит от значения, заданного для предварительного делителя частоты. Благодаря этому делению происходит квантование частоты.

Если вы используете 16-битный таймер (например, timer1 или timer3, timer4, timer5 на 1280), то можете генерировать «ноты» до 1/8 Гц (один цикл каждые 8 секунд), но библиотека Tone, задавая частоты, принимает только целочисленные значения.

Поскольку функция play() принимает только беззнаковые целочисленные значения, максимальной частотой, которую можно сгенерировать, будет 65535 Гц. Кроме того, после округления эта цифра превращается в «ноту» с частотой 65573,77 Гц (на платах с тактовой частотой в 16 МГц). Следовательно, если в функции play() указать для частоты более высокие значения, вы все равно не сможете достичь результата лучше 80 rГц, потому что переключение контактов осуществляется на программном уровне. Причем каждое такое переключение требует КАК МИНИМУМ 50 с лишним циклов.

Сайты с рингтонами

Примеры

  • DTMFTest - Тональный сигнал
  • RTTTL - RTTTL
  • ToneTest - Одновременное проигрывание нот

См.также

Внешние ссылки