Проект 10: Управляємо п'єзовипромінювачем: міняємо тон, тривалість, граємо музику

В цьому експерименті ми зробимо генерацію звуків на Arduino c допомогою п'єзовипромінювача.

Необхідні компоненти:

Найпростішим варіантом генерації звуку є використання п'єзовипромінювача показаного на рис. 10.1.


Рис. 10.1. Схема підключення п'єзовипромінювача до Arduino

Приступимо до написання скетчу. Для відтворення мелодії необхідно подавати послідовно звуки певної частоти і тривалості. Для генерації звуків певної частоти і тривалості будемо використовувати Arduino-функцію tone (): one (pin, frequency, duration); Функція tone () генерує на виведення прямокутний сигнал заданої частоти (з коефіцієнтом заповнення 50%). Функція також дозволяє задавати тривалість сигналу. Якщо тривалість сигналу не вказана, він буде генеруватися доти, поки не буде викликана функція noTone (). Значення частот для нот першої і другої октав представлені в табл. 10.1.


Складемо мелодію понотно, занесемо в масив melody [], список тривалостей нот занесемо в масив duration [].


Рис. 10.2. Фрагмент Імперського маршу

Дані з позначенням нот занесемо в масив notes [], а дані з частотами для відповідних нот - в масив frequency []. Вміст скетчу представлено в лістингу 10.1.


// МЕЛОДІЯ - масив нот і масив тривалостей
char melody [] = { 'G', 'G', 'G', 'E', 'H',
'G', 'E', 'H', 'G', '*',
'D', 'd', 'd', 'e', 'H',
'T', 'E', 'H', 'F',
'G', 'G', 'G', 'g', 't', 'e',
'S', 's', 's', '*', 'U', 'r', 'c', 'B',
'H', 'A', 'H', '*', 'E', 'T', 'E', 'F',
'H', 'G', 'H', 'd',
'G', 'G', 'G', 'g', 't', 'f',
'S', 's', 's', '*', 'U', 'r', 'c', 'B',
'H', 'A', 'H', '*', 'E', 'T', 'E', 'H',
'G', 'E', 'H', 'G',
'%', '%'};
int bb [] = {8,8,8,6,2,
8,6,2,8,8,
8,8,8,6,2,
8,6,2,16,
8,6,2,8,6,2,
2,2,4,4,2,8,6,2,
2,2,4,4,2,8,6,2,
8,6,2,16,
8,6,2,8,6,2,
2,2,4,4,2,8,6,2,
2,2,4,4,2,8,6,2,
8,6,2,16,
64,64};
// підключити динамік до pin 8
int speakerPin = 8;
// темп відтворення, ноти, тривалості
int tempo, notes, beats;
// процедура програшу ноти
void playNote (char note, int duration)
{
// масив для найменувань нот в межах двох октав
char names [] = { 'c', 'r', 'd', 's', 'e', 'f', 't', 'g', 'u', 'a', 'b',
'H', 'C', 'R', 'D', 'S', 'E', 'F', 'T', 'G', 'U', 'A', 'B', 'H ',' F '};
// масив частот нот
int tones [] = {261,277,293,311,329,349,370,392,415,440,466,
494, 523,554,587,622,659,698,740,784,830,880,932,988};
// програти тон, відповідний ноті
for (int i = 0; i <sizeof (tones); i ++)
{
if (names [i] == note)
{
tone (speakerPin, tones [i], duration);
}
}
}
void setup ()
{
pinMode (speakerPin, OUTPUT);
tempo = 50; // швидкість відтворення мелодії
}
void loop ()
{
for (int i = 0; i <sizeof (melody); i ++)
{
notes = melody [i];
beats = bb [i];
if (notes == '*')
tone (speakerPin, 0, beats * tempo); // пауза
else
playNote (notes, beats * tempo);
// пауза між нотами
delay (beats * tempo + tempo);
}
}

Порядок підключення:

  1. Підключаємо п'єзоелемент до плати Arduinoпо за схемою на рис. 10.1.
  2. Завантажуємо в плату Arduino скетч з лістингу 10.1.
  3. Після завантаження скетчу слухаємо мелодію на монтажній платі (рис. 10.3).