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);
}
Резюме
В этой главе вы узнали следующее:
• Как динамики создают вибрацию воздуха, которая распространяется в пространстве и воспринимается нашей барабанной перепонкой в виде звука.
• Что изменение электрического тока индуцирует магнитное поле, которое генерирует звук из громкоговорителя.
• Как создавать звуки произвольной частоты и длительности с помощью функции tone().
• Что язык программирования Arduino поддерживает массивы, что удобно для перебора последовательностей данных.
Читать дальше