
Случилось так, что дверной звонок в моей квартире приказал долго жить. Верой и правдой он прослужил туеву хучу лет (даже и не помню сколько). Жил, по-моему, он еще с советских времен. И был он не музыкальным, а обычным зуммером. Издавал он противный дребезжащий звук, чем уже порядком надоел и раздражал. Руки сменить его на что-либо более современное все никак не доходили.
В связи кончиной звонка и пришла в голову идея собрать музыкальный звонок самому. И мелодии использовать те, которые нравятся мне. И сделать его таким, чтоб мне нравился. Тем более руки чешутся чего-нибудь попрограммировать и попаять.Прежде чем делать плату звонка и паять детальки, нужно смоделировать его на беспаечной макетной плате и посмотреть как он будет работать. Сказано — сделано.
Схема у звонка простейшая. К одной ноге прицеплена кнопка, к другой — динамик через транзистор. Кнопка замыкается на землю, соответственно, при нажатой кнопке активный уровень — логический ноль. Для подавления помех кнопка притянута через резистор 4.7 КОм к питанию. Вот в общем-то и вся схема.
Собираем схему на макетке
подключаем к ней питание и программатор
и начинаем программировать.
Что бы послушать, как будет звучать такой одноголосный музыкальный звонок, написал простую программу на WinAVR C. Программа простая, я ее хорошо прокомментировал. Разберется даже новичек. Никаких прерываний и т.д. Обычный бесконечный цикл с опросом кнопки и проигрыванием мелодии.
Я не владею музыкальной грамотой, поэтому погуглил на эту тему. Оказывается, что в музыке есть не 7 нот, а 12 (представляете, я и не знал). Каждая нота характеризуется частотой звука и длительностью звучания. После раздумий решил каждую ноту кодировать одним байтом. Естественно, мелодия будет храниться в программной памяти. Поэтому я пришел к следующей схеме, как кодировать мелодию.

Кодирование ноты для музыкального звонка
В итоге, по такой схеме мы можем закодировать 32 ноты и 8 длительностей. Коду ноты с номером 1 соответствует нота «до» 1-й октавы, с кодом 2 — «до#» 1-й октавы, с кодом 3 — «ре» 1-й октавы и так далее. Всего 32 ноты. Это чуть дольше 2.5 октав. Для звонка, я думаю, более чем достаточно.
Но помимо нот, у нас есть паузы между нотами. Примем, что пауза будет кодироваться нулем, и соответствующей ей длительностью. Пауза в нашем устройстве — это просто момент, в который не воспроизводится звук в течении заданной длительности.
Если же и код ноты и код длительности, а соответственно и весь байт, будет равен нулю, то это будет означать конец мелодии.
Итак, открываем AvrStudio, открываем в ней программу, компилируем и заливаем ее в АТМегу8 (не принципиально, просто у меня их просто несколько штук без дела валяется).
После этого жмем кнопарик и наслаждаемся звуком… 🙂
Как все это выглядит и звучит я решил показать на видео (получилось через одно место, много раз оговорился, ну да ладно…).
Ну и как вам звучание? Мне не очень. Ну, конечно, можно его использовать его в качестве звонка, звучит это лучше, чем звучал мой умерший советский звонок. Но… я ожидал большего.
Теперь думаю, нужно делать по-другому. Первое что пришло в голову, это поставить простейший ЦАП R-2R и воспроизводить wav-файл, который хранить на карте памяти. Пошел переделывать….
UPDATE (15.03.2012):
Забыл добавить исходники… И никто не напомнил… 🙁
Вливайтесь в обсуждение
  17 комментариев
Fomich
9 лет назадUPDATE (15.03.2012):
Забыл добавить исходники… И никто не напомнил…
А их и сейчас нет. Как посмотреть на исходник? (01.07.2012)
Chiper
9 лет назадКак где? Внизу статьи голубенький блок скачать. Вам его разве не видно?
Chiper
8 лет назадВсе, блин, поправил. Че то затупил я… 🙁
FreshMan
7 лет назадгде вы берете мелодии и как их преобразовываете в массивы ?
Chiper
7 лет назадПреобразовывал из формата рингтонов RTTL для телефонов Nokia. Подробнее про RTTL, например, здесь.
Мелодии… Ну например здесь.
Или здесь посмотрите.
FreshMan
7 лет назадкстати, я не эксперт ))), но в свое время читал что нот ВСЕГО 7
от 8 до 12 идут диезы соответствующей октавы
Chiper
7 лет назадЯ тоже не эксперт. Но там все довольно просто…
FreshMan
7 лет назада как сделать пересчет для 8МГц?
Роман
6 лет назадвсе новое — хорошо забытое старое (в хорошем смысле)
конечно вы сделали решение в лоб. На прерываниях + PWM это было бы лучше да и проще
еще хочу сказать, что в свое время на заре IBM и во времена расцвета DOS в середине 90х на QBasic (прародитель Visual Basic) была такая функция play и даже были мелодии вызов был: play «MBT200O3L4MBMLCCMBMNEGMLAL8AMNL8EL4L2AO4CL4DO3GO4L1C»
— это строка мелодии не знаю, что но скопирована из одного давнего проекта 2009г (файл датировался почему-то 2009!?)
хм, сейчас глянул на диске еще лежит QBasic 🙂 запустил, в общем это какой буржуйский сонг
T240L16O4ABABABABABABABP2 — это трель, для примитивного звонка сойдет…
в общем таких мелодий должно быть полно нужно только погуглить
a1$ = «t125msl4o3fg#l8fl16fl8a#l8fd#l4fl4o4cl8o3fl16fl8o4c#co3g#fo4cl8fo3l16fl8d#l16d#l8cl8gl4fp2»
a2$ = «t125msl4o3fg#l8fl16fl8a#l8fd#l4fl4o4cl8o3fl16fl8o4c#co3g#fo4cl8fo3l16fl8d#l16d#l8cl8gl4fp2»
a3$ = «o1l4ffl8d#l16d#l8d#l8cd#l4ffp8l16fl8fcfl4c#c#l8d#l16d#l8d#d#d#fp2l8fco0l8a#g#l4f»
a4$ = «o1l4fl8d#l16d#l8d#l8cd#l4ffp8l16fl8fcfl4c#c#l8d#l16d#l8d#d#d#fp2»
а это беверли хилз (из к/ф с эдди мерфи)
причем декодер строки примитивный, портируется под любой язык
Роман
6 лет назада в чем прикол с delay_ms ? неужто код:
int d = 1023;
delay_ms(d);
у вас не компилируется!?
Анатолий
6 лет назадОтличный проект, особенно для непродвинутых типа меня. Особенно понравилось видео — крайне познавательно.
Давно искал подобную конструкцию для замены сломавшейся китайской пищалки в мягкой игрушке внучки…
1. Собрал на Atmega8. Работает. Но требует питания не меньше 3,4 вольта. А в игрушке всего максимум 3 (два пальчика). Да и ток потребления великоват. Да и жалко использовать такой хороший МК (возможности используются на 1%). Кстати, на схеме автора ошибка — изображена не ATmega8 (28 ножек), а что-то другое (24 ножки). Соответственно, перепутана нумерация выводов (вместо 11 должен быть 13, вместо 13 — 15)…
2. Решил попробовать переделать схему/программу под ATtiny2313A, как наиболее доступную. Потребовалось немного повозиться с ATMEL Studio, GCC, а также подправить авторский код в нескольких местах. Всё — в первый раз для меня. Собрал, работает прекрасно. Ток потребления намного меньше (2мА), не срывается и при 1,8 вольтах. Одним словом — очень доволен (выбрал вариант музыки с кузнечиком).
Для информации. Может, кому будет интересно.
PS Не знаю как прикрепить схемку и прошивку под ATtiny2313A, а то бы поделился. Удачи всем! Автору — большое спасибо!
Chiper
6 лет назадРад, что вас заинтересовало.
Делал на том, что было в наличии
Спасибо, действительно так. Что то невнимательно я рисовал… 🙁
Я тоже этим занимался. Без этого никак. И чем больше переделываешь, тем больше осваиваешь предмет.
Здесь — никак. Шли на мыло в контактах, я размещу.
Спасибо.
Калашников Саша
4 года назадАвтору спасибо!
Мб кому пригодится, мелодия марио:
const unsigned char mario[] PROGMEM = {81,81,32,113,77,113,116,96,104,96,109,64,104,64,101,64,106,108,75,106, 104,81,84,118,82,116,113,77,79,108,64,109,64,104,64,101,64, 106,108,75,74,106,72,81,84,118,82,116,113,77,79,108,96,84,83,82,80,64,81,64,73,74,77,64,74,77,79,96,0};
Chiper
4 года назадО, классно!
Спасибо
Дмитрий
4 года назадРебят, а подскажите пожалуйста что нужно дописать чтобы при каждом нажатии играла случайная музыка. Заранее благодарю
Chiper
4 года назадДелаешь массив мелодий, генерируешь случайное число по количеству элементов массива, выбираешь и проигрываешь мелодию в зависимости от этого числа.
Дмитрий
4 года назадА как это будет выглядеть в коде?) Извините, за мою навязчивость) Я просто очень далеко нахожусь от программирования, а дверной звонок нужен)