Новогодняя Музыкальная Открытка

Не за горами новогодние и рождественские праздники, и многие озабочены тем, какие подарки подарить друзьям и близким.

Собственно, меня волновал тот же вопрос.

И мне пришла в голову такая идея – сделать музыкальную открытку.

Конечно, идея не нова – наши китайские братья производят их в больших количествах и по невысокой цене.

Но я не собирался конкурировать с китайцами, мне просто хотелось чего-то своего.

И, как мне кажется, результат был хороший:



ТК
Для начала я сформулировал следующие требования: В открытом состоянии карта должна воспроизводить мелодию по кругу.

В качестве мелодии я выбрал «Щедрик», или «Колокола».

Желательно, чтобы мелодия была полифонической.

Схема должна быть максимально простой, содержать минимум деталей, легко повторяться и быть недорогой.

И главное, чтобы влезло в открытку.



Анализ
Я давно планировал заняться микроконтроллерами, и для экспериментов купил несколько самых дешевых — attiny13, поэтому решил сделать схему на основе этих микроконтроллеров.

Для начала я разобрался, можно ли реализовать задуманное на этом МК, и если да, то каким образом.

Для этого я нашел и скачал примечания , и начал анализ.

Мелодию можно записать в память МК разными способами, мне в голову пришли 2 варианта: 1) в виде номера ноты в каждом промежутке времени, соответствующем длительности минимальной ноты, и 2) по длительности - формат заметки.

Первый вариант, естественно, проще реализовать.

Я считаю: в песне 25 тактов, из них 16 повторяются дважды, т. е.

всего 41 такт. Минимальная длительность ноты — 1/8, а размер такта — 3/4, следовательно, в одном такте 6 нот минимальной длительности, а вся мелодия будет содержать 6 (нот в такте)*41( бар) * 3 (голоса) = 738 нот. Если на каждую ноту тратить по одному байту, то это многовато, так как attiny13 содержит в общей сложности 1024 байт флэш-памяти (а еще нужно разместить саму программу и таблицу частот) .

Поэтому стоит попробовать второй способ.

Думаю: всего 263 ноты (с учетом пауз) уже приемлемо, даже если использовать байт для длительности, а байт для высоты ноты, то получится 526 байт. Я решил написать на ассемблере — во-первых, чтобы лучше понять сам МК, во-вторых, чтобы уместиться в оставшиеся 700 байт. МК tiny13 имеет на борту 2 ШИМ, с помощью которых можно сделать двухголосную мелодию.

Но для этой мелодии требуется 3 голоса, поэтому использовать только ШИМ для генерации звука не получится.

Для простоты я решил не использовать ШИМ — по крайней мере, в первой версии устройства.



Схема
Для начала я решил каждый голос мелодии вывести на отдельную ножку МК.

Поэтому изначально схема была такая:

Новогодняя музыкальная открытка

Позже выяснилось, что при таком включении музыка звучит очень тихо.

Для решения этой проблемы пришлось смешать все голоса в один канал, а результат подавать на два выхода МК в противофазе — благодаря этому изменение напряжения на пьезоэлементе оказалось в 2 раза больше, чем напряжение питания.

Схема оказалась еще проще:

Новогодняя музыкальная открытка



Алгоритм
Чтобы получить на выходе МК звук заданной частоты, нужно его тактовую частоту разделить на число коэффициентов, равное частоте МК/заданной частоте.

Поскольку операций деления (и вычисления остатка по модулю) нет в списке команд AVR, будем делить с помощью счетчика.

Первоначально счетчику присваивается коэффициент деления, а на следующем цикле вычитается 1. Если счетчик равен нулю, то пришло время изменить сигнал на делителе, и нужно изменить значение на определенной ножке МК, а также заново записать значение коэффициента в счетчик.

Вам понадобится 4 счетчика-разделителя: по одному для каждого голоса и еще один для счета нот (и определения темпа).

Алгоритм работы следующий: 1) инициализировать переменные 2) если счетчик разделителя нот равен нулю, то для каждого голоса проверяем, проиграна ли текущая нота, и если проиграна, загружаем из памяти следующую.

3) за каждый голос уменьшить счетчик на 1; если он равен нулю, переназначьте ему коэффициент деления и измените выходное значение.

4) переход на 2 Чтобы этот алгоритм работал, каждый цикл программы должен выполняться за одинаковое количество тактов.

Для этого нам пришлось просчитать все ветки ветвления, а для слишком «шустрых» участков добавить nop или пустой цикл.

Поначалу при выводе звука на три вывода МК форма сигнала имела форму меандра.

Потом, когда мне пришлось все это смешать и вывести через 2 пина в противофазе (т.е.

фактически через один пин), возникла проблема, как смешать эти три голоса.

Поэтому было решено сделать форму сигнала в виде коротких импульсов, а суммировать их с помощью простого or`a.

Программный код
Исходный код программы можно посмотреть Здесь

Железо
При реализации финальной версии возникли следующие задачи: 1) еда 2) двухпозиционный Проблему 1 я решил с помощью литиевой батареи CR2016, емкость которой согласно этой статье должна составлять примерно 90 мАч.

Аккумулятор я поместил в самодельный отсек, сделанный из канцелярской скрепки, так как промышленного отсека приемлемого размера и цены мне найти не удалось.

Схема потребляет около 2 мА, поэтому такой батареи должно хватить на 40 часов, чего более чем достаточно.

Сначала я думал решить Задачу 2 с помощью тех же скрепок, но потом отказался от этой идеи в пользу геркона и магнита.

Принцип работы виден на видео.



Прошивка
Я скомпилировал и прошил его в AVR Studio 4; при прошивке в фьюзе я изменил только тактовую частоту на 4,8 МГц и отключил деление на 8 частоты задающего генератора.



Бюджет
Микроконтроллер — 8 грн.

Пьезоэлемент – 2 грн.

Батарея — 4 грн.

Геркон - 2 грн.

Разработка, отладка программы - 6 часов Разработка, тестирование схемы - 3 часа Изготовление одной открытки (при наличии травленого картона) - 1 час.



Фото


Новогодняя музыкальная открытка

Первый прототип

Новогодняя музыкальная открытка

Второй прототип

Новогодняя музыкальная открытка

Держатель батареи

Новогодняя музыкальная открытка

Готовое устройство – вид со стороны деталей

Новогодняя музыкальная открытка

Готовое устройство – вид сзади

Новогодняя музыкальная открытка

Первый эпизод

ПС
Всех с Новым годом и Рождеством! Теги: #Сделай сам или Сделай сам #поделки #электроника #музыка #Ассемблер #avr #подарок
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.