Случилось так, что дверной звонок в моей квартире приказал долго жить. Верой и правдой он прослужил туеву хучу лет (даже и не помню сколько). Жил, по-моему, он еще с советских времен. И был он не музыкальным, а обычным зуммером. Издавал он противный дребезжащий звук, чем уже порядком надоел и раздражал. Руки сменить его на что-либо более современное все никак не доходили.
В связи кончиной звонка и пришла в голову идея собрать музыкальный звонок самому. И мелодии использовать те, которые нравятся мне. И сделать его таким, чтоб мне нравился. Тем более руки чешутся чего-нибудь попрограммировать и попаять.Прежде чем делать плату звонка и паять детальки, нужно смоделировать его на беспаечной макетной плате и посмотреть как он будет работать. Сказано — сделано.
Схема у звонка простейшая. К одной ноге прицеплена кнопка, к другой — динамик через транзистор. Кнопка замыкается на землю, соответственно, при нажатой кнопке активный уровень — логический ноль. Для подавления помех кнопка притянута через резистор 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):
Забыл добавить исходники… И никто не напомнил… 🙁
Вливайтесь в обсуждение
  18 комментариев
Fomich
12 лет назадUPDATE (15.03.2012):
Забыл добавить исходники… И никто не напомнил…
А их и сейчас нет. Как посмотреть на исходник? (01.07.2012)
Chiper
12 лет назадКак где? Внизу статьи голубенький блок скачать. Вам его разве не видно?
Chiper
12 лет назадВсе, блин, поправил. Че то затупил я… 🙁
FreshMan
11 лет назадгде вы берете мелодии и как их преобразовываете в массивы ?
Chiper
11 лет назадПреобразовывал из формата рингтонов RTTL для телефонов Nokia. Подробнее про RTTL, например, здесь.
Мелодии… Ну например здесь.
Или здесь посмотрите.
FreshMan
11 лет назадкстати, я не эксперт ))), но в свое время читал что нот ВСЕГО 7
от 8 до 12 идут диезы соответствующей октавы
Chiper
11 лет назадЯ тоже не эксперт. Но там все довольно просто…
FreshMan
11 лет назада как сделать пересчет для 8МГц?
Роман
10 лет назадвсе новое — хорошо забытое старое (в хорошем смысле)
конечно вы сделали решение в лоб. На прерываниях + 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»
а это беверли хилз (из к/ф с эдди мерфи)
причем декодер строки примитивный, портируется под любой язык
Роман
10 лет назада в чем прикол с delay_ms ? неужто код:
int d = 1023;
delay_ms(d);
у вас не компилируется!?
Анатолий
10 лет назадОтличный проект, особенно для непродвинутых типа меня. Особенно понравилось видео — крайне познавательно.
Давно искал подобную конструкцию для замены сломавшейся китайской пищалки в мягкой игрушке внучки…
1. Собрал на Atmega8. Работает. Но требует питания не меньше 3,4 вольта. А в игрушке всего максимум 3 (два пальчика). Да и ток потребления великоват. Да и жалко использовать такой хороший МК (возможности используются на 1%). Кстати, на схеме автора ошибка — изображена не ATmega8 (28 ножек), а что-то другое (24 ножки). Соответственно, перепутана нумерация выводов (вместо 11 должен быть 13, вместо 13 — 15)…
2. Решил попробовать переделать схему/программу под ATtiny2313A, как наиболее доступную. Потребовалось немного повозиться с ATMEL Studio, GCC, а также подправить авторский код в нескольких местах. Всё — в первый раз для меня. Собрал, работает прекрасно. Ток потребления намного меньше (2мА), не срывается и при 1,8 вольтах. Одним словом — очень доволен (выбрал вариант музыки с кузнечиком).
Для информации. Может, кому будет интересно.
PS Не знаю как прикрепить схемку и прошивку под ATtiny2313A, а то бы поделился. Удачи всем! Автору — большое спасибо!
Chiper
10 лет назадРад, что вас заинтересовало.
Делал на том, что было в наличии
Спасибо, действительно так. Что то невнимательно я рисовал… 🙁
Я тоже этим занимался. Без этого никак. И чем больше переделываешь, тем больше осваиваешь предмет.
Здесь — никак. Шли на мыло в контактах, я размещу.
Спасибо.
Калашников Саша
8 лет назадАвтору спасибо!
Мб кому пригодится, мелодия марио:
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
8 лет назадО, классно!
Спасибо
Дмитрий
8 лет назадРебят, а подскажите пожалуйста что нужно дописать чтобы при каждом нажатии играла случайная музыка. Заранее благодарю
Chiper
8 лет назадДелаешь массив мелодий, генерируешь случайное число по количеству элементов массива, выбираешь и проигрываешь мелодию в зависимости от этого числа.
Дмитрий
8 лет назадА как это будет выглядеть в коде?) Извините, за мою навязчивость) Я просто очень далеко нахожусь от программирования, а дверной звонок нужен)
Алекс
5 месяцев назадАвтор преднамеренно выложил заведомо не рабочий код. Не хорошо!!!!