HardWare Kit – Набор программных инструментов для работы с цифровыми устройствами на аппаратном уровне. А именно, все что может помочь в разработке и отладке программного обеспечения микропроцессоров, контроллеров различных устройств и их связи с персональным компьютером по различным шинам данных. Все программы, скачиваемые с данного сайта, относятся к категории freeware и распространяются бесплатно. |
||||
Главная О сайте Контакты | ||||
Хороший звук на простейшем бипере
От малобюджетных проектов на однокристаллах чудес полифонии и современных визуальных эффектов ждать не приходится. Пределом их интерфейсных возможностей обычно становятся один – два светодиода и, если повезет, пищалка (beeper). Именно об этом чуде техники я и хочу рассказать. Beeper – пьезоэлектрический излучатель звука. Достаточно подать на него сигнал типа меандр определенной частоты, чтоб он запел. Что именно он споёт, будет зависеть от поданной частоты. Например, частота 440Гц будет соответствовать ноте Ля первой октавы. В некоторых приложениях этого вполне достаточно, например чтобы просигнализировать нажатие на единственную клавишу, или сообщить о некой ошибке, или обозначить окончание какого-то важного действия. Но что делать если все эти действия присутствуют одновременно, и кнопок несколько, и действия разные, да и на подтверждение тоже звучок повесить хочется, да такой, чтобы от сообщения об ошибке отличался? Естественно чередовать частоты, изменять длительности – одним словом делать музыку! Аппаратная частьУправлять бипером довольно просто – понадобится всего один вывод микроконтроллера и минимальная обвязка. Вариант включения бипера приведен на рисунке ниже. Вывод микроконтроллера, как правило, слаботочный и не может выдать ток больше чем 20-40мА, поэтому надо использовать транзистор (VT1). Уровень логической единицы на выходе микроконтроллера полностью откроет транзистор и через бипер (HA1) потечет ток. Логическая единица закрывает транзистор, и ток не течет. Это нужно учитывать при программировании, и позаботится о том, чтобы после окончания звучания, транзистор всегда оставался закрытым. Диод (VD1) нужен для снятия пиковых обратных токов, возникающих при резком закрытии транзистора. Если об этом не позаботиться, то в звучании появится неприятный высокочастотный дребезг. Такая схема хорошо работает как при напряжении питания (Vcc) 5В так и при 3,3В. ПрограммированиеРесурсы микроконтроллера, которых всегда не хватает, так же не сильно пострадают – отдайте ему один таймер, сотню (от силы две) байт кода и немножко ОЗУ и таймер сыграет вам пару аккордов. А если не жалко 3 килобайта кода отдать под хорошую музыку, то даже можете услышать как Ваше устройство играет Лунную Сонату Бетховена. Программировать звук нужно используя прерывания от таймера. Для того чтобы извлечь звук с частотой F нужно запрограммировать таймер на период t = 1000/(2F) (мс) и в каждом прерывании инвертировать значение выводимое на выход микроконтроллера. Введя в программу счетчик импульсов cnt, вы сможете задать время звучания T – при достижении значения cnt = T/2t остановите таймер и не забудьте выставить ноль на выходе микроконтроллера. А если завести массив со значениями частот и длительностей и проигрывать их одну за другой, то получится мелодия. Если мелодия достаточно большая (да даже если и не большая) проследите, чтобы массив попал не в ОЗУ а в память программ, ведь значения нот и частот не будут меняться в процессе исполнения программы. Например, в IAR Embedded workbench это делается с помощью директивы __flash. Пример массива из двух нот:
Этот пример вполне работоспособен, но мало функционален – изменить звучание нот и не промахнуться мимо аккорда, или изменить скорость воспроизведения мелодии не так уж просто, тем более, если мы имеем дело не с парой нот, а с целым музыкальным произведением. Настало время поговорить о связи технических параметров и параметров музыкальных. Ноты и их частотыВ музыке для записи звуков используют ноты, каждая из которых соответствует определенной частоте. Используя стандартное для нот буквенное обозначения можно получить набор определений:
Полный список приведен в файле sound_description.h проекта MelodyMIDI. Запись нот с помощью директив, а не в виде массива, хороша тем, что в процессе программирования вам доступны все значения нот, а в программу попадут только те данные, которые вы используете. Это особенно важно для использования в микроконтроллерах с ограниченным ресурсом. ТемпТеперь разберемся с длительностью звучания каждой ноты. В первую очередь она зависит от темпа, в котором должно быть сыграно музыкальное произведение. Темп в музыке это количество четвертых долей такта сыгранных в минуту. А такт - единица музыкального метра, начинающаяся с наиболее сильной доли, и заканчивающаяся перед следующей равной ей по силе. Ниже следует определение нескольких музыкальных темпов, взятое из музыкальной энциклопедии:
Полный список приведен в файле sound_description.h проекта MelodyMIDI. Исходя из этих данных можно рассчитать количество миллисекунд, приходящихся на один такт:
Зная длительность одно такта не сложно вычислить длительность звучания каждой ноты. Например, если такт состоит из четырех четвертей, то длительность каждой ноты составляет длительность такта деленную на четыре. Таким образом, определив темп (Temp_) для всей композиции, можно записать длительность ноты с помощью директивы:
Одна восьмая будет записана как Drt_(1,8), а четверть как Drt_(1,4). Вот теперь мы готовы записать данные из предыдущего примера в виде, приближенном к музыкальному:
ДинамикаДинамикой в музыке называют силу звука т.е. громкость звучанию нот. Обычно основная тема – мелодия выделяется более сильным звучанием, в то время как аккорды, призванные лишь подчеркнуть красоту мелодии, играются более тихим звуком. Казалось бы это не про нас – бипер одновременно проигрывает только одну ноту и на аккорды не способен, да и силой звука мы тоже не способны управлять, ведь для этого нужно включать в схему некий усилитель с управляемым коэффициентом усиления, чего мы не делаем. Но нет, на оба этих утверждения есть контраргументы. Во-первых, аккорд может быть сыгран не одновременным нажатием нот, а быстрым их чередованием, такой способ называется арпеджио. Во вторых да – мы не управляем силой звучания, но бипер делает это за нас и очень удачно это делает. Дело в том, что его амплитудно частотная характеристика вовсе не равномерна во всем диапазоне слышимых частот. Ниже приведу АЧХ бипера GT-0930RP2. На графике хорошо виден пик на 2,7кГц и явно выраженный спад амплитуды на низких частотах. Именно это обстоятельство очень удачно подходит к задаче воспроизведения музыки, так как музыкальные произведения, чаще всего, стоится подобным образом – основная мелодия звучит в первой, второй и третьей октавах (частоты от 300 до 2000Гц) а аккорды располагаются в малой, большой, контр и субконтр октавах (частоты от 16 до 300 Гц). Учитывайте это при составлении своих произведений. ПримерыВ конце статьи приведу несколько примеров мелодий, которые использую сам. Примеры звучания всех приведенных ниже мелодий можно прослушать на плеере в правой колонке этой страницы. "Ёлочка"Началась эта история с мелодиями под Новый 2015 Год, и отлаживал я программу на новогодней песенке «В Лесу Родилась Ёлочка». По началу ёлочка сильно хромала и достала всю лабораторию, но тем не менее, именно на ней проект и был отлажен. Вот код этой мелодии:
Сообщение об ошибке:В этом примере используется триоль, приходящаяся на одну четверть такта. Не сложно вычислить, что одна нота триоли длится одну треть одной четверти такта, то есть равна одной двенадцатой такта.
|
||||
|