Проект tinyAVR 31. Музыкальная игрушка

December 14, 2014 by admin Комментировать »

Этот проект— простая музыкальная игрушка, способная выдавать семь нот. В устройстве восемь кнопок: семь для нот и еще одна — для игры. Сначала игрушка выдает случайную ноту (если нажать восьмую кнопку) и загорается соответствующий этой ноте светодиод. Затем вы нажимаете на кнопку, пытаясь угадать прозвучавшую ноту. Если вы угадали правильно, игра переходит на новый уровень и выдает две ноты, причем первая нота — угаданная вами, а вторая выбирается случайным образом. Вы правильно определяете эти ноты и т. д. Если вы ошиблись, то можете начать все заново. Если вы угадали, то переходите на следующий уровень. Подобная музыкальная игрушка — хороший тест для ваших музыкальных способностей. Если вы сможете запомнить и воспроизвести длительную последовательность случайных несвязанных нот, значит, вы настоящий виртуоз. Блок-схема музыкальной игрушки приведена на рис. 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 с.: ил. — (Электроника)

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты