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

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

В данной статье описывается схема и работа простого электромузыкального устройства, построенного на микроконтроллере 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

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

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

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

    Прикрепленные файлы:

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

    Ваш адрес email не будет опубликован.