Проект tinyAVR 30. Проигрыватель рингтонов

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

RTTL — это популярный формат для записи рингтонов мобильных телефонов, созданный компанией Nokia. Рингтон записывается как текстовый файл при помощи кодов, которые указывают ноты и их продолжительность. Любой файл в формате RTTL содержит название рингтона, продолжительность (d), октаву (о), ритм (Ь) и сами ноты. Эта информация декодируется при воспроизведении рингтона. В данном проекте проигрыватель рингтонов реализован на микроконтроллере Tiny861. Динамик подключен к мощному звуковому усилителю TDA2020. Блок- схема проигрывателя показана на рис. 6.9.

Рис. 6.9. Блок-схема проигрывателя рингтонов

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

Цель проекта— создать декодер и проигрыватель RTTL на основе микроконтроллера AVR. Формат RTTL был выбран потому, что в Интернете имеется большое количество рингтонов, которые можно скачать, записать в память микроконтроллера и воспроизводить при помощи такого проигрывателя.

Описание проекта

Аппаратная часть проекта точно такая же, что и в проекте будильника для школьников (см. проект 19 из главы 4).

Принципиальная схема устройства изображена на рис. 6.10. В устройстве необходим DIP-переключатель, который будет выбирать мелодию из имеющихся в памяти микроконтроллера. Принципиальная схема соответствующей цепи приведена на рис. 6.11. DIP-переключатели (их изображено четыре, но используются только три) позволяют пользователю выбрать один из восьми рингтонов, хранящихся в памяти программ микроконтроллера. Для запуска воспроизведения выбранного рингтона необходимо нажать кнопку S1.

Рис. 6.10. Принципиальная схема проигрывателя рингтонов

Рис. 6.11. Принципиальная схема DIP-переключателей для проигрывателя рингтонов

Конструкция

Компоновку платы в программе EAGLE (и принципиальную схему) можно скачать по ссылке: www.avrgemus.com/tinyavrl.

Печатная плата односторонняя (на стороне компонентов есть всего несколько перемычек). Обе стороны платы показаны на рис. 6.12 и 6.13.

Программирование

Откомпилированный исходный код проекта (вместе с файлом MAKEFILE) можно скачать по ссылке: www.avrgenius.com/tinyavrl.

Тактовая частота равна 8 МГц. Контроллер запрограммирован при помощи STK500 в режиме программирования ISP. Самые важные фрагменты кода приведены в листингах 6.9-6.12. Как уже упоминалось, формат RTTL— это текстовый файл с информацией о характеристиках песни. В листинге 6.7 приведена простая мелодия в формате RTTL. В начале кода указана следующая информация: название песни, затем продолжительность по умолчанию (d), октава (о), ритм (ь). После этого идет информация обо всех нотах.

Happy Birthday Song: d=4, o=5, b=12 5: 8g.,

Хбд^д.сб, 2b, 8g., 16g,a,g,d6,2c6,

8g. ,16g/g6/e6/c6/b/a/8f6. ,16f6,e6, c6/d6/2c6/ 8g., 16g,a,g,c6,2b, 8g., 16g, a,g,d6,2c6,8g., Хбд^б^б^б^а,

8f6.,16f6,e6,c6,d6,2c6

Песни сохраняются во Flash-памяти микроконтроллера при помощи макроса

PROGMEM (ЛИСТИНГ 6.8).

char songl[] PROGMEM = "Happy Birthday Song:d=4,o=5,b=125:8g.,16g, a,g,сб,

2b,8g.,16g,a,g,d6,2c6,8g.,16g,g6,e6, сб,b,a,8f6.,16f6,еб,сб,d6,2c6,8g.,

16g,a,g,c6,2b,8g.,16g,a,g,d6,2c6,

8g.,16g,g6,e6,c6,b,a,8f6.,16f6,e6, сб,d6,2c6";

Наша первая задача — расшифровать этот язык и получить нужную информацию о каждой ноте (т. е. ее продолжительность и скорость воспроизведения). Частоты нот хранятся в массиве top [ ]. В листинге 6.9 приведен код, который декодирует этот формат в соответствии со спецификациями RTTL.

// формат: d=N, o=N,b=NNN:

// найти начало (пропустить название и тому подобное) while (pgm_read_byte (р) != ‘ : ‘)

р++; // пропустить ‘:’

р++; // перейти к ‘d’

// получить продолжительность по умолчанию i f (pgm_read_by t е (p) == ‘ d’)

{

p++; // пропустить "d"

p++; // пропустить " = "

num = 0;

while (isdigit (pgm_read_byte (p)))

{

num = (num * 10) + (pgm_read__byte (p++) – ‘ O’);

}

if (num > 0)

default_dur = num; p++;  // пропустить двоеточие

}

// получить октаву по умолчанию if(pgm_read_byte(p) == ‘o’)

