Цей проект демонструє спосіб отримання звукового сигналу потрібної частоти. Звуки генеруються за допомогою внутрішнього таймера мікроконтролера. Здається також тривалість відтворення звукового сигналу. Коли мікроконтролер відтворює послідовність таких звуків, звучить мелодія.

Специфікація проекту

Мета проекту-створити схему на основі мікроконтролера TinyAVR, яка гратиме якусь мелодію (зберігається в пам’яті програм мікроконтролера). Мелодія визначається послідовністю пар значень “Звук- тривалість”. Мікроконтролер читає пари і видає вказаний звук необхідної тривалості. Через простоту схеми подібний пристрій не може одночасно відтворювати кілька звуків (як це необхідно для складного музичного твору). Апаратна частина проекту – схема на основі мікроконтролера Tiny45 і невеликий динамік. До микроконтроллеру підключений підсилювач типу Н-міст, тому звук дуже гучний. Наявність фоторезистора дозволяє використовувати пристрій як тональний генератор і як вдосконалену сигналізацію для холодильника. Блок-схема системи приведена на рис. 6.5.

Рис. 6.5. Блок-схема тонального генератора

Опис пристрою

На рис. 6.6 зображена принципова схема тонального генератора і вдосконаленою сигналізації для холодильника. Чотири транзистора зліва – це Н-міст. На нього надходять два вихідних сигнали з мікроконтролера Tiny45 (РВО і РВ1), на які подається ШІМ-сигнал. Причина вибору цих сигналів для порушення Н-моста полягає в тому, що коли схема не повинна видавати ніяких звуків – ці два виходи відключаються (встановлюються або в 0, або в 1), Н-міст не споживає струму. На виході Н-моста встановлений LC-фільтр (котушки L1 і L2 і конденсатори СЗ і С4). Невеликий динамік (8 Ом) підключений до виходу фільтрів через роз’єм SL1.

Рис. 6.6. Принципова схема тонального генератора (або сигналізації для холодильника)

Контакти мікроконтролера РВ2 і РВЗ коммутируются за допомогою перемичок JP1 і JP2. Для тонального генератора кнопка S1 підключається до РВЗ, a DIP- перемикач S2-1 – до РВ2. У проекті модифікованої сигналізації для холодильника фоторезистор (LDR) підключається до РВЗ, а світлодіод (LED1) – кРВ2.

При роботі пристрою як тональний генератор мікроконтролер чекає натискання кнопки S1 і потім зчитує стан контактів РВ2 і РВ4. Вони підключені до двох контактам DIP-перемикача, що дозволяє користувачеві вказати на один з чотирьох (зберігаються в пам’яті програм) масивів даних. Кожен масив містить інформацію для опису звуків та їх тривалості (які складають якусь мелодію). Мікроконтролер генерує звук на контакті РВО або РВ1 (який підключений до Н-мосту), формуючи таким чином потрібний звук. Після того як весь масив відтворений, контролер знову чекає натискання кнопки. Щоб вибрати іншу мелодію, потрібно (до натискання кнопки S1) змінити положення DIP-перемикача.

Схема живиться від зовнішнього джерела постійної напруги (від 3 до 6 В). Дві або три лужні батарейки будуть цілком відповідним джерелом живлення. Діод D1 захищає схему від пошкодження при неправильній полярності підключення джерела живлення.

Конструкція

Компонування плати в програмі EAGLE (а також її принципову схему) можна завантажити за посиланням: www.avrgenius.com/tinyavrl.

Друкована плата однобічна (на стороні компонентів є всього декілька перемичок). Обидві сторони плати показані на рис. 6.7 і 6.8.

Програмування

Найважливіші фрагменти коду наведені в лістингах 6.1-6.4. Звук визначається тоном і тривалістю. Тон- це певна частота, яку потрібно подавати на динамік протягом певного проміжку часу. Звуки в нашій програмі записані за допомогою структури, що складається з елементів duration і frequency (тип даних – ціле без знака).

Лістинг 6.1

struct _Note

{

unsigned int duratioriMS; unsigned int frequency;

};

