Несколько лет тому назад у меня появилась идея собрать устройство на микроконтроллере, которое могло бы наглядно продемонстрировать всю функциональность этого прибора.
В данной статье описывается схема и работа простого электромузыкального устройства, построенного на микроконтроллере PIC16F628, которое может применяться в качестве квартирного звонка. Процесс построения устройства можно разбить на 3 этапа:
- Создание музыкальной композиции
- Определение ее частотных и временных характеристик
- Сборка схемы и программирование микроконтроллера
Для создания музыкального фрагмента мною была выбрана простая программа «Muzmaker», написанная под DOS. Программа позволяет прописывать небольшие одноголосные мелодии и выглядит следующим образом:
Ввод нот производится посредством мыши либо с помощью цифр и букв клавиатуры., при этом на нотном стане появляются ноты соответствующие нажатой клавише.
Для тех, кто знаком с нотной грамотой написать простую мелодию не составит особого труда. Мне же пришлось изрядно помучиться, что бы попасть в правильные ноты и интервалы.
Итак, будем считать что мелодия написана. Ее можно сохранить в виде файла и затем снова открыть при необходимости.
Далее возникает необходимость определить частоты тех нот, которые были задействованы. И тут на помощь приходит любимый мною звуковой редактор «Cool Edit». Поскольку программа «Muzmaker» воспроизводит музыкальную композицию через внутренний (системный) динамик ПК, то для анализа частот можно использовать обычный микрофон, поднеся его к передней панели системного блока компьютера:
При этом «Cool Edit» настраивается на режим записи. После которой, полученную «осциллограмму» можно «растянуть» и посчитать период колебания.
Для написания простой мелодии вполне достаточно трех октав: малой, первой и второй. Таким образом необходимо было выяснить частоты 36 нот (включая бимоли).
Полученные замеры показали, что нотам соответствуют следующие частоты:
Для малой октавы:
нота |
|
t 1/2 mS | ||
DO | 147 | 3,40 | ||
DO# | 157,5 | 3,17 | ||
RE | 166,5 | 3,00 | ||
RE# | 174 | 2,87 | ||
MY | 187,5 | 2,67 | ||
FA | 196 | 2,55 | ||
FA# | 208,5 | 2,40 | ||
SO | 222 | 2,25 | ||
SO# | 235 | 2,13 | ||
LY | 253 | 1,98 | ||
LY# | 270 | 1,85 | ||
SY | 281,5 | 1,78 |
Для первой октавы:
нота |
|
t 1/2 mS | ||
DO | 294 | 1,70 | ||
DO# | 315 | 1,59 | ||
RE | 333 | 1,50 | ||
RE# | 348 | 1,44 | ||
MY | 375 | 1,33 | ||
FA | 392 | 1,28 | ||
FA# | 417 | 1,20 | ||
SO | 444 | 1,13 | ||
SO# | 470 | 1,06 | ||
LY | 506 | 0,99 | ||
LY# | 540 | 0,93 | ||
SY | 563 | 0,89 |
Для второй октавы:
та |
|
t 1/2 mS | ||
DO | 588 | 0,85 | ||
DO# | 630 | 0,79 | ||
RE | 666 | 0,75 | ||
RE# | 696 | 0,72 | ||
MY | 750 | 0,67 | ||
FA | 784 | 0,64 | ||
FA# | 834 | 0,60 | ||
SO | 888 | 0,56 | ||
SO# | 940 | 0,53 | ||
LY | 1012 | 0,49 | ||
LY# | 1080 | 0,46 | ||
SY | 1126 | 0,44 |
Тут же приводится расчет времени одного полупериода частоты каждой ноты, эти значения будет использованы для формирования частот в программе контроллера.
Далее переходим к программированию:
Для удобства каждую ноту будем формировать в отдельной подпрограмме:
Например:
;НОТА ДО LDO movlw .4 movwf Sec3 movlw .213 movwf Sec4 movlw .29 movwf Sec5 CALL NOTA RETURN
Здесь формируются значения переменных (Sec3, Sec4, Sec5) для последующего воспроизведения ноты «До» малой октавы. Далее вызывается подпрограмма NOTA:
NOTA BEG BSF PORTB,4 movf Sec3,w movwf Sec1 movf Sec4,w movwf Sec2 WW: decfsz Sec1, F GOTO WW movf Sec3,w movwf Sec1 decfsz Sec2, F GOTO WW BCF PORTB,4 movf Sec3,w movwf Sec1 movf Sec4,w movwf Sec2 WWW: decfsz Sec1, F GOTO WWW movf Sec3,w movwf Sec1 decfsz Sec2, F GOTO WWW decfsz Sec5, F GOTO BEG RETURN
Здесь происходит генерация тона заданной частоты методом циклического «открывания» и «закрывания» порта (B4). Длительность звучания ноты составляет примерно 200 mS. Если длительность ноты необходимо увеличить, то это достигается простым повторением подпрограммы:
CALL LDO CALL LDO ………….. CALL LDO и т.д.
Тело формирования мелодии выглядит таким образом:
MUS1 CALL LY CALL SO CALL LY CALL MY CALL DO CALL MY CALL LLY CALL PAUSE CALL LY CALL SO CALL LY CALL MY CALL DO CALL MY CALL LLY CALL PAUSE CALL LY CALL SY CALL HDO CALL SY CALL HDO CALL LY CALL SY CALL LY CALL SY CALL SO CALL LY CALL SO CALL MY CALL SO CALL LY RETURN
Паузы между нотами формируется так же в виде подпрограмм:
;ПАУЗА 50 mS PAUSE50 movlw .250 movwf Sec1 movlw .60 movwf Sec2 WWWWW: decfsz Sec1, F GOTO WWWWW decfsz Sec2, F GOTO WWWWW RETURN ;ПАУЗА 200 mS PAUSE movlw .250 movwf Sec1 movlw .250 movwf Sec2 WWWW: decfsz Sec1, F GOTO WWWW decfsz Sec2, F GOTO WWWW RETURN ;ПАУЗА 1 S PAUSE1 CALL PAUSE CALL PAUSE CALL PAUSE CALL PAUSE CALL PAUSE RETURN
Всего в устройстве реализовано 5 мелодии. Их число можно увеличить.
Поскольку устройство предполагалось использовать в качестве квартирного звонка, то у меня появилась идея сделать его энергосберегающим, ведь большую часть времени он будет бездействовать.
Параллельно кнопке звонка я установил реле с нормально разомкнутыми контактами.
Таким образом, при нажатии на кнопку происходит включение подача питания на схему, контроллер блокирует контакты реле, после чего происходит проигрывание мелодии, и контакты разъединяются.
Но тут возникла проблема: если устройство будет незапитано, то каким образом будет осуществляться выборка новой мелодии для воспроизведения? Напомню: у меня их 5. Ведь при отключении питания все память ОЗУ будет очищаться!
В таком случае целесообразно использовать энергонезависимую память ПИКа.
Т.е. вначале необходимо считать из нее номер мелодии, воспроизвести ее и записать в память номер последующей мелодии, которая воспроизведется при последующем нажатии на кнопку звонка.
Процедура чтения из EEPROM выглядит следующим образом:
;ЧТЕНИЕ ИЗ EEPROM CHT BSF STATUS,RP0 ; Установим банк 1 BCF STATUS,RP1 MOVLW B'00000000' MOVWF EEADR ; Загружаем адрес BSF EECON1,RD ; Производим чтение MOVF EEDATA,W ; Пересылаем в W BCF STATUS,RP0 ; Установим банк 0 BCF STATUS,RP1 ; MOVWF Number ; Пересылаем из W в Number RETURN
Далее следует блок сравнения полученного значения с номерами мелодий и вызов подпрограммы той мелодии, чей номер соответствует полученному при чтении из EEPROM:
movf Number,w XORLW .0 ;Сравнить c 0 btfsc STATUS,Z ;Если равен 0 то CALL MUS1 movf Number,w XORLW .1 ;Сравнить c 1 btfsc STATUS,Z ;Если равен 1 то CALL MUS2 movf Number,w XORLW .2 ;Сравнить c 2 btfsc STATUS,Z ;Если равен 2 то CALL MUS3 movf Number,w XORLW .3 ;Сравнить c 3 btfsc STATUS,Z ;Если равен 3 то CALL MUS4 movf Number,w XORLW .4 ;Сравнить c 4 btfsc STATUS,Z ;Если равен 4 то CALL MUS5
Далее необходимо увеличить порядковый номер мелодии на единицу и иметь в виду, что если это число достигнет значения «5», то его нужно обнулить (ведь мелодии с номером «5» у нас нет!):
INCF Number,1 movf Number,w XORLW .5 ;Сравнить c 5 btfsc STATUS,Z ;Если равен 5 то CLRF Number
Затем записываем полученное число в EEPROM:
;ЗАПИСЬ В EEPROM ZAP MOVF Number,W BSF STATUS,RP0 ; Установим банк 1 BCF STATUS,RP1 MOVWF EEDATA ; Загружаем данные MOVLW B'00000000' MOVWF EEADR ; Загружаем адрес BSF EECON1,WREN ; Разрешаем запись MOVLW 55h MOVWF EECON2 MOVLW .170 MOVWF EECON2 BSF EECON1,WR ; Записываем BCF EECON1,WREN ; Запрещаем запись BCF STATUS,RP0 ; Установим банк 0 BCF STATUS,RP1 ; RETURN
Итак подведем итог. Алгоритм работы устройства следующий:
- Поступление питания на устройство – блокировка контактов реле, включение индикаторного светодиода.
- Обращение к EEPROM и получение порядкового номера мелодии, подлежащей воспроизведению
- Сравнение полученного из EEPROM значения, сравнение его с номерами мелодий и при совпадении переход к воспроизведению.
- Загрузка констант нот и интервалов и генерирование частот с заданными паузами в соответствии с подпрограммой воспроизводимой мелодии
- Увеличение порядкового номера мелодии на единицу, если это значение станет равно «5» - обнуление порядкового номера.
- Запись порядкового номера в EEPROM.
- Выключение индикаторного светодиода, разблокировка контактов реле.
О конструкции устройства
Питание осуществляется от любого маломощного трансформатора на 220В, вторичная обмотка – 10- 12В. Реле – любое слаботочное с обмоткой на 10 – 12 В, контакты которого должны быть рассчитаны на 220В. Динамическая головка мощностью 0,5 Вт.
Преимущество данной схемы еще и в том, что ее практически невозможно "спалить" при неправильном подключении контактов к кнопке и питанию сети. Единственно что может выйти из строя это контакты реле, а электроника останется "живой".
Устройство может быть размещено в корпусе от абонентской радиоточки или в любом другом подходящем.
Список радиоэлементов
Обозначение | Тип | Номинал | Количество | Примечание | Магазин | Мой блокнот |
---|---|---|---|---|---|---|
МК PIC 8-бит | PIC16F628A | 1 | Поиск в магазине Отрон | |||
Линейный регулятор | LM7805 | 1 | Поиск в магазине Отрон | |||
Биполярный транзистор | КТ817Б | 2 | Поиск в магазине Отрон | |||
Светодиод | АЛ307А | 1 | Поиск в магазине Отрон | |||
Выпрямительный диод | 1N4007 | 5 | Поиск в магазине Отрон | |||
Конденсатор | 470 мкФ х 16 В | 2 | Поиск в магазине Отрон | |||
Конденсатор | 22 пФ | 1 | Поиск в магазине Отрон | |||
Конденсатор | 33 пФ | 2 | Поиск в магазине Отрон | |||
Резистор | 2 кОм | 3 | Поиск в магазине Отрон | |||
Переменный резистор | 10 кОм | 1 | Поиск в магазине Отрон | |||
ZQ1 | Кварц | 4.0 МГц | 1 | Поиск в магазине Отрон | ||
B1 | Головка динамическая | 0,5 Вт / 8 Ом | 1 | Поиск в магазине Отрон | ||
P1 | Реле | JQC-3F-L | 1 | Поиск в магазине Отрон | ||
Трансформатор | малогабаритный 220В / 12В | 1 | Поиск в магазине Отрон | |||
Скачать список элементов (PDF)
Прикрепленные файлы:
- zvonok.asm (20 Кб)
- ZVONOK.HEX (5 Кб)
- MUZMAKER.rar (49 Кб)
Комментарии (12) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
Керамика по питанию 22пФ, а на кварце - 33пФ - и так во всех конструкциях автора.
На входе электролит 470мкФ, на выходе такой же. Невдомек, что это нарушает работу стабилизатора.
Ни одного из своих "творений" автор не собирал. Схемотехника просто неработоспособна, не удивлюсь, если программная часть тоже.
[Автор]
"что бы собрать" это как?
[Автор]
[Автор]
[Автор]
1- Весна на заречной улице
2- Мы с конём по полю идём...
3- Милая моя Сулико
4- Что-то из Ну-погоди
5- Какая-то абра-катабра(возможно автор что-то напутал)
Что характерно, скорость исполнения напрямую зависит от кварца, поэтому вместо 4.00 впаял на 8.86МГц, так намного резвее и чётче - всё таки звонок, а не консерватория...
Из недостатков - повторное нажатие кнопки сразу после окончания мелодии и выключения не всегда даёт воспроизведение, а где-то через минуту.
Судя по объёму прошивки - там можно поместить ещё столько же мелодий, если не больше...
Ломаться там практически нечему, но... помогла перепрошивка пика.
Потом прочитал - надо было проверить, всё слетело или отдельные места... Придётся в следующий раз...