{

p++; // пропустить "о

р++; // пропустить "="

num = pgm_read_byte(p++) –    10′;

if (num >= 4 ScSc num <=8)

default_oct = num;

p++; // пропустить двоеточие

}

// получить значение ВРМ if (pgm_read__byte (р) == ‘b’)

{

р++; // пропустить "b="

р++; // пропустить Hb="

num = 0;

while (isdigit (pgm_read_byte (p)))

{

num = (num * 10) + (pgm_read_byte (p++) – * 0′);

}

bpm = num;

p++; // пропустить двоеточие

}

// BPM — это число четвертных нот в минуте wholenote = (((60.0 * 1000.0) / (float)bpm) * 4.0);

// это время полной ноты (в миллисекундах)

// начало цикла ноты whi1е(pgm_read_bytе(р))

{

// сначала получить длительность ноты (если она есть) num = 0;

while (isdigit (pgm_read__byte (p) ))

{

num = (num * 10) + (pgm_read__byte (p++) – ‘0’);

}

if (num)

duration = wholenote / (float)num; //миллисекунды воспроизведения ноты else

duration = wholenote / (float)default_jdur;

// нам нужно будет проверить, не удлиненная ли это была нота // теперь получим ноту note = 0;

switch (pgm_read_byte (р))

{

case ‘с’: note = 1;

break; case 1d’: note = 3; break; case ‘e’: note = 5; break; case ‘f’: note = 6; break; case ‘g’: note = 8; break; case ‘a’: note = 10; break; case ‘b’: note = 12; break;

case 1p’: note = 0;

}

p++;

// теперь нужно сосчитать возможный диез ‘#’ if(pgm_read_byte(р) == ‘#’)

{

note++;

р++;

}

octave = top[note];

// теперь нужно сосчитать возможную удлиненную ноту if(pgm_read_byte(р) ==

{

duration += duration/2;

Р++;

}

// теперь получим тональность if(isdigit(pgm_read_byte(р)))

{

scale = pgm_read_byte(p) – ‘O’;

P++;

}

else

{

scale = default_oct;

}

/* Обработать октаву */ switch (scale)

{

case 4 : /* Ничего не делаем */ // x»y = x/2*y break;

case 5 : /* %2 */ octave = octave » 1; break;

case 6 : /* %4 */ octave = octave » 2; break;

case 7 : /* %8 */ octave = octave » 4; break;

case 8 : /* %16 */ octave =4 octave » 8; break;

}

if(pgm_read_byte(p) == ‘ , ‘)

p++; // пропустить запятую перед следующей нотой (или мы уже в конце)

После того как мы получили тональность и продолжительность ноты — мы воспроизводим ее в течение указанной длительности. Это делается при помощи двух таймеров: TimerO задает длительность ноты (в режиме переполнения), Timerl (в режиме ШИМ) вырабатывает меандр нужной частоты при помощи установки значения тор в регистре ocric (листинг 6.10).

DDRB |= (1«РВЗ);     //Настройка выходного контакта канала ШИМ

TCCR0A &= ~(1«WGM00);       //Режим Normal

TCCROB |= ((1«CS02) I (1«CS00) ) ; //Предварительный делитель 1024 if (note) //Если это нота (

TCCRlA |= ( (1«СОМ1В1) | (1«PWM1B) ) ;//Неинвертирующий режим, быстрая ШИМ TCCR1B |= ((1«CS13) | (1«CS10) ) ; //Предварительный делитель 256 TCCR1C |= (1«СОМ1В1) ; //Очистить при совпадении

TCCR1D &=~ ( (1«WGM11)   |      (1«WGM10) ) ;

0CR1C = octave;             //настройка значения Top

OCR1B = (0CR1C»1) ;         //среднее значение 50%

TCNTOL = 0; for (;;)

{

if(TCNTOL >= 78)      //проверка длительности

{

duration = duration – 10.0;

TCNTOL = 0;

}

if(duration <= 0.00) break;

}

TCCR0B = 0x00;

}

else       //Если случается пауза

{

TCNTOL = 0; for (;;)

{

if(TCNTOL >= 78) //Проверка длительности

{

duration = duration – 10.0;

TCNTOL = 0;

}

if(duration <= 0.00) break;

}

TCCR0B = 0x00;

}

Работа устройства

В память программ микроконтроллера загружено восемь песен в формате RTTL. Выберите определенную мелодию с помощью DIP-переключателей и нажмите кнопку S1. Устройство начнет воспроизводить песню. Закончив воспроизведение, система останавливается. Для воспроизведения другой песни (или для повтора той же самой) нужно опять нажать кнопку S1.

Источник: Гадре, Д., Занимательные проекты на базе микроконтроллеров tinyAVR / Дхананья Гадре, Нигул Мэлхотра: Пер. с англ. — СПб.: БХВ-Петербург, 2012. — 352 с.: ил. — (Электроника)

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

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