Мелодії записані в Flash-пам’яті мікроконтролера. Інформація про мелодії зберігається в макросі progmem (лістинг 6.2).

struct _Note songl[] PROGMEM = {

// День народження

{ 360, 784},{ 120, 784}/{ 480, 440},

{ 480, 784},{ 480, 1048},{ 960, 494},

{ 360, 784},{ 120, 784},{ 480, 440},

{ 480, 784},{ 480, 1176},{ 960, 1048},

{ 360, 784},{ 120, 784},{ 480, 1568},

{ 480, 1320},{ 480, 1048},{ 480, 494},

{ 480, 440},{ 240,1396}, { 480, 0},

{ 120, 1396}, { 480, 1320}, { 480, 1048}, { 480, 1176},{ 960,1048 },{0,0}

};

Функція piay_tone_p () приймає в якості аргументу покажчик * р, який перебирає масив мелодії _Note (видаючи тим самим значення тривалості та частоти). Тепер нам потрібен спеціальний макрос pgm_read__word для читання Flash-пам’яті (лістинг 6.3). Довжина слова мікропроцесора AVR дорівнює двом байтам, як і у цілих чисел.

до 1НГ t

duration = pgm_read_word(p) ;

Р ++;

note = pgm_read_word(p) ;

P++;

top = (int)(31250/note);

Після отримання частоти і тривалості звуку прийшов час створити меандр, відповідний цим параметрам. Це робиться за допомогою двох таймерів. TimerO функціонує в нормальному режимі визначення тривалості, a Timerl працює в режимі ШІМ для формування меандру потрібної частоти (шляхом установки значення тор регістра output compare register). Регістр ocric зберігає верхнє значення, що визначає частоту. Якщо значення частоти дорівнює нулю, то це пауза. Тривалість паузи визначається відповідною змінною. ocria – це регістр для установки середнього значення, яке постійно дорівнює 0,5.

DDRB | = ((1 «РВ0) | (1« РВ1));

TCCROB | = ((1 «CS02) | (1« CS00)); // Попередній дільник 1024 TCCR0B & = ~ (1 «WGM02); // Режим Normal TCCR0A & = ~ ((1 «WGM00) | (1« WGM01));

// Відтворення звуку if (note)

{

TCCR1 |= ( (1«PWM1A) I (1«COM1AO)     |      (1«CS13)     | (1«CS10);

// Попередній дільник 256, режим ШІМ включений OCRIC = top; // Верхнє значення OCRIA = (OCRIC »1); // Середнє значення TCNTO = 0; for (;;)

{

if ( ! (PINB& (1«PB4) ) )

{

flagl = 1; return; λ

if(TCNTO >= 78)

{

duration = duration – 10;

TCNTO = 0;

}

if(duration <= 0) break;

}

TCCROB = 0x00;

}

else

{

TCNTO = 0; for (;;)

{

if ( ! (PINB& (1«PB4) ) )

{

flagl = 1; return;

}

if(TCNTO >= 78)

{

duration = duration – 10; TCNTO = 0;

}

if(duration <= 0) break;

}

TCCROB = 0x00; }

Робота пристрою

Для користування схемою необхідно подати зовнішнє напруга живлення. Переконайтеся в тому, що перемички JP1 і JP2 виставлені правильно. Встановивши перемикачі DIP, виберіть потрібну вам мелодію, а потім натисніть кнопку S1. Схема почне відтворювати пісню. Після закінчення відтворення схема знову буде чекати натискання S1. Пристрій можна поєднати з проектом світлодіодних свічок (підключивши контакт РА1 схеми зі свічками до контакту 1 перемички JP1 і з’єднавши шину заземлення обох схем). Змінена програма проекту світлодіодних свічок (її код є на нашому Web-сайті) запустить відтворення обраної вами пісні після задування всіх свічок. Схему з’єднання двох пристроїв ви можете побачити за посиланням: www.avrgenius.coin / tinyavrl.

Джерело: Гадре, Д., Цікаві проекти на базі мікроконтролерів tinyAVR / Дхананья Гадре, Нігула Мелхотра: Пер. з англ. – СПб .: БХВ-Петербург, 2012. – 352 с .: іл. – (Електроніка)