Выбрать главу

Обратите внимание, что массивы индексируются с нуля. Доступ к элементу массива можно получить, поставив после имени массива в квадратных скобках соответствующее значение индекса. Например, если требуется установить яркость светодиода, подключенного к выводу 9 Arduino, равной значению третьего элемента в массиве, то можно сделать это следующим образом:

analogWrite(9,numbers[2]);

Обратите внимание, что индекс 2 представляет собой третье значение в массиве, поскольку нумерация начинается с нуля. Изменить одно из значений массива можно так: numbers[2] = 10;

Далее массивы потребуются нам, чтобы создать структуру, которая может содержать последовательность нот, воспроизводимую на динамике.

5.6.2. Создание массивов нот и определение их длительности звучания

Для хранения информации о мелодии, которую вы хотите воспроизвести, создадим два массива одинаковой длины. Первый содержит перечень нот, а второй - список длительности звучания для каждой ноты в миллисекундах. Затем, перебирая индексы этих массивов, воспроизведем мелодию.

Пользуясь музыкальными навыками, которые я приобрел на уроках в средней школе, я сочинил короткую мелодию (листинг 5.1).

Листинг 5.1. Пример мелодии

// Массив нот

int notes [] = {

NOTE_A4, NOTE_E3, NOTE_A4, 0,

NOTE_A4, NOTE_E3, NOTE_A4, 0,

NOTE_E4, NOTE_D4, NOTE_B4, NOTE_A4, NOTE_В4, NOTE_C4, NOTE_D4,

NOTE_E4, NOTE_E3, NOTE_A4, 0

};

// Массив длительностей звучания нот в мс

int times[] = {

250, 250, 250, 250,

250, 250, 250, 250,

125, 125, 125, 125, 125, 125, 125, 125,

250, 250, 250, 250

};

- 116 -

Обратите внимание, что длина обоих массивов одинакова (20 элементов). Некоторые ноты задаются в виде нулевых значений, - это музыкальные паузы. Длительность звучания каждой ноты берем из второго массива. Для тех, кто знаком с теорией музыки, обратите внимание, что я задал длительность четвертных нот 250 мс, а восьмых - 125 мс.

Сначала попробуйте воспроизвести мою мелодию, а затем попытайтесь создать свою собственную!

ПРИМЕЧАНИЕ

Послушать аудиозапись можно на странице www.exploringarduino.com/content/ch5 или на сайте издательства Wiley.

5.6.3. Написание программы воспроизведения звука

Осталось написать программу для воспроизведения мелодии. С помощью цикла выбираем значения нот и их длительность из массивов и реализуем воспроизведение каждой ноты. Поскольку вы, вероятно, не захотите слушать мелодию снова и снова, можно выполнить цикл в функции setup(). Чтобы возобновить воспроизведение, нажмите кнопку Reset. В листинге 5.2 приведена полная программа проигрывателя Arduino.

Листинг 5.2. Проигрыватель мелодий - music.ino

// Проигрывание мелодии на динамике

#include "pitches.h" // Заголовочный файл со значениями частоты нот

const int SPEAKER=9; // Вывод подключения динамика

// Массив нот

int notes[] = {

NOTE_A4, NOTE_ЕЗ,NOTE_A4, 0,

NOTE_A4, NOTE_ЕЗ,NOTE_A4, 0,

NOTE_E4, NOTE_D4,NOTE_C4, NOTE_84, NOTE_A4, NOTE_B4, NOTE_C4, NOTE_D4,

NOTE_E4, NOTE_ЕЗ,NOTE_A4, 0

};

// Массив длительностей звучания нот в мс

int times [) = {

250, 250, 250, 250,

250, 250, 250, 250,

125, 125, 125, 125, 125, 125, 125, 125,

250, 250, 250, 250

};

void setup()

{

- 117 -

// Выбор каждой ноты перебором массива нот

for (int i = 0; i < 20; i++)

{

tone(SPEAKER, notes[i], times[i]);

delay(times[i]);

}

}

void loop()

{

// Чтобы повторить воспроизведение, необходимо нажать кнопку Reset

}

Если вы захотите создать свою собственную мелодию, проследите, чтобы массивы нот и длительностей имели равный размер, и правильно задайте верхнюю границу для цикла перебора for(). Поскольку функция tone() может работать в фоновом режиме, важно определить задержку delay(), чтобы следующая нота не звучала, пока не закончится воспроизведение предыдущей.

Пианино

Соберите схему изображенную на рис. 5.6.

рис. 5.6. Пианино

Листинг 5.3. Пианино

#define NOTE_C 262 //Hz

#define NOTE_D 294 //Hz

#define NOTE_E 330 //Hz

#define NOTE_G 392 //Hz

#define NOTE_A 440 //Hz

const int SPEAKER=9; //Speaker on Pin 9

const int BUTTON_C=7; //Button Pin

const int BUTTON_D=6; //Button Pin

const int BUTTON_E=5; //Button Pin

const int BUTTON_G=4; //Button Pin

const int BUTTON_A=3; //Button Pin

void setup()

{

//No setup needed

//Tone function sets outputs

}

void loop()

{

while (digitalRead(BUTTON_C))

tone(SPEAKER, NOTE_C);

while(digitalRead(BUTTON_D))

tone(SPEAKER, NOTE_D);

while(digitalRead(BUTTON_E))

tone(SPEAKER, NOTE_E);

while(digitalRead(BUTTON_G))

tone(SPEAKER, NOTE_G);

while(digitalRead(BUTTON_A))

tone(SPEAKER, NOTE_A);

//Stop playing если ни одна кнопка не нажата

noTone(SPEAKER);

}

Резюме

В этой главе вы узнали следующее:

• Как динамики создают вибрацию воздуха, которая распространяется в пространстве и воспринимается нашей барабанной перепонкой в виде звука.

• Что изменение электрического тока индуцирует магнитное поле, которое генерирует звук из громкоговорителя.