Простой дверной звонок на МК

Обсуждаем цифровые устройства...
Ответить
FredyInKR
Открыл глаза
Сообщения: 40
Зарегистрирован: Ср мар 25, 2009 22:05:46
Откуда: Kirovohrad -> Ukraine
Контактная информация:

Простой дверной звонок на МК

Сообщение FredyInKR »

Доброго времени суток. Вот погулял по форуму поискал похожие темы, ну есть дверной звонок с ММС картой - это слишком навороченный, и есть ребята советуют купить без проводной китайский. Ну оба варианты мне не подходят. Мне нужно, зашить в мегу 8 простую 8битную мелодию и чтобы она проигрывала ее при нажатии на кнопку и переходила в ждущий режим. Как бы вы мне помогли с аналоговой частью?... Дело в том, что хочу питать устройство от батареек ААА... Как бы мне реализовать режим ожидания... Или может, че-то похожее, кто-то видел - дайте ссылку...
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Простой дверной звонок на МК

Сообщение pyzhman »

На восемь выходов подключайте простенький ЦАП 2R-R, с него на дин. головку. Вход, подключенный к кнопке звонка, параметрируете как вход выхода из спящего режима, а то и просто на сброс, т.е. reset. В IBM PC делаете/преобразуете мелодию в формат 8-бит и перегоняете во флеш МК. Поочередным выставлением байт файла на порте ЦАПа наслаждаетесь музыкой, а по окончании усыпляете МК командой sleep.
Docendo discimus
Аватара пользователя
nick17
Встал на лапы
Сообщения: 134
Зарегистрирован: Пт июн 26, 2009 06:40:07
Контактная информация:

Re: Простой дверной звонок на МК

Сообщение nick17 »

http://radioded.ru/content/view/108/1/

Собирал, звук класс!!! :))
FredyInKR
Открыл глаза
Сообщения: 40
Зарегистрирован: Ср мар 25, 2009 22:05:46
Откуда: Kirovohrad -> Ukraine
Контактная информация:

Re: Простой дверной звонок на МК

Сообщение FredyInKR »

Погулял по форуму нашел проект музыкальной шкатулки на Си... Не могу понять, там файл прошивки не от этой программа что-ли... У меня в протеусе проигрывает что то вроде: "Ту-лю-лю" и все. А как под другую мелодию ее переписать??? Че-то не пойму...
Вложения
03.rar
(95.04 КБ) 288 скачиваний
FredyInKR
Открыл глаза
Сообщения: 40
Зарегистрирован: Ср мар 25, 2009 22:05:46
Откуда: Kirovohrad -> Ukraine
Контактная информация:

Re: Простой дверной звонок на МК

Сообщение FredyInKR »

Ребята хелп. Программа играет только первые три ноты. Все ноты работают но больше 3-х не слышно...
Компилятор: код визион 2.04.4а...

#include <mega8.h>
#include <delay.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <delay.h>
#define CLK_FREQ 4000000 //Частота генератора
#define PR 1 //Предварительный делитель МК
#define NOTE_DURATION 2000 //Единица длительности звучания ноты
#define SEMITONE 1.0594631 //Разница в частотах между соседними нотами одной октавы
#define START_NOTE 16.352 //Нота начального отсчёта (нота До 0-ой октавы)
#define OCTAVE_OFFSET 3 //Смещение по октавам

char mel[]= { "G2(1/4) C3(1/4) G2(1/8) A2(1/16) H2(1/8) P(1/16) E2(1/8) E2(1/16) A2(1/8) P(1/16) G2(1/8) F2(1/16) G2(1/8) P(1/16) C2(1/8) C2(1/16) D2(1/8) P(1/16) D2(1/8) E2(1/16) F2(1/8) P(1/16) F2(1/8) G2(1/16) A2(1/8) P(1/16) H2(1/8) C3(1/16) D3(1/8) P(1/8)"};


//Функция расчёта в октаве номера каждой из 12+1 нот
unsigned char note_to_num (int note)
{
unsigned char nt=note & 0x07;
unsigned char temp=0;

switch(nt)
{
case 1: temp=1; break;
case 2: temp=3; break;
case 3: temp=5; break;
case 4: temp=6; break;
case 5: temp=8; break;
case 6: temp=10; break;
case 7: temp=12; break;
}

if ( (temp) && (note & 0x08) )
temp++;

return (temp);
}


//Функция извлечения из ноты частоты
unsigned int note_to_freq (int note)
{
float temp=START_NOTE;
unsigned int oct=(note & 0x00F0)>>4;
unsigned char i;

if (oct>9) return (0);

for (i=1; i<(12*oct + note_to_num(note)); i++)
{
temp*=SEMITONE;
}

return ((unsigned int)temp);
}


//Функция извлечения из ноты длительности
unsigned int note_to_duration (int note)
{
switch ( (note & 0x0F00) >>8 )
{
case 0: return (NOTE_DURATION*8); //32/4
case 1: return (NOTE_DURATION*4); //16/4
case 2: return (NOTE_DURATION*2); //8/4
case 3: return (NOTE_DURATION*1); //4/4
case 4: return (NOTE_DURATION/2); //1/2
case 5: return (NOTE_DURATION/4); //1/4
case 6: return (NOTE_DURATION/8); //1/8
case 7: return (NOTE_DURATION/16); //1/16
case 8: return (NOTE_DURATION/32); //1/32
case 9: return (NOTE_DURATION/64); //1/64
case 10: return (NOTE_DURATION/128); //1/128
default: return (0);
}
}


//Функция перевода псевдонима ноты в порядковое число
unsigned char note_name(char c)
{
switch (c)
{
case 'P': return (0);
case 'C': return (1);
case 'D': return (2);
case 'E': return (3);
case 'F': return (4);
case 'G': return (5);
case 'A': return (6);
case 'H': return (7);
default: return (8);
}
}


//Воспроизведение ноты заданной частоты и длительности
void sound (int note)
{
if (!note_to_num(note)) //Если пауза
{
delay_ms(note_to_duration(note));
return;
}

OCR1A=CLK_FREQ/2/PR/note_to_freq(note)-1;

TCCR1A=0x40;
delay_ms(note_to_duration(note));
TCCR1A=0x00;
}


//Воспроизведение мелодии
int read_mel(char *mel)
{
int note=0; //Собираемая нота
char i, num, denum;

for (i=0; i<strlen(mel); i++)
{
if (isalpha(mel[i])) //Начало ноты
{
note=note_name(mel[i]); //Код ноты
i++;

if (isalpha(mel[i]))
{
note+=1*8; //Знак диез #
i+=2;
}

note+=(mel[i]-'0'+OCTAVE_OFFSET)*16; //Помещаем октаву на 7-4 разряды
i+=2; //Переходим сразу на длительность

num=(mel[i]-'0');
i+=2;
denum=(mel[i++]-'0');

if (isdigit(mel[i])) //Считываем знаменатель
{
denum=denum*10+(mel[i++]-'0');

if (isdigit(mel[i]))
denum=denum*10+(mel[i]-'0');
}

if (num==1) //Дробь не больше единицы
{
switch(denum) //Знаменатель
{
case 1: note+= 3*256; break;
case 2: note+= 4*256; break;
case 4: note+= 5*256; break;
case 8: note+= 6*256; break;
case 16: note+= 7*256; break;
case 32: note+= 8*256; break;
case 64: note+= 9*256; break;
case 128: note+=10*256; break;
}
}
else //Дробь больше единицы
{
switch (num)
{
case 8: note+=0*256;
case 4: note+=1*256;
case 2: note+=2*256;
}
}


sound(note); //Воспроизведение считанной ноты
}
}

return (1);
}





void main(void)
{

PORTB=0xFF;
DDRB=0x02;

PORTC=0xFF;
DDRC=0x00;

PORTD=0xFF;
DDRD=0x00;

ACSR=0x80;

TCCR1A=0x00;
TCCR1B=0x09; //CTC + Делитель 1


while (1)
{
read_mel(mel);
read_mel(mel);
};
}
FredyInKR
Открыл глаза
Сообщения: 40
Зарегистрирован: Ср мар 25, 2009 22:05:46
Откуда: Kirovohrad -> Ukraine
Контактная информация:

Re: Простой дверной звонок на МК

Сообщение FredyInKR »

Вот доработал схему:
Изображение
Зн. наверное, что-то с компилятором. Дело в том, что короткая мелодия вообще не играет а длинная только пару нот...
Вложения
cxema.jpg
(50.59 КБ) 2885 скачиваний
FredyInKR
Открыл глаза
Сообщения: 40
Зарегистрирован: Ср мар 25, 2009 22:05:46
Откуда: Kirovohrad -> Ukraine
Контактная информация:

Re: Простой дверной звонок на МК

Сообщение FredyInKR »

Нашел причину неисправности, вот как поправить не знаю :o Программа не играет короткие ноты, допустим короткая задержка: P(1/16) . на этой части замолкает Если же так: P(1/8) то все нормально. Вот только медленно как-то. Подскажите пожалуйста где покопать???
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Простой дверной звонок на МК

Сообщение pyzhman »

Ну почему так:
FredyInKR писал(а):8битную мелодию

и свалилось в итоге к 1битной?
Docendo discimus
FredyInKR
Открыл глаза
Сообщения: 40
Зарегистрирован: Ср мар 25, 2009 22:05:46
Откуда: Kirovohrad -> Ukraine
Контактная информация:

Re: Простой дверной звонок на МК

Сообщение FredyInKR »

нет /16 это делитель. Не разрядность мелодии а задержка. Чем выше делитель тем короче тон... Вообщем я почти разобрался. Давно на сях ничего не писал.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Простой дверной звонок на МК

Сообщение pyzhman »

Поправлю предыдущий свой пост: однобитной.
Docendo discimus
FredyInKR
Открыл глаза
Сообщения: 40
Зарегистрирован: Ср мар 25, 2009 22:05:46
Откуда: Kirovohrad -> Ukraine
Контактная информация:

Re: Простой дверной звонок на МК

Сообщение FredyInKR »

Пообщался с автором. Очень приятный человек, между прочим. Прислал он мне доработанную версию программы. Разобрался нормально все работает. То у меня с протеусом че-то не то. Глюченный он какой-то. Теперь есть проблема. Хочу сделать с этого всего хлама полифонический дверной звонок. С аналоговой частью почти готово с программой тоже. Есть одна маленькая проблемка: не хватает мне 8Кбайт.
char mel1[]={"первая часть, первой мелодии"};

зн. на 2мелодии места хватает на больше нет. Теперь вопрос: как к меге прекрутить РОМ у меня есть HY62256ALJ-70 - это ЧМОС на 32Кбайт. Как в него залить чары через COM или LPT? А потом считать мегой???
FredyInKR
Открыл глаза
Сообщения: 40
Зарегистрирован: Ср мар 25, 2009 22:05:46
Откуда: Kirovohrad -> Ukraine
Контактная информация:

Re: Простой дверной звонок на МК

Сообщение FredyInKR »

Доделал я сей девайс.
Транзистор в схеме КТ961. Семисегментный индикатор ставил тот что был под рукой :) Использовал только одну цифру. В принципе больше и не нужно.
Что касается прошивки - переделал код программы автора монофонического плеера на МК. Добавил запись кол-ва нажатий звонка в eeprom , изменения режимов частоты звука и изменение режимов проигрывания мелодий. Сейчас в моей программе 5 режимов 2 мелодии. (Калинка и Катюша) 1-й режим - играем первую мелодию, 2-й - вторую, 3-й первую 2 раза, 4-й вторую 2 раза, 5-й первую и вторую мелодии.

Изображение
Собственно фото:
Изображение
Изображение
Изображение
Самое первое видео устройства:
http://www.youtube.com/watch?v=BIwik9dwQHI&feature=player_embedded
Готовый звонок в сборе:
http://www.youtube.com/watch?v=MQ7WTZiLay4&feature=player_embedded

Размер: ~10Мб
Скачать файлы проекта (схема, печатная плата, фото, видео, прошивка МК с исходником):
http://depositfiles.com/files/ecqg961ag
http://letitbit.net/download/95401.954401359b96a03c68c95ce66/Monof.rar.html
Nikola1
Родился
Сообщения: 1
Зарегистрирован: Ср авг 18, 2010 15:04:38

Re: Простой дверной звонок на МК

Сообщение Nikola1 »

Нужна подсказка! проблема: китайский радиозвонок! при нажатии кнопки у соседей за 50 метров звонок играет и у меня и наоборот! как решить проблему?
Аватара пользователя
myx
Потрогал лапой паяльник
Сообщения: 371
Зарегистрирован: Чт июл 22, 2010 10:12:09

Re: Простой дверной звонок на МК

Сообщение myx »

Поломай соседям кнопку. Они купят себе новый звонок.)))
Ответить

Вернуться в «Цифровая техника»