Все статьиHardware

Мини-пианино на Arduino Nano: музыкальный проект с кнопками и зуммером

БА
Бексултан Айтен
CTO, Alashed
30 мая 2025 г.
8 мин чтения
Мини-пианино на Arduino Nano: музыкальный проект с кнопками и зуммером

Собираем компактное пианино на Arduino Nano с четырьмя кнопками и пассивным зуммером. Простая схема, понятный код, расширение до полной октавы. Проект для начинающих.

Пианино из четырёх кнопок

Музыкальные проекты на Arduino -- одни из самых увлекательных для школьников. Нажимаешь кнопку -- звучит нота. Всё просто, наглядно и моментально даёт результат. Наше мини-пианино использует Arduino Nano, четыре тактовые кнопки и пассивный пьезозуммер. Четыре ноты -- это немного, но достаточно, чтобы сыграть простую мелодию и разобраться в том, как Arduino генерирует звук.

Проект вдохновлён идеей максимальной компактности: Arduino Nano помещается на небольшой макетной плате, а готовое пианино можно перенести на паечную плату и поместить в миниатюрный корпус. Это проект, который собирается за 30 минут, но при этом затрагивает важные темы: частоты звуковых колебаний, цифровые входы, функцию tone() и принципы работы пьезоэлемента.

Проект подходит для учеников 5--8 классов и не требует опыта работы с Arduino.

Собранное мини-пианино на Arduino Nano на макетной плате
Собранное мини-пианино на Arduino Nano на макетной плате

Необходимые компоненты

  • Arduino Nano (или Nano Every) -- 1 шт.
  • Пассивный пьезозуммер -- 1 шт.
  • Тактовые кнопки (12 мм) -- 4 шт.
  • Резисторы 1 кОм (подтягивающие к земле) -- 4 шт.
  • Макетная плата (breadboard) -- 1 шт.
  • Провода-перемычки -- 10 шт.
  • USB-кабель (Mini-USB для Nano)
  • Блок питания 5V (опционально, для автономной работы)

Стоимость всех компонентов -- около 2 500--4 000 тенге. Важно использовать именно пассивный пьезозуммер: активный генерирует только один фиксированный тон и не подходит для воспроизведения разных нот. Отличить их можно по маркировке или по тому, что пассивный зуммер не пищит при простом подключении к питанию.

Схема подключения

Каждая кнопка подключается через подтягивающий резистор 1 кОм к GND. При нажатии кнопка подаёт на цифровой пин Arduino напряжение HIGH (5V). Когда кнопка не нажата, резистор подтягивает пин к LOW (GND).

Подключение кнопок:

НотаКнопкаПин ArduinoЧастота
До1D2262 Гц
Ре2D3294 Гц
Ми3D4330 Гц
Фа4D5349 Гц

Каждая кнопка: один контакт к соответствующему пину Arduino и через резистор 1 кОм к GND, второй контакт к 5V.

Пьезозуммер: положительный вывод к пину D6, отрицательный к GND.

Схема намеренно проста: четыре одинаковых цепочки кнопка-резистор и один зуммер. Это позволяет ученикам легко разобраться в каждом соединении.

Схема подключения кнопок и зуммера к Arduino Nano
Схема подключения кнопок и зуммера к Arduino Nano

Полный код проекта

```cpp

// Мини-пианино на Arduino Nano

// 4 кнопки воспроизводят 4 ноты через пассивный пьезозуммер

// Пины кнопок

const int button1 = 2; // Нота До

const int button2 = 3; // Нота Ре

const int button3 = 4; // Нота Ми

const int button4 = 5; // Нота Фа

// Пин зуммера

const int buzzerPin = 6;

// Частоты нот первой октавы (в герцах)

// Можно изменить на любые другие ноты

const int NOTE_DO = 262; // До (C4)

const int NOTE_RE = 294; // Ре (D4)

const int NOTE_MI = 330; // Ми (E4)

const int NOTE_FA = 349; // Фа (F4)

void setup() {

// Настраиваем пины кнопок как входы

pinMode(button1, INPUT);

pinMode(button2, INPUT);

pinMode(button3, INPUT);

pinMode(button4, INPUT);

// Пин зуммера как выход

pinMode(buzzerPin, OUTPUT);

Serial.begin(9600);

Serial.println("=== Мини-пианино ===");

Serial.println("Нажимайте кнопки для игры");

// Приветственный звук при включении

tone(buzzerPin, NOTE_DO, 150);

delay(200);

tone(buzzerPin, NOTE_MI, 150);

delay(200);

tone(buzzerPin, NOTE_FA, 300);

delay(400);

noTone(buzzerPin);

}

void loop() {

// Проверяем каждую кнопку и воспроизводим ноту

if (digitalRead(button1) == HIGH) {

tone(buzzerPin, NOTE_DO);

Serial.println("До (262 Гц)");

}

else if (digitalRead(button2) == HIGH) {

tone(buzzerPin, NOTE_RE);

Serial.println("Ре (294 Гц)");

}

else if (digitalRead(button3) == HIGH) {

tone(buzzerPin, NOTE_MI);

Serial.println("Ми (330 Гц)");

}

else if (digitalRead(button4) == HIGH) {

tone(buzzerPin, NOTE_FA);

Serial.println("Фа (349 Гц)");

}

else {

// Ни одна кнопка не нажата -- выключаем звук

noTone(buzzerPin);

}

delay(10); // Небольшая пауза для стабильности

}

`

Разбор кода

Функция `tone()`. Это встроенная функция Arduino, которая генерирует прямоугольный сигнал заданной частоты на указанном пине. Пьезоэлемент внутри зуммера вибрирует с этой частотой, создавая слышимый звук. Функция noTone() останавливает генерацию и выключает звук.

Частоты нот. Каждая музыкальная нота -- это колебания воздуха с определённой частотой. Нота Ля первой октавы -- 440 Гц, это международный эталон. До -- 262 Гц, Ре -- 294 Гц, и так далее. Между соседними нотами частота увеличивается примерно в 1.06 раза. Это можно использовать для обсуждения математики музыки на уроке.

Приоритет кнопок. Конструкция if-else if гарантирует, что при одновременном нажатии нескольких кнопок прозвучит только одна нота -- та, которая проверяется первой. Это предотвращает хаотичное переключение звука.

Подтягивающие резисторы. Без резистора цифровой пин Arduino находится в неопределённом состоянии, когда кнопка не нажата, и может произвольно считывать HIGH или LOW. Резистор 1 кОм надёжно удерживает пин в состоянии LOW, пока кнопка не замкнёт его на 5V.

Простота кода. Весь проект умещается в несколько десятков строк без единой внешней библиотеки. Это делает его идеальным первым проектом для тех, кто только начинает изучать Arduino.

Расширение до полной октавы

Базовая версия с четырьмя кнопками легко расширяется. Добавьте ещё четыре кнопки на пины D7--D10 и четыре резистора, чтобы получить полную октаву:

```cpp

// Полная октава -- дополнительные ноты

const int NOTE_SOL = 392; // Соль (G4)

const int NOTE_LA = 440; // Ля (A4)

const int NOTE_SI = 494; // Си (B4)

const int NOTE_DO2 = 523; // До верхнее (C5)

`

Для более чистого кода с восемью кнопками используйте массивы:

```cpp

const int buttonPins[] = {2, 3, 4, 5, 7, 8, 9, 10};

const int noteFreqs[] = {262, 294, 330, 349, 392, 440, 494, 523};

const int numNotes = 8;

void loop() {

bool playing = false;

for (int i = 0; i < numNotes; i++) {

if (digitalRead(buttonPins[i]) == HIGH) {

tone(buzzerPin, noteFreqs[i]);

playing = true;

break;

}

}

if (!playing) noTone(buzzerPin);

delay(10);

}

`

Массивы делают код компактным и легко расширяемым: чтобы добавить новую ноту, достаточно дописать один элемент в каждый массив.

Советы для занятий

  • Предложите ученикам подобрать частоты для знакомой мелодии и записать последовательность нот. Это связывает программирование с музыкой.
  • Добавьте светодиоды -- по одному на каждую кнопку. При нажатии загорается соответствующий светодиод, создавая визуальный эффект.
  • Корпус можно сделать из картона, вырезав отверстия для кнопок и зуммера. Или напечатать на 3D-принтере, если есть такая возможность.
  • Режим автоматического воспроизведения. Запрограммируйте Arduino играть простую мелодию ("В лесу родилась ёлочка" или "Калинка") -- массив нот и массив длительностей.
  • Обсудите, почему пассивный зуммер может играть разные ноты, а активный -- только одну. Это отличный повод разобрать принцип работы пьезоэлемента.

Как Alashed помогает

Arduino Nano, кнопки, пьезозуммеры, резисторы и макетные платы -- всё это входит в комплекты Alashed Hardware, собранные для школьных лабораторий. Для программирования используйте Alashed CodeStudio -- онлайн-среду разработки, которая позволяет писать, компилировать и загружать скетчи на Arduino прямо из браузера. Не нужно устанавливать Arduino IDE на каждый компьютер -- достаточно открыть страницу в браузере.

Попробуйте Alashed бесплатно

Подключите школу к пилоту. Генерируйте КМЖ за 2 минуты, ведите CodeStudio уроки, заказывайте оборудование — всё в одном месте.

Попробовать бесплатноДемо