Цей проект- проста музична іграшка, здатна видавати сім нот. У пристрої вісім кнопок: сім для нот і ще одна – для гри. Спочатку іграшка видає випадкову ноту (якщо натиснути восьму кнопку) і спалахує відповідний цій ноті світлодіод. Потім ви натискаєте на кнопку, намагаючись вгадати прозвучала ноту. Якщо ви вгадали правильно, гра переходить на новий рівень і видає дві ноти, причому перша нота – вгадана вами, а друга вибирається випадковим чином. Ви правильно визначаєте ці ноти і т. Д. Якщо ви помилилися, то можете почати все заново. Якщо ви вгадали, то переходите на наступний рівень. Подібна музична іграшка – хороший тест для ваших музичних здібностей. Якщо ви зможете запам’ятати і відтворити тривалу послідовність випадкових незв’язаних нот, значить, ви справжній віртуоз. Блок-схема музичної іграшки наведена на рис. 6.14.

Рис. 6.14. Блок-схема музичної іграшки

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

Мета проекту-створити музичну іграшку з інтерфейсом з восьми кнопок, семи світлодіодів, а також семисегментного індикатора на дві цифри. Пристрій забезпечений звуковим підсилювачем і динаміком для відтворення нот. Система живиться від батарейок (для портативності).

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

Принципова схема пристрою зображена на рис. 6.15. Харчування можливо від зовнішніх батарей або зовнішнього джерела з напругою від 6 до 12 В. У схемі передбачений стабілізатор напруги на 5 В (LP2940). У пристрої використовуються: мікроконтролер Tiny861, семисегментний індикатор на дві цифри (DIS1 і DIS2), а також сім світлодіодів (LED2- LED8). Індикатори виконані із загальним анодом, коммутируются через MOSFET-транзистори ΤΙ, Т2 і ТЗ (NDS356A) і активізуються один за іншим за допомогою сигналів ROW1, ROW2 і ROW3 мікроконтролера.

Вісім кнопок зібрані в матрицю Зх 3. Микроконтроллер активізує один з трьох рядів кнопок за допомогою контактів ROW1, ROW2 і ROW3 і перевіряє натиснення кнопок шляхом читання з контактів COL1, COL2 і COL3.

Схема формує звуки за допомогою ШІМ-виходу РВЗ таймера Timer 1, до якого підключений низькочастотний RC-фільтр (R9-C5). З виходу фільтра сигнал подається на звуковий підсилювач LM386 через резистивний дільник (R10-R12). До підсилювача через конденсатор С7 підключений невеликий динамік.

У схемі також передбачений роз’єм ISP (JP1) для програмування мікроконтролера.

Рис. 6.15. Принципова схема музичної іграшки

Конструкція

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

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

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

Відкомпільований вихідний код (разом з файлом MAKEFILE) можна завантажити за посиланням: www.avrgenius.com/tinyavrl.

Тактова частота дорівнює 8 МГц. Контролер запрограмований за допомогою STK500 в режимі програмування ISP. Програма написана на мові С, відкомпільована за допомогою компілятора AVRGCC в AVR Studio і розділена на наступні частини:

□ Ініціалізація регістрів PORT і DDR.

□ Ініціалізація дисплея.

□ Переривання по переповнення таймера.

□ Мультиплексування світлодіодів і семисегментний дисплей.

□ Генерування випадкових чисел.

□ Генерування звуків за допомогою ШІМ.

□ Сканування кнопок.

Генерування випадкового числа- важливе завдання нашої програми. Нам потрібно число від 0 до 6 (для цього використовується 8-розрядний лічильник TCNTOL). Від значення лічильника (яке може бути будь-яким від 0 до 255) береться mod7, щоб отримати результат від 0 до 6. Випадкове число генерується кожен раз, коли викликається функція randomizeO, а результат зберігається в масиві pattern []. Функція викликається 50 разів (число рівнів в грі). Лістинг 6.11 містить фрагмент коду.

