Воспроизведение нот на PIC

В данной статье мы рассмотрим каким образом можно проигрывать музыкальные ноты при помощи PIC-микроконтроллера. Музыкальные ноты представляют из себя обычные звуковые частоты. И если мы точно знаем частоту определенной ноты, то мы можем запрограммировать микроконтроллер для проигрывания этой ноты через один пин ввода/вывода и звукоизлучатель.
В данном проекте мы рассмотрим проигрывание популярной композиции Happy Birthday To You при помощи микроконтроллера PIC16F628A и пьезоизлучателя.

Немного теории

Итак, как мы выяснили выше, для того, чтобы воспроизвести какую-либо мелодию, необходимо знать звуковые частоты нот. Каждая нота проигрывается с определенной длительностью и между двумя нотами также должна быть определенная длительность паузы. В таблице ниже, приведены частоты нот, начиная с ноты До.

Ноты других октав могут быть получены путем умножения или деления данных частот на 2. К примеру нота До следующей октавы будет иметь частоту 524 Гц. Частоты всех нот можно найти в данной таблице.

Звуки нот могут быть сгенерированы прямоугольным сигналом нужной частоты. Т.о. для того, чтобы воспроизвести ноту при помощи микроконтроллера, нам необходимо знать частоту и длительность. Прямоугольный сигнал может быть сгенерирован на выводе МК при помощи переключения вывода с высокого уровня на низкий и наоборот. Также, можно задействовать ШИМ (широтно-импульсную модуляцию). В данном проекте мы выберем первый способ.

Схемотехника

Схема устройства очень проста. Вывод RB0 микроконтроллера PIC16F628A используется для генерирования прямоугольный импульсов заданной частоты. Т.к. выводы микроконтроллера не могут выдерживать ток более чем 25 мА, то пьезоизлучатель нельзя напрямую подсоединять к выводу МК. Потому используется npn транзистор BC547. Желательно, ещё использовать RC-фильтр, но здесь, для упрощения схемы он не показан.

Программное обеспечение

Генерирование аудио-частот реализовать на mikroC Pro очень просто. В нем уже есть встроенная библиотека для работы со звуком. Библиотека содержит две основные функции:

Sound_Init(char *snd_port, char snd_pin): задает соответствующий вывод микроконтроллера для генерации звука, например:
Sound_Init(&PORTB,0) задаст пин RB0 для вывода звука.

Sound_Play(unsigned freq_in_hz, unsigned duration_ms): Генерирует прямоугольный сигнал

Частоты нот можно задать в массиве или сохранить как постоянный массив в памяти ROM-микроконтроллера. У композиции «Happy birthday to you» не слишком много нот и поэтому мы определим их в integer массив, на mikroC это будет выглядеть так:

/* Hap py Birth Day to you, Hap py birth day to
C4 C4 D4 C4 F4 E4 C4 C4 D4 C4 G4 */
unsigned int notes[] = { 262, 262, 294, 262, 349, 330, 262, 262, 294, 262, 392,

/* you, Hap py Birth Day dear xxxx Hap py birth
F4 C4 C4 C5 A4 F4 E4 D4 B4b B4b A4 */
349, 262, 262, 523, 440, 349, 330, 294, 466, 466, 440,

/* day to you
F4 G4 F4 */
349, 392, 349
};

Подобным образом, длительность каждой ноты композиции задается в другом массиве.

Ниже представлено видео воспроизведения нот на PIC

Скачать исходный код проекта и прошивку вы можете ниже


Список радиоэлементовОбозначение
Тип
Номинал
Количество
ПримечаниеМагазинМой блокнот

МК PIC 8-битPIC16F628A1

Биполярный транзисторBC5471

Кварцевый резонатор4 МГц1

Конденсатор0.1 мкФ1

Конденсатор22 пФ2

Резистор10 кОм1

Резистор1 кОм1

Пьезоизлучатель1
Добавить все

Скачать список элементов (PDF)

Оригинал статьи

Прикрепленные файлы:

Добавить комментарий

Ваш адрес email не будет опубликован.