Несколько лет тому назад у меня появилась идея собрать устройство на микроконтроллере, которое могло бы наглядно продемонстрировать всю функциональность этого прибора.
В данной статье описывается схема и работа простого электромузыкального устройства, построенного на микроконтроллере PIC16F628, которое может применяться в качестве квартирного звонка. Процесс построения устройства можно разбить на 3 этапа:
Для создания музыкального фрагмента мною была выбрана простая программа «Muzmaker», написанная под DOS. Программа позволяет прописывать небольшие одноголосные мелодии и выглядит следующим образом:
Ввод нот производится посредством мыши либо с помощью цифр и букв клавиатуры., при этом на нотном стане появляются ноты соответствующие нажатой клавише.
Для тех, кто знаком с нотной грамотой написать простую мелодию не составит особого труда. Мне же пришлось изрядно помучиться, что бы попасть в правильные ноты и интервалы.
Итак, будем считать что мелодия написана. Ее можно сохранить в виде файла и далее снова открыть при необходимости.
Далее возникает необходимость определить частоты тех нот, которые были задействованы. И тут на помощь приходит любимый мною звуковой редактор «Cool Edit». Поскольку программа «Muzmaker» воспроизводит музыкальную композицию через внутренний (системный) динамик ПК, то для анализа частот можно использовать обычный микрофон, поднеся его к передней панели системного блока компьютера:
При этом «Cool Edit» настраивается на режим записи. После которой, полученную «осциллограмму» можно «растянуть» и посчитать период колебания.
Для написания простой мелодии вполне достаточно 3-х октав: малой, первой и второй. Таким образом необходимо было выяснить частоты 36 нот (включая бимоли).
Полученные замеры показали, что нотам соответствуют следующие частоты:
Для малой октавы:
нота
f Hz
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
Для первой октавы:
нота
f Hz
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
Для второй октавы:
та
f Hz
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
Итак подведем итог. Алгоритм работы устройства следующий:
О конструкции устройства
Питание осуществляется от любого маломощного трансформатора на 220В, вторичная обмотка – 10- 12В. Реле – любое слаботочное с обмоткой на 10 – 12 В, контакты которого должны быть рассчитаны на 220В. Динамическая головка мощностью 0,5 Вт.
Преимущество данной схемы ещё и в том, что ее практически невозможно «спалить» при неправильном подключении контактов к кнопке и питанию сети. Единственно что может выйти из строя это контакты реле, а электроника останется «живой».
Устройство может быть размещено в корпусе от абонентской радиоточки или в любом другом подходящем.
Список радиоэлементовОбозначение
Тип
Номинал
Количество
ПримечаниеМагазинМой блокнот
МК PIC 8-битPIC16F628A1
Линейный регуляторLM78051
Биполярный транзисторКТ817Б2
СветодиодАЛ307А1
Выпрямительный диод1N40075
Конденсатор470 мкФ х 16 В2
Конденсатор22 пФ1
Конденсатор33 пФ2
Резистор2 кОм3
Переменный резистор10 кОм1
ZQ1
Кварц4.0 МГц1
B1
Головка динамическая0,5 Вт / 8 Ом1
P1
РелеJQC-3F-L1
Трансформатормалогабаритный 220В / 12В1
Добавить все
Скачать список элементов (PDF)
Прикрепленные файлы:
- zvonok.asm (20 Кб)
- ZVONOK.HEX (5 Кб)
- MUZMAKER.rar (49 Кб)