roboforum.ru

Технический форум по робототехнике.

Рюшечки для робота

Рюшечки для робота

SSG » 21 июл 2007, 17:01

Давайте поделимся всякими рюшечками - мелкими приятными, пусть почти бесполезными функциями конструкций.
НАПРИМЕР
С целью увеличения интересности подпольно спаянного и в тайне запрограммированного робота использую проигрывание мелодий AVR-кой на пьезопищалку от китайских игрушек или будильников.
Пищалка подключается плюсиком через керамический конденсатор 0,47 мкФ к "+" питания (VCC) а минусовой лапкой - к ноге МК.
Этот традиционный способ, упомянтый еще в книге Предко, наверное обусловлен тем, что старые модели контроллеров могли выдерживать втекающие токи бОльшие, чем вытекающие.
В современных мегах, вроде бы одинаковые (не берусь утверждать на 100%), поэтому можно плюсом пищалки к ноге МК, а минусом через конденсатор - на землю.
Если использовать динамик, нужно будет юзать транзистор.
Частоты нот первой октавы в герцах:
до - 130,8
до# - 138,6
ре - 146,8
ре# - 155,6
ми - 164,8
фа - 174,6
фа# - 185,0
соль - 196,0
соль# - 207,7
ля - 220,0
ля# - 233,1
си - 246,9
Частоты одинаковых нот соседних октав отличаются в два раза. На слух на пищалке более приятно звучат ноты второй и третьей октав.
Генерацию можно осуществить в цикле for (cvarv):
Код: Выделить всёРазвернуть
...
 for (i=1;i<100;i++) {PORTD.7=~PIND.7; delay_us(1911);}; //до
 for (i=1;i<100;i++) {PORTD.7=~PIND.7; delay_us(1702);}; //ре
 for (i=1;i<100;i++) {PORTD.7=~PIND.7; delay_us(1517);}; //ми
 for (i=1;i<100;i++) {PORTD.7=~PIND.7; delay_us(1432);}; //фа
 for (i=1;i<100;i++) {PORTD.7=~PIND.7; delay_us(1276);}; //соль  
 for (i=1;i<100;i++) {PORTD.7=~PIND.7; delay_us(1136);}; //ля
 for (i=1;i<100;i++) {PORTD.7=~PIND.7; delay_us(1012);}; //си
...

При этом частоты нужно пересчитать в периоды задержек между инвертированием сигнала на лапке контроллера.
Например для ноты до второй октавы частота равна 130,8*2=261,6 Гц. Период колебаний равен 1/261,6=3,8227 миллисекунд.
Сигнал на ножке МК нужно изменять через промежуток времени в 2 раза меньший, т.е. 3,8227/2=1,911 миллисекунд или
1911 микросекунд.
Выражение в условии выполнения цикла i<100 определяет длительность проигрывания ноты, т.е. число полупериодов колебаний.
Для звучания ноты до 0,5 секунды нужно примерно 0,5/0,001911=262 раза изменить сигнал на лапе, что и следует указать в операторе цикла.
Разработчики cvarv рекомендуют отключать прерывания перед использованием функций задержек delay_us и delay_ms (они используют сторожевой таймер).
Последняя, по-моему, реализована кривовато, т.к. задержи больше, чем задаются, а первая - потому что длительность нельзя передавать как параметр в процедуру (должна быть постоянной), а очень хочется.
Для подачи звуковых сигналов можно использовать и ШИМ, чтобы разгрузить контроллер.
PS. Звук очень удобно юзать для отладки и диагностики.

Master » 21 июл 2007, 23:17

На radiokot.ru есть разные мелодии для таких вот писчалок. Тема кажись там называется звонок патриот.

SSG » 22 июл 2007, 09:23

Очень удобно переделывать мелодии для старых телефонов, поддерживающих нотную запись мелодий.
Кучка там:
http://sotovaya.com/notes-nokia.html

Stillsly » 22 июл 2007, 11:38

господа , а может быть возьмем сразу на уровень выше..скажем из это сделать голосовой модуль для робота..http://pol-sem.narod.ru/polymuson/polymuson.htm  :lol:

Myp » 22 июл 2007, 11:42

ковокс никогда не умрёт =)

а вобще это уже не рюшечка к девайсу а отдельный самостоятельный девайс

SSG » 22 июл 2007, 19:11

Неплохая ссылочка! А чего, очень даже неплохо, если робот будет ойкать при столкновении с препятствием или ням-ням просить при разрядке аккумулятора.  :)

-= Александр =- » 23 июл 2007, 03:29

Вот вам еще ссылочка на затравку: прямой цифровой синтез (ака DDS) на АВР и ковоксе!

http://www.myplace.nu/avr/minidds/index.htm

А голос - это надо чтоб кто-то сел и надиктовал все русскоязычные слоги хотя-бы в двух-трех интонациях (говорится слово и из него вырезается слог) - тогда будет более-менее связная речь. Пишем все это дело на SD подходящего объема - и дело в шляпе!  :wink:

Stillsly » 23 июл 2007, 16:06

SSG писал(а):Неплохая ссылочка! А чего, очень даже неплохо, если робот будет ойкать при столкновении с препятствием или ням-ням просить при разрядке аккумулятора.  :)

угу , я уже взял на вооружение схему, а также разные сэмплы-фразы Бэндера Би Родригеза думаю будет весело  :lol:

Re: Рюшечки для робота

Radist » 13 фев 2010, 09:44

Вот эта вещица поинтереснее будет, там и исходники есть. Минимум деталей, максимум возможностей.
http://elm-chan.org/works/sd8p/report.html

Re: Рюшечки для робота

yak-40 » 13 фев 2010, 11:56

SSG писал(а):Давайте поделимся всякими рюшечками

Вот моя рюшечка :)
Мега8+транзистор+динамик от нокии.


Добавлено спустя 8 минут 35 секунд:
Вот ещё одна :)
http://roboforum.ru/viewtopic.php?f=88&t=6729&start=240

Re: Рюшечки для робота

CiSi » 15 фев 2010, 00:28

"Мурка" - для робота самое то! :)
Еще и упал в конце - вобще круто! :Yahoo!:

Re: Рюшечки для робота

CiSi » 23 фев 2010, 23:44

Код: Выделить всёРазвернуть
void Beep()
{
long i;
for (i=1;i<100;i++) {PORTD.7=~PIND.7; delay_us(1911);}; //до
  for (i=1;i<100;i++) {PORTD.7=~PIND.7; delay_us(1702);}; //ре
  for (i=1;i<100;i++) {PORTD.7=~PIND.7; delay_us(1517);}; //ми
  for (i=1;i<100;i++) {PORTD.7=~PIND.7; delay_us(1432);}; //фа
  for (i=1;i<100;i++) {PORTD.7=~PIND.7; delay_us(1276);}; //соль 
  for (i=1;i<100;i++) {PORTD.7=~PIND.7; delay_us(1136);}; //ля
  for (i=1;i<100;i++) {PORTD.7=~PIND.7; delay_us(1012);}; //си   

while(1);
}

Генерацию осуществляю такой процедурой, но что то неиграет.
Правельно ли я ее произвожу.

Re: Рюшечки для робота

yak-40 » 24 фев 2010, 00:11

Вот код мурки :)
Вызываешь функцию music(); и всё заработает...
Код: Выделить всёРазвернуть
 flash char note[47][2]=
    {
   157,50,
   157,100,
   159,25,
   157,25,
   143,50,
   157,100,
   0,25,
   170,50,   
   191,100,
   202,25,
   191,25,
   202,50,
   227,100,
   0,50,
   114,50,
   114,100,   
   120,25,
   114,25,
   101,50,
   114,100,
   120,25,
   114,25,
   101,100,

   96,50,
   100,50,
   114,50,
   0,25, 
   120,25,
   100,50,
   114,50,
   0,100, 
   114,50,
   127,50,
   143,50,
   152,50,
   127,50,
   143,50,
   0,100,
   152,50,   
   152,50,
   127,50,
   143,50,
   152,50,
   170,100,
   202,25,
   191,25,
   227,100 
   };
   
///////////////////////////////////////////////////////////
music()
{   
      for(i=0; i<23; i++)
        {
        OCR2=note[i][0];
        delay_ms(note[i][1]);     
        }
      OCR2=0;   
}
///////////////////////////////////////////////////////////

Re: Рюшечки для робота

CiSi » 24 фев 2010, 00:19

Динамик надоно на ножку ШИМ-а заводить, я правильно понял?

Re: Рюшечки для робота

yak-40 » 24 фев 2010, 00:37

На выход второго таймера (ОС2) в Меге8 это PB3.
Настройка таймера 2:
Код: Выделить всёРазвернуть
ASSR=0x00;
TCCR2=0b00011010;
TCNT2=0x00;
OCR2=0x00;


Rambler\'s Top100 Mail.ru counter