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

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

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

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

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

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

[stextbox id=»download» defcaption=»true»]sound.c
melody.h
sound.hex — откомпилированный проект

Весь проект в архиве[/stextbox]

Вливайтесь в обсуждение

  17 комментариев

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

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

  • а как сделать пересчет для 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);

    у вас не компилируется!?

  • Анатолий

    5 лет назад

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

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

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

      Спасибо.

  • Калашников Саша

    3 года назад

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

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

  • Дмитрий

    3 года назад

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

    • Делаешь массив мелодий, генерируешь случайное число по количеству элементов массива, выбираешь и проигрываешь мелодию в зависимости от этого числа.

      • Дмитрий

        3 года назад

        А как это будет выглядеть в коде?) Извините, за мою навязчивость) Я просто очень далеко нахожусь от программирования, а дверной звонок нужен)

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

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

Правила комментирования на сайте:

  1. Не следует писать исключительно заглавными буквами. Это дурной тон.
  2. Запрещены комментарии не относящиеся к тематике сайта и самой статье.
  3. Запрещены реплики оскорбляющие других участников проекта. Давайте будем взаимовежливы.
  4. Запрещены нецензурные слова, идиоматические выражения, призывы к межнациональной и межконфессиональной розни.
  5. Запрещено обсуждение наркотических веществ и способов их применения.
  6. Запрещены комментарии с призывами к нарушению действующего законодательства РФ (Уголовного и Административного кодекса).
  7. Запрещены ссылки на сторонние ресурсы без согласования с владельцем сайта.
  8. Запрещается использовать в качестве имени комментатора слоганы/названия сайтов, рекламные фразы, ключевые и т.п. слова.

Следует учитывать следующее - все комментарии проверяются на предмет отсутствия спама. При обнаружении признаков спама, в оставленном Вами комментарии, сам комментарий будет незамедлительно удален, а Ваш IP-адрес будет добавлен в черный список без предупреждения!

Учетные записи пользователей, рассылающих спам, блокируются/удаляются без права последующего восстановления.