4.05.1. Лабораторная работа №4.5.1.md
Играем гимн России
Тема работы
В теории мы узнали, как функция tone() может генерировать звуки разной высоты. Теперь давайте применим эти знания для создания чего-то по-настоящему впечатляющего! В этой лабораторной работе мы напишем программу, которая научит Рудирон исполнять мелодию государственного гимна России с помощью простого пьезоизлучателя.
Цель
- Научиться воспроизводить сложные мелодии, используя функцию
tone(). - Понять, как можно представить музыку в виде кода, используя массивы для нот и их длительностей.
- Освоить использование директивы
#defineдля создания именованных констант.
Оборудование и материалы
- Отладочная плата
Рудирон. - Макетная плата.
- 1 пьезоизлучатель (зуммер).
- 2 соединительных провода.
- USB-кабель для подключения
Рудиронак компьютеру. - Компьютер с настроенной средой
Arduino IDE.
Ход работы
-
Как записать мелодию в коде?
Любая мелодия — это последовательность нот определённой высоты и длительности. В программировании мы можем представить её в виде двух массивов: 1. Массив нот. Хранит частоты нот в герцах (например,
392для ноты «Соль»). 2. Массив длительностей. Хранит относительную длительность каждой ноты (например,4для четвертной,8для восьмой).Чтобы не запоминать частоты всех нот, мы можем определить их один раз в начале программы с помощью директивы
#define. Это позволит нам использовать в коде понятные имена (NOTE_G4) вместо магических чисел (392). -
Сборка схемы
Схема подключения пьезоизлучателя очень проста.
- Вставьте пьезоизлучатель в макетную плату.
- Один его вывод (обычно длинный или помеченный знаком «+») подключите к пину 8
Рудирона. - Второй вывод подключите к пину
GND.

-
Написание и загрузка кода
- Установите перемычку
PRG | RUNв положениеPRG. -
В
Arduino IDEвведите следующий код:// --- Определение частот нот --- // Пауза #define PAUSE 0 // 1-я октава #define NOTE_C4 262 #define NOTE_D4 294 #define NOTE_E4 330 #define NOTE_F4 349 #define NOTE_G4 392 #define NOTE_A4 440 #define NOTE_B4 494 // 2-я октава #define NOTE_C5 523 #define NOTE_D5 587 #define NOTE_E5 659 #define NOTE_F5 698 // --- Настройки --- const int buzzerPin = 8; // Темп мелодии (чем больше, тем медленнее) const int tempo = 1000; // --- Гимн России --- int melody[] = { // Вступление NOTE_G4, // 1-й куплет NOTE_C5, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_E4, NOTE_E4, NOTE_A4, NOTE_G4, NOTE_G4, NOTE_F4, NOTE_G4, NOTE_C4, NOTE_C4, NOTE_D4, NOTE_D4, NOTE_E4, NOTE_E4, NOTE_F4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5, NOTE_D5, NOTE_D5, NOTE_G4, NOTE_G4, // Припев NOTE_C5, NOTE_B4, NOTE_A4, NOTE_B4, NOTE_E4, NOTE_E4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_G4, NOTE_C4, NOTE_C4, NOTE_C5, NOTE_B4, NOTE_A4, NOTE_B4, NOTE_G4, // 2-й куплет NOTE_E5, NOTE_D5, NOTE_C5, NOTE_B4, NOTE_C5, NOTE_D5, NOTE_G4, NOTE_G4, NOTE_C5, NOTE_B4, NOTE_A4, NOTE_B4, NOTE_E4, PAUSE, NOTE_E4, NOTE_C5, NOTE_A4, NOTE_A4, NOTE_B4, NOTE_C5, NOTE_A4, NOTE_A4, NOTE_B4, NOTE_C5, NOTE_D5, NOTE_C5, NOTE_F5, NOTE_F5, NOTE_E5, NOTE_D5, NOTE_C5, NOTE_D5, NOTE_E5, NOTE_C5, NOTE_C5, // Припев NOTE_D5, NOTE_C5, NOTE_B4, NOTE_A4, NOTE_B4, NOTE_C5, NOTE_D5, NOTE_G4, NOTE_C5, NOTE_B4, NOTE_A4, NOTE_G4, NOTE_C4, NOTE_D5, NOTE_C5 }; // Длительности нот: 4 = четверть, 8 = восьмая, 16 = шестнадцатая int noteDurations[] = { 8, 4, 8, 16, 16, 4, 8, 8, 4, 8, 16, 16, 4, 8, 8, 4, 16, 8, 8, 4, 16, 8, 8, 4, 8, 8, 4, 2, 4, 8, 16, 16, 4, 8, 8, 4, 8, 8, 4, 8, 8, 2, 4, 4, 2, 2, 8, 8, 8, 8, 4, 8, 8, 2, 4, 8, 16, 16, 4, 8, 8, 4, 4, 8, 16, 16, 4, 8, 16, 16, 4, 8, 8, 2, 2, 8, 8, 8, 8, 4, 8, 8, 2, 2, 8, 8, 8, 8, 4, 8, 8, 2, 4, 2 }; void setup() { } void loop() { // Проигрываем мелодию for (int thisNote = 0; thisNote < sizeof(melody)/sizeof(int); thisNote++) { int duration = tempo / noteDurations[thisNote]; tone(buzzerPin, melody[thisNote], duration); int pauseBetweenNotes = duration * 1.30; delay(pauseBetweenNotes); noTone(buzzerPin); } // Замолкаем навсегда после одного проигрывания while(true); } - Нажмите кнопку «Upload», чтобы загрузить код на плату.
- Установите перемычку
-
Проверка работы
Сразу после загрузки
Рудиронисполнит гимн России!
Результаты
Вы создали настоящее музыкальное устройство! Ваша программа последовательно проигрывает ноты из массива, создавая узнаваемую и сложную мелодию.
Анализ результатов
#define. Эта директива препроцессора позволяет нам дать числовым значениям (частотам) понятные имена.- Массивы
melody[]иnoteDurations[]. Хранят всю информацию о нашей мелодии. sizeof(melody)/sizeof(int). Этот трюк позволяет автоматически рассчитать количество нот в массиве, чтобы циклforостановился вовремя.tone(pin, frequency, duration). Основная команда, которая генерирует звук нужной высоты и длительности.delay(pauseBetweenNotes). Эта пауза немного длиннее самой ноты. Она создаёт крошечное молчание между звуками, делая мелодию более чёткой и выразительной.
Выводы
В этой лабораторной работе вы научились генерировать сложные звуковые последовательности с помощью функции tone() и массивов. Вы увидели, как музыка, творческий процесс, может быть описана на строгом языке программирования. Этот навык позволит вам добавлять звуковые эффекты и мелодии в любые ваши проекты.
Вопросы для самопроверки
- Какая команда используется для генерации звука?
- Что такое массив и как мы использовали его в этой работе?
- Зачем в коде используется директива
#define? - Как изменить код, чтобы мелодия играла в два раза быстрее?
- Что делает конструкция
while(true);в концеloop()?
Вы научили Рудирон исполнять музыку! В следующей лабораторной работе мы познакомимся с обратной задачей — не генерацией, а измерением длительности импульсов с помощью функции pulseIn.
- Страницы
- 1. Введение
- 1.01. Лабораторная работа №1.1
- 1.02. Лабораторная работа №1.2
- 1.03. Лабораторная работа №1.3
- 1.04. Лабораторная работа №1.4
- 1.05. Лабораторная работа №1.5
- 2. Основы электроники
- 2.01. Электрический ток и параметры цепи
- 2.01.1. Лабораторная работа №2.1.1
- 2.01.2. Лабораторная работа №2.1.2
- 2.02. Сопротивление в цепи
- 2.02.1. Лабораторная работа №2.2.1
- 2.02.2. Лабораторная работа №2.2.2
- 2.03. Полупроводники
- 2.03.1. Лабораторная работа №2.3.1
- 2.03.2. Лабораторная работа №2.3.2
- 3. Основы программирование на C++
- 3.01. Типы данных и переменные
- 3.01.1. Практикум
- 3.02. Операторы в C++
- 3.02.1. Практикум
- 3.03. Структуры ветвления
- 3.03.1. Практикум
- 3.04. Структуры повторения
- 3.04.1. Практикум
- 3.05. Массивы
- 3.05.1. Практикум
- 3.06. Функции
- 3.06.1. Практикум
- 3.07. Решения задач
- 4. Программирование микроконтроллеров
- 4.01. Цифровые сигналы и GPIO
- 4.01.1. Лабораторная работа №4.1.1
- 4.01.2. Лабораторная работа №4.1.2
- 4.01.3. Лабораторная работа №4.1.3
- 4.01.4. Лабораторная работа №4.1.4
- 4.01.5. Лабораторная работа №4.1.5
- 4.01.6. Лабораторная работа №4.1.6
- 4.01.7. Лабораторная работа №4.1.7
- 4.01.8. Лабораторная работа №4.1.8
- 4.02. Аналоговые сигналы и ШИМ
- 4.02.1. Лабораторная работа №4.2.1
- 4.02.2. Лабораторная работа №4.2.2
- 4.02.3. Лабораторная работа №4.2.3
- 4.02.4. Лабораторная работа №4.2.4
- 4.02.5. Лабораторная работа №4.2.5
- 4.03. Аналоговый сигнал и АЦП
- 4.03.1. Лабораторная работа №4.3.1
- 4.03.2. Лабораторная работа №4.3.2
- 4.03.3. Лабораторная работа №4.3.3
- 4.03.4. Лабораторная работа №4.3.4
- 4.03.5. Лабораторная работа №4.3.5
- 4.04. Аналоговый сигнал и ЦАП
- 4.04.1. Лабораторная работа №4.4.1
- 4.04.2. Лабораторная работа №4.4.2
- 4.05. Генерация и измерение импульсов
- 4.05.1. Лабораторная работа №4.5.1
- 4.05.2. Лабораторная работа №4.5.2
- 4.06. Аппаратные прерывания
- 4.06.1. Лабораторная работа №4.6.1
- 4.06.2. Лабораторная работа №4.6.2
- 4.07. Псевдопараллелизм
- 4.07.1. Лабораторная работа №4.7.1
- 4.07.2. Лабораторная работа №4.7.2
- 4.08. Интерфейсы связи - UART
- 4.08.1. Лабораторная работа №4.8.1
- 4.09. Интерфейсы связи - I2C
- 4.09.1. Лабораторная работа №4.9.1
- 4.10. Интерфейсы связи - SPI
- 4.10.1. Лабораторная работа №4.10.1
- home
-
imgs
- 1. Введение
- 1.01. Лабораторная работа №1.1
- 1.02. Лабораторная работа №1.2
- 1.03. Лабораторная работа №1.3
- 1.04. Лабораторная работа №1.4
- 1.05. Лабораторная работа №1.5
- 2. Основы электроники
- 2.01. Электрический ток и параметры цепи
- 2.01.1. Лабораторная работа №2.1.1
- 2.01.2. Лабораторная работа №2.1.2
- 2.02. Сопротивление в цепи
- 2.02.1. Лабораторная работа №2.2.1
- 2.02.2. Лабораторная работа №2.2.2
- 2.03. Полупроводники
- 2.03.1. Лабораторная работа №2.3.1
- 2.03.2. Лабораторная работа №2.3.2
- 3. Основы программирование на C++
- 3.01. Типы данных и переменные
- 3.01.1. Практикум
- 3.02. Операторы в C++
- 3.02.1. Практикум
- 3.03. Структуры ветвления
- 3.03.1. Практикум
- 3.04. Структуры повторения
- 3.04.1. Практикум
- 3.05. Массивы
- 3.05.1. Практикум
- 3.06. Функции
- 3.06.1. Практикум
- 3.07. Решения задач
- 4. Программирование микроконтроллеров
- 4.01. Цифровые сигналы и GPIO
- 4.01.1. Лабораторная работа №4.1.1
- 4.01.2. Лабораторная работа №4.1.2
- 4.01.3. Лабораторная работа №4.1.3
- 4.01.4. Лабораторная работа №4.1.4
- 4.01.5. Лабораторная работа №4.1.5
- 4.01.6. Лабораторная работа №4.1.6
- 4.01.7. Лабораторная работа №4.1.7
- 4.01.8. Лабораторная работа №4.1.8
- 4.02. Аналоговые сигналы и ШИМ
- 4.02.1. Лабораторная работа №4.2.1
- 4.02.2. Лабораторная работа №4.2.2
- 4.02.3. Лабораторная работа №4.2.3
- 4.02.4. Лабораторная работа №4.2.4
- 4.02.5. Лабораторная работа №4.2.5
- 4.03. Аналоговый сигнал и АЦП
- 4.03.1. Лабораторная работа №4.3.1
- 4.03.2. Лабораторная работа №4.3.2
- 4.03.3. Лабораторная работа №4.3.3
- 4.03.4. Лабораторная работа №4.3.4
- 4.03.5. Лабораторная работа №4.3.5
- 4.04. Аналоговый сигнал и ЦАП
- 4.04.1. Лабораторная работа №4.4.1
- 4.04.2. Лабораторная работа №4.4.2
- 4.05. Генерация и измерение импульсов
- 4.05.1. Лабораторная работа №4.5.1
- 4.05.2. Лабораторная работа №4.5.2
- 4.06. Аппаратные прерывания
- 4.06.1. Лабораторная работа №4.6.1
- 4.06.2. Лабораторная работа №4.6.2
- 4.07. Псевдопараллелизм
- 4.07.1. Лабораторная работа №4.7.1
- 4.07.2. Лабораторная работа №4.7.2
- 4.08. Интерфейсы связи - UART
- 4.08.1. Лабораторная работа №4.8.1
- 4.09. Интерфейсы связи - I2C
- 4.09.1. Лабораторная работа №4.9.1
- 4.10. Интерфейсы связи - SPI
- 4.10.1. Лабораторная работа №4.10.1
- home