void randomizeO

// Генерування випадкового числа

{

k=k%21;

pattern[0]=random[k]; while (j<NUM)

{ k=TCNT0L%7;

pattem [j] = k; // Збереження випадкових чисел при кожному запуску гри

з ++;

}

}

Timerl служить для генерування необхідних частот (див. Табл. 6.1).

Таблиця 6.1. Таблиця частот

Нота

Частота, Гц

Значення OCR1C

До

240

130

Ре

270

116

Мі

300

104

Фа

320

98

Сіль

360

87

Ля

400

78

Сі

450

69

Меандр з уже згаданої частотою, що залежить від значення ocric, генерується за допомогою ШІМ. Одержувану частоту можна розрахувати за формулою:

де fdk – це масштабована частота, подана на Timerl. Звідси можна отримати N. Наприклад, для ноти “До” з частотою 240 Гц і попередніми поділом на 256 значення ocric одно:

Середнє значення фіксовано на рівні 0,75. Кожен звук генерується протягом певного обмеженого періоду часу. Потім звук вимикається шляхом відключення Timer 1.

Код генерування звуків ілюструє лістинг 6.12.

#ifndef tone idefine tone

#define sa 130 // 240 Гц #define re 116 // 270 Гц #define ga 104 // 300 Гц ttdefine ma 98 // 320 Гц #define pa 87 // 360 Гц #define dha 78 // 400 Гц #define ni 69 // 450 Гц #define dc 0.75 // середнє значення void timerlinit(void)

{

TCCR1AI = (1«PWM1B) | (1<<C<DM1B1) ;

// Активізація ШІМ TCCR1BI = (1 «CS13) I (1« CS10);

// Попереднє поділ на 256

}

void toneon(int N)

{ timerlinit(); switch (N)

{

case 0: OCRlC=sa;

OCRlB=dc*OCRlC; break;

case 1: OCRlC=re;

OCRlB=dc*OCRlC; break;

case 2: OCRlC=ga;

OCRlB=dc*OCRlC; break;

case 3: OCRlC=ma;

OCRlB=dc*OCRlC; break;

case 4: OCRlC=pa;

OCRlB=dc*OCRlC;

break;

case 5: OCRlC=dha;

OCRlB=dc *0CR1C; break;

case 6: OCRlC=ni;

OCRlB=dc*OCRlC; break;

}

}

void toneoffO

{

TCCRlA=0x00;

}

#endif

Після початку гри мікроконтролер випадковим чином видає звук з таблиці. Користувач відповідає натисканням кнопки, відповідної звуку. Мікроконтролер перевіряє, чи правильну кнопку натиснув користувач (Лістинг 6.13).

void checktone(int η)

// Перевіряє правильність послідовності звуків

{

toneon(n);

if(n==pattern[count])

// Якщо натиснута вірна кнопка {ledinit (n, u, t); count ++;

// Підраховує кількість натиснутих кнопок

}

else

{

ledoff();

led [б] = led [13] = 1;

_delay_ms(2 0 0); toneoff();

}

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

Для включення іграшки необхідно подати на неї відповідне напруга живлення і натиснути кнопку S8. Це запустить генерування першої випадкової ноти. Спробуйте вгадати ту ж саму ноту, натиснувши відповідну кнопку (S1-S7), і продовжуйте в тому ж дусі.

Висновок

У цій главі ми описали декілька пристроїв, що генерують звуки. Ці пристрої можна використовувати як окремо, так і спільно з іншими, наприклад, для розширення функцій світлодіодних свічок до дня народження. Тональний генератор можна використовувати спільно з проектом серця, що б’ється, щоб при зміні частоти мерехтіння світлодіодів змінювався і звуковий сигнал. На основі пристроїв цієї глави можна створювати і більш цікаві іграшки. У наступному розділі ми розглянемо декілька проектів, заснованих на альтернативних джерелах енергії.

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