Не за горами новогодние и рождественские праздники, и многие озабочены тем, какие подарки подарить друзьям и близким.
Собственно, меня волновал тот же вопрос.
И мне пришла в голову такая идея – сделать музыкальную открытку.
Конечно, идея не нова – наши китайские братья производят их в больших количествах и по невысокой цене.
Но я не собирался конкурировать с китайцами, мне просто хотелось чего-то своего.
И, как мне кажется, результат был хороший:
ТК
Для начала я сформулировал следующие требования: В открытом состоянии карта должна воспроизводить мелодию по кругу.В качестве мелодии я выбрал «Щедрик», или «Колокола».
Желательно, чтобы мелодия была полифонической.
Схема должна быть максимально простой, содержать минимум деталей, легко повторяться и быть недорогой.
И главное, чтобы влезло в открытку.
Анализ
Я давно планировал заняться микроконтроллерами, и для экспериментов купил несколько самых дешевых — 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 #подарок-
Микоплазма
19 Oct, 24 -
Возьмите Ipad Для Редактирования Файлов Avi
19 Oct, 24 -
Яндекс Будет Искать Пиратов С Помощью Робота
19 Oct, 24 -
Наследование Прав Доступа
19 Oct, 24 -
Что Такое Информационный Объект
19 Oct, 24