Музыкальный звонок на пик-контроллере с функцией энергосбережения

Несколько лет тому назад у меня появилась идея собрать устройство на микроконтроллере, которое могло бы наглядно продемонстрировать всю функциональность этого прибора. 

В данной статье описывается схема и работа простого электромузыкального устройства, построенного на микроконтроллере PIC16F628, которое может применяться в качестве квартирного звонка. Процесс построения устройства можно разбить на 3 этапа:

  1. Создание музыкальной композиции
  2. Определение ее частотных и временных характеристик
  3. Сборка схемы и программирование микроконтроллера

Для создания музыкального фрагмента мною была выбрана простая программа «Muzmaker», написанная под DOS. Программа позволяет прописывать небольшие одноголосные мелодии и выглядит следующим образом:

Ввод нот производится посредством мыши либо с помощью цифр и букв клавиатуры., при этом на нотном стане появляются ноты соответствующие нажатой клавише.

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

Итак, будем считать что мелодия написана. Ее можно сохранить в виде файла и затем снова открыть при необходимости.

Далее возникает необходимость определить частоты тех нот, которые были задействованы. И тут на помощь приходит любимый мною звуковой редактор «Cool Edit». Поскольку программа «Muzmaker» воспроизводит музыкальную композицию через внутренний (системный) динамик ПК, то для анализа частот можно использовать обычный микрофон, поднеся его к передней панели системного блока компьютера:

При этом «Cool Edit» настраивается на режим записи. После которой, полученную «осциллограмму» можно «растянуть» и посчитать период колебания.

Для написания простой мелодии вполне достаточно трех октав: малой, первой и второй. Таким образом необходимо было выяснить частоты 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

Итак подведем итог. Алгоритм работы устройства следующий:

  1. Поступление питания на устройство – блокировка контактов реле, включение индикаторного светодиода.
  2. Обращение к EEPROM и получение порядкового номера мелодии, подлежащей воспроизведению
  3. Сравнение полученного из EEPROM значения, сравнение его с номерами мелодий и при совпадении переход к воспроизведению.
  4. Загрузка констант нот и интервалов и генерирование частот с заданными паузами в соответствии с подпрограммой воспроизводимой мелодии
  5. Увеличение порядкового номера мелодии на единицу, если это значение станет равно «5» — обнуление порядкового номера.
  6. Запись порядкового номера в EEPROM.
  7. Выключение индикаторного светодиода, разблокировка контактов реле.

О конструкции устройства

Питание осуществляется от любого маломощного трансформатора на 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