Листинг 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 поддерживает массивы, что удобно для перебора последовательностей данных.
• Что громкость можно регулировать потенциометром, соединенным последовательно с динамиком.
Глава 6. USB и последовательный интерфейс
Для повторения примеров главы вам понадобятся следующие детали:
• плата Arduino Uno;
• плата Arduino Leonardo;
• USB-кабель А - В (для Uno );
• USB-кабель А - микро В (для Leonardo );
• светодиод;
• RGB-светодиод с общим катодом;
• резистор номиналом 150 Ом;
• 3 резистора номиналом 220 Ом;
• 2 резистора номиналом 10 кОм;
• кнопка;
• фоторезистор;
• датчик температуры ТМР36;
• двух.координатный джойстик (Spark.Fun, Parallax или Adafruit);
• перемычки;
• провода;