Простой дверной звонок на МК
-
FredyInKR
- Открыл глаза
- Сообщения: 40
- Зарегистрирован: Ср мар 25, 2009 22:05:46
- Откуда: Kirovohrad -> Ukraine
- Контактная информация:
Простой дверной звонок на МК
Доброго времени суток. Вот погулял по форуму поискал похожие темы, ну есть дверной звонок с ММС картой - это слишком навороченный, и есть ребята советуют купить без проводной китайский. Ну оба варианты мне не подходят. Мне нужно, зашить в мегу 8 простую 8битную мелодию и чтобы она проигрывала ее при нажатии на кнопку и переходила в ждущий режим. Как бы вы мне помогли с аналоговой частью?... Дело в том, что хочу питать устройство от батареек ААА... Как бы мне реализовать режим ожидания... Или может, че-то похожее, кто-то видел - дайте ссылку...
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Простой дверной звонок на МК
На восемь выходов подключайте простенький ЦАП 2R-R, с него на дин. головку. Вход, подключенный к кнопке звонка, параметрируете как вход выхода из спящего режима, а то и просто на сброс, т.е. reset. В IBM PC делаете/преобразуете мелодию в формат 8-бит и перегоняете во флеш МК. Поочередным выставлением байт файла на порте ЦАПа наслаждаетесь музыкой, а по окончании усыпляете МК командой sleep.
Docendo discimus
-
FredyInKR
- Открыл глаза
- Сообщения: 40
- Зарегистрирован: Ср мар 25, 2009 22:05:46
- Откуда: Kirovohrad -> Ukraine
- Контактная информация:
Re: Простой дверной звонок на МК
Погулял по форуму нашел проект музыкальной шкатулки на Си... Не могу понять, там файл прошивки не от этой программа что-ли... У меня в протеусе проигрывает что то вроде: "Ту-лю-лю" и все. А как под другую мелодию ее переписать??? Че-то не пойму...
- Вложения
-
- 03.rar
- (95.04 КБ) 288 скачиваний
-
FredyInKR
- Открыл глаза
- Сообщения: 40
- Зарегистрирован: Ср мар 25, 2009 22:05:46
- Откуда: Kirovohrad -> Ukraine
- Контактная информация:
Re: Простой дверной звонок на МК
Ребята хелп. Программа играет только первые три ноты. Все ноты работают но больше 3-х не слышно...
Компилятор: код визион 2.04.4а...
Компилятор: код визион 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: Простой дверной звонок на МК
Вот доработал схему:

Зн. наверное, что-то с компилятором. Дело в том, что короткая мелодия вообще не играет а длинная только пару нот...
Зн. наверное, что-то с компилятором. Дело в том, что короткая мелодия вообще не играет а длинная только пару нот...
- Вложения
-
- cxema.jpg
- (50.59 КБ) 2885 скачиваний
-
FredyInKR
- Открыл глаза
- Сообщения: 40
- Зарегистрирован: Ср мар 25, 2009 22:05:46
- Откуда: Kirovohrad -> Ukraine
- Контактная информация:
Re: Простой дверной звонок на МК
Нашел причину неисправности, вот как поправить не знаю
Программа не играет короткие ноты, допустим короткая задержка: P(1/16) . на этой части замолкает Если же так: P(1/8) то все нормально. Вот только медленно как-то. Подскажите пожалуйста где покопать???
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Простой дверной звонок на МК
Ну почему так:
и свалилось в итоге к 1битной?
FredyInKR писал(а):8битную мелодию
и свалилось в итоге к 1битной?
Docendo discimus
-
FredyInKR
- Открыл глаза
- Сообщения: 40
- Зарегистрирован: Ср мар 25, 2009 22:05:46
- Откуда: Kirovohrad -> Ukraine
- Контактная информация:
Re: Простой дверной звонок на МК
нет /16 это делитель. Не разрядность мелодии а задержка. Чем выше делитель тем короче тон... Вообщем я почти разобрался. Давно на сях ничего не писал.
-
FredyInKR
- Открыл глаза
- Сообщения: 40
- Зарегистрирован: Ср мар 25, 2009 22:05:46
- Откуда: Kirovohrad -> Ukraine
- Контактная информация:
Re: Простой дверной звонок на МК
Пообщался с автором. Очень приятный человек, между прочим. Прислал он мне доработанную версию программы. Разобрался нормально все работает. То у меня с протеусом че-то не то. Глюченный он какой-то. Теперь есть проблема. Хочу сделать с этого всего хлама полифонический дверной звонок. С аналоговой частью почти готово с программой тоже. Есть одна маленькая проблемка: не хватает мне 8Кбайт.
зн. на 2мелодии места хватает на больше нет. Теперь вопрос: как к меге прекрутить РОМ у меня есть HY62256ALJ-70 - это ЧМОС на 32Кбайт. Как в него залить чары через COM или LPT? А потом считать мегой???
char mel1[]={"первая часть, первой мелодии"};
зн. на 2мелодии места хватает на больше нет. Теперь вопрос: как к меге прекрутить РОМ у меня есть HY62256ALJ-70 - это ЧМОС на 32Кбайт. Как в него залить чары через COM или LPT? А потом считать мегой???
-
FredyInKR
- Открыл глаза
- Сообщения: 40
- Зарегистрирован: Ср мар 25, 2009 22:05:46
- Откуда: Kirovohrad -> Ukraine
- Контактная информация:
Re: Простой дверной звонок на МК
Доделал я сей девайс.
Транзистор в схеме КТ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
Транзистор в схеме КТ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
Re: Простой дверной звонок на МК
Нужна подсказка! проблема: китайский радиозвонок! при нажатии кнопки у соседей за 50 метров звонок играет и у меня и наоборот! как решить проблему?
Re: Простой дверной звонок на МК
Поломай соседям кнопку. Они купят себе новый звонок.)))