Одноголосный музыкальный звонок

Случилось так, что дверной звонок в моей квартире приказал долго жить. Верой и правдой он прослужил туеву хучу лет (даже и не помню сколько). Жил, по-моему, он еще с советских времен. И был он не музыкальным, а обычным зуммером. Издавал он противный дребезжащий звук, чем уже порядком надоел и раздражал. Руки сменить его на что-либо более современное все никак не доходили.

В связи кончиной звонка и пришла в голову идея собрать музыкальный звонок самому. И мелодии использовать те, которые нравятся мне. И сделать его таким, чтоб мне нравился. Тем более руки чешутся чего-нибудь попрограммировать и попаять.Прежде чем делать плату звонка и паять детальки, нужно смоделировать его на беспаечной макетной плате и посмотреть как он будет работать. Сказано — сделано.

Схема у звонка простейшая.  К одной ноге прицеплена кнопка, к другой — динамик через транзистор. Кнопка замыкается на землю, соответственно, при нажатой кнопке активный уровень — логический ноль. Для подавления помех кнопка притянута через резистор 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):

Забыл добавить исходники… И никто не напомнил… 🙁

14 комментариев на “Одноголосный музыкальный звонок”

  1. UPDATE (15.03.2012):
    Забыл добавить исходники… И никто не напомнил…
     
    А их и сейчас нет. Как посмотреть на исходник?  (01.07.2012)

  2. где вы берете мелодии и как их преобразовываете в массивы ?

  3. а как сделать пересчет для 8МГц?

  4. Роман

    все новое — хорошо забытое старое (в хорошем смысле)

    конечно вы сделали решение в лоб. На прерываниях + 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»

    а это беверли хилз (из к/ф с эдди мерфи)

    причем декодер строки примитивный, портируется под любой язык

  5. Роман

    а в чем прикол с 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, а то бы поделился. Удачи всем! Автору — большое спасибо!

    • Отличный проект, особенно для непродвинутых типа меня.

      Рад, что вас заинтересовало.

      Да и жалко использовать такой хороший МК (возможности используются на 1%)

      Делал на том, что было в наличии

      Кстати, на схеме автора ошибка — изображена не ATmega8 (28 ножек), а что-то другое (24 ножки). Соответственно, перепутана нумерация выводов (вместо 11 должен быть 13, вместо 13 — 15)…

      Спасибо, действительно так. Что то невнимательно я рисовал… 🙁

      Решил попробовать переделать схему/программу

      Я тоже этим занимался. Без этого никак. И чем больше переделываешь, тем больше осваиваешь предмет.

      PS Не знаю как прикрепить схемку и прошивку под ATtiny2313A, а то бы поделился.

      Здесь — никак. Шли на мыло в контактах, я размещу.

      Автору — большое спасибо!

      Спасибо.

  7. Калашников Саша

    Автору спасибо!
    Мб кому пригодится, мелодия марио:

    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};

Добавить комментарий

Поля, помеченные знаком звездочка (*) обязательны для заполнения.