Изучаем Arduino: инструметы и методы технического волшебства - [28]

Шрифт
Интервал

Пользуясь музыкальными навыками, которые я приобрел на уроках в средней школе, я сочинил короткую мелодию (листинг 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 поддерживает массивы, что удобно для перебора последовательностей данных.

• Что громкость можно регулировать потенциометром, соединенным последовательно с динамиком.

Глава 6. USB и последовательный интерфейс


Список деталей

Для повторения примеров главы вам понадобятся следующие детали:

• плата Arduino Uno;

• плата Arduino Leonardo;

• USB-кабель А - В (для Uno );

• USB-кабель А - микро В (для Leonardo );

• светодиод;

• RGB-светодиод с общим катодом;

• резистор номиналом 150 Ом;

• 3 резистора номиналом 220 Ом;

• 2 резистора номиналом 10 кОм;

• кнопка;

• фоторезистор;

• датчик температуры ТМР36;

• двух.координатный джойстик (Spark.Fun, Parallax или Adafruit);

• перемычки;

• провода;

• макетная плата;

• потенциометр.

Электронные ресурсы к главе

На странице http://www.exploringarduino.com/content/ch6 можно загрузить программный код, видеоуроки и другие материалы для данной главы. Кроме того, листинги примеров можно скачать со страницы www.wiley.com/go/exploringarduino в разделе Downloads.

- 119 -

Что вы узнаете в этой главе

Обычно для загрузки программ из компьютера в микроконтроллер нужны внешние аппаратные средства, такие как программатор AVR ISP MKII. Замечательная особенность любой платы Arduino - возможность запрограммировать ее через USB-интерфейс. Это позволяет программировать Arduino без специального программатора. В плату Arduino уже встроен программатор, что дает возможность напрямую подключаться к интегрированному универсальному синхронно/асинхронному приемопередатчику ATmega (USART). Через этот интерфейс можно обмениваться данными между Arduino и компьютером или между Arduino и другими устройствами, поддерживающими протокол (включая другие платы Arduino).