Тимофей Носов 25 мая 2014 г.
Звонок-проигрыватель рингтонов
Звонок собирается на микроконтроллере PIC12F675 и проигрывает заранее определенные (прошитые) мелодии. Цель статьи – научить подготавливать текст мелодии для последующей компиляции прошивки. Предполагается, что читатель имеет навыки работы в среде программирования MPLAB для PIC микроконтроллеров.
В схеме светодиод «активность» включается в момент проигрывания мелодии; для упрощения конструкции светодиод и резистор в его цепи можно не использовать. В момент воспроизведения ток потребления не более 40 мА. Схема работает до напряжения 1,6В. Кнопкой «выбор» перебираем и прослушиваем мелодии. Кнопками «пуск» и «стоп» запускаем и останавливаем последнюю выбранную мелодию.
Звонок проигрывает монофонические мелодии. Количество мелодий зависит от суммарного числа нот в мелодиях. Например, в приложенном исходнике (прошивке) получилось примерно 240 нот на 6 мелодий в памяти программы и 120 нот на 1 мелодию в ПЗУ (EEPROM). Таким образом, имеется следующий репертуар из 7 мелодий:
– Огней как много золотых;
– Подмосковные вечера;
– На сопках Маньчжурии;
– Бородин - Князь Игорь;
– Лезгинка;
– Мурка;
– Крылатые качели (в EEPROM).
Вы можете сделать свой набор мелодий. Источником мелодий являются midi файлы. Скачаем для примера полонез Огинского – «Прощание с Родиной» здесь http://www.rusmidi.com/getmidi.php?id=2162&l=rus . Переименуем файл в «Полонез.mid».
Задача – отредактировать полифоническую (многоголосую) мелодию в монофоническую (одноголосую) без аккордов, т.к. наш звонок в один момент времени может играть только одну ноту в пределах трёх октав. Не пугайтесь, это не сложно, ломать – не строить. Для этого скачиваем и устанавливаем редактор midi файлов – «Able MIDI Editor». Запускаем Able MIDI Editor и открываем в этом редакторе файл «Полонез.mid».
В верхней части программы наблюдаем интуитивно понятные кнопки воспроизведения и редактирования, в правой части программы – кнопки управления треками инструментов, в нижней части - вся дорожка с проигрываемыми нотами, по центру – фрагмент дорожки.
Итак, отключаем ненужное, оставляем один инструмент – в данном midi файле это 2й трек. Нажмите кнопки как на рисунке ниже.
После этого на дорожке остаются ноты с основной мелодией. Нам нужен небольшой фрагмент; выделяем мышью ноты с 0 по 21 секунду. Копируем выделенное (правой кнопкой мыши Copy). Создаем новый лист мелодии через меню File – New. Вставляем наш фрагмент Edit – Paste. Смотрим точнее длину мелодии – 20,6 сек. Изменяем настройку длины мелодии Operations – Set Piece Length на 20,6 сек.
Снова выделяем весь трек и перетягиваем мышью на одну октаву вниз, чтобы звуки были в пределах первой, второй и третьей октав, подробнее смотри http://ru.wikipedia.org/wiki/Равномерно_темперированный_строй
Положение и длина полоски означает момент начала и конца проигрывания соответствующей ноты. Пробелы между полосками – паузы. Несколько полосок в один и тот же момент времени (полоски друг над другом) это условно аккорд.
Сохраняем полученный результат File – Save as… ; в диалоговом окне сохранения выбираем тип файла «*.mid» указываем новое имя, например «Полонез-21.mid». Ликбез редактирования midi файлов закончен.
Далее преобразуем монофонический файл мелодии в последовательность символов, кодирующих ноту и её длительность. Для этого используем программу Ringtone Editor v2.2. Из программы Ringtone Editor открываем полученный файл «Полонез-21.mid». Должны наблюдать следующее окно.
Получаем последовательность символов, в которой указаны ноты (и длительности в скобках). Кому интересны подробности – читаем справку к Ringtone Editor в файле Editor.HLP.
E2(1/2) Dis2(1/16.) E2(1/16.) F2(1/8.) E2(1/8.) C2(1/16.) P(1/16) P(1/32) C2(1/16.) B1(1/16.) A1(1/2) C2(1/8.) E2(1/8.) E2(1/8.) A2(1/2) E2(1/8.) G2(1/4) Fis2(1/16.) F2(1/2) D2(1/8.) B2(1/4) A2(1/16.) Gis2(1/4) F2(1/16.) E2(1/4) D2(1/16.) E2(1/16.) P(1/16) P(1/32) E2(1/16.) D2(1/16.) C2(1/2) A1(1/8.) B1(1/16.) C2(1/16.) B1(1/16.) A1(1/16.) B1(1/16.) D2(1/16.) F2(1/16.) E2(1/16.) D2(1/16.) C2(1/16.) B1(1/16.) C2(1/16.) A1(1/16.) C2(1/16.) E2(1/16.) A2(1/16.) C3(1/2) A2(1/8.) B2(1/16.) C3(1/16.) B2(1/16.) A2(1/16.) B2(1/16.) D3(1/16.) F3(1/16.) E3(1/16.) D3(1/16.) C3(1/16.) B2(1/16.) A2(1/16.) Gis2(1/16.) A2(1/16.) B2(1/16.) Gis2(1/16.) B2(1/4.) A2(1/4)
Эту последовательность копируем в текстовый редактор и путём нехитрых автозамен и руками приводим к виду массива.
{E2,2}, {Dis2,16}, {E2,16}, {F2,8}, {E2,8}, {C2,16}, {P,16}, {P,32}, {C2,16}, {B1,16}, {A1,2}, {C2,8}, {E2,8}, {E2,8}, {A2,2}, {E2,8}, {G2,4}, {Fis2,16}, {F2,2}, {D2,8}, {B2,4}, {A2,16}, {Gis2,4}, {F2,16}, {E2,4}, {D2,16}, {E2,16}, {P,16}, {P,32}, {E2,16}, {D2,16}, {C2,2}, {A1,8}, {B1,16}, {C2,16}, {B1,16}, {A1,16}, {B1,16}, {D2,16}, {F2,16}, {E2,16}, {D2,16}, {C2,16}, {B1,16}, {C2,16}, {A1,16}, {C2,16}, {E2,16}, {A2,16}, {C3,2}, {A2,8}, {B2,16}, {C3,16}, {B2,16}, {A2,16}, {B2,16}, {D3,16}, {F3,16}, {E3,16}, {D3,16}, {C3,16}, {B2,16}, {A2,16}, {Gis2,16}, {A2,16}, {B2,16}, {Gis2,16}, {B2,4}, {A2,4}, {P,0}
В самом конце добавляем паузу нулевой длительности {P,0} – признак конца мелодии.
Проект с программой для микроконтроллера состоит из нескольких файлов. Управление воспроизведением мелодий находится в файле main.c в функции select(x). Массивы мелодий находятся в файле ringtones.c.
Добавляем массив с мелодией в ringtones.c ; оформление массива можно сделать по образцу имеющихся мелодий
const unsigned char ringtone7[][2] =
{// Огинский – Прощание с Родиной
{E2,2}, {Dis2,16}, {E2,16}, {F2,8}, {E2,8}, {C2,16}, {P,16}, {P,32}, {C2,16}, {B1,16}, {A1,2}, {C2,8}, {E2,8}, {E2,8}, {A2,2}, {E2,8}, {G2,4}, {Fis2,16}, {F2,2}, {D2,8}, {B2,4}, {A2,16}, {Gis2,4}, {F2,16}, {E2,4}, {D2,16}, {E2,16}, {P,16}, {P,32}, {E2,16}, {D2,16}, {C2,2}, {A1,8}, {B1,16}, {C2,16}, {B1,16}, {A1,16}, {B1,16}, {D2,16}, {F2,16}, {E2,16}, {D2,16}, {C2,16}, {B1,16}, {C2,16}, {A1,16}, {C2,16}, {E2,16}, {A2,16}, {C3,2}, {A2,8}, {B2,16}, {C3,16}, {B2,16}, {A2,16}, {B2,16}, {D3,16}, {F3,16}, {E3,16}, {D3,16}, {C3,16}, {B2,16}, {A2,16}, {Gis2,16}, {A2,16}, {B2,16}, {Gis2,16}, {B2,4}, {A2,4}, {P,0}
};
Корректируем функцию:
void select (unsigned char x)
{
switch (x)
{
case 1: play (ringtone1); break;
case 2: play (ringtone2); break;
case 3: play (ringtone3); break;
case 4: play (ringtone4); break;
case 5: play (ringtone7); break;
case 6: play_eeprom(); break;
}
}
и корректируем строчку по числу мелодий
num_melodi++; if (num_melodi>6) num_melodi=1;
Компилируем (HI-TECH C Compiler for PIC10/12/16 MCUs (PRO Mode) V9.71a). Будем считать, что у вас успешно откомпилировалось. Предварительно прошивку можно послушать в Протеусе с выводом реального звука из ПК на колонки (наушники). Модель звонка-проигрывателя прилагается.
Пример реализации на печатной плате
Пищит вполне громко, но лучше использовать электромагнитные динамики от игрушек.
Файлы (прошивки с разными наборами мелодий):
Прошивка 1 (для PIC12F675)
Прошивка 2 (для PIC12F675)
Прошивка 3 (для PIC12F675)
Прошивка 4 (для PIC12F675)
Проект MPLAB
Проект Proteus
Печатная плата
Able MIDI Editor
Ringtone Editor v2.2
Статья
Полезные ссылки:
Попробуй сделать печатную плату на кухне
Собери себе подходящий программатор
Узнай как прошить микроконтроллер прошивкой
Научись программировать и делать прошивки
Задай вопрос или найди ответ в форуме
|