Сборка электронного пианино с встроенными мелодиями на Arduino
Компоненты и материалы
| Компонент | Количество |
|---|---|
| Arduino UNO | 1 |
| LCD-дисплей 16×2 (белый на синем) | 1 |
| Тактильные кнопки 12 мм (клавиши) | 8 |
| Пьезо-зуммер | 1 |
| Светодиод (универсальный) | 1 |
| Потенциометр 10 кОм (однооборотный) | 1 |
| Резисторы: 220 Ом (4 шт), 560 Ом, 1 кОм, 4.7 кОм, 10 кОм (3 шт), 1 МОм | 1 комплект |
| Макетная плата, перемычки, USB-кабель | 1 комплект |
О проекте
Введение
Я новичок в электронике, но с опытом в программировании. Этот проект — результат изучения пьезо-зуммера. Есть простор для расширения: новые песни, переключатели, функции. Ниже — видео работы устройства с меню песен. Признаюсь: песни 4 и 5 идентичны — лень было писать новые ноты. Код легко адаптируется под свои идеи.
Сборка железа
Клавиши (резистивная лестница)
7 кнопок подключены через резистивный делитель. Резисторы по порядку: 1 МОм, 10 кОм, 4.7 кОм, 1 кОм, 560 Ом, 220 Ом. Первая кнопка — к питанию, последняя — к земле через 10 кОм и к входу A0. В коде заданы частоты нот: C4, D4, E4, F4, G4, A4, B4 (слева направо). Меняйте частоты или добавляйте кнопки.
LCD-дисплей
Подключение по схеме. Ножка 3 (контраст) — к средней ножке потенциометра, крайние — к питанию и земле. Ножка 15 (подсветка) — к питанию через 220 Ом. При другой распиновке обновите код.
Кнопка меню
К питанию, к земле через 10 кОм, к пину 7 Arduino.
Светодиод (индикатор меню)
Анод — к пину 6, катод — к земле через 220 Ом. Светится в «режиме меню» (клавиши отключены).
Пьезо-зуммер
Один вывод — к пину 8, второй — к земле через 220 Ом. Функция tone() использует этот пин.



Как работает код
Инициализация
- Подключаются библиотеки
LiquidCrystal.hиpitches.h - Определяются: пин кнопки меню, входы/выходы, частоты 7 нот
- Каждая песня вынесена в отдельную вкладку — для порядка и лёгкого расширения
Основной цикл
- Старт: светодиод выключен, клавиши активны
- При нажатии меню: клавиши блокируются, светодиод загорается — «режим меню»
Меню песен
- Нажатие меню — прокрутка песен
- Нажатие любой клавиши — воспроизведение выбранной песни
- На экране — название песни, после окончания возврат в меню
- Двойное нажатие меню — сброс в начало списка
- Для выхода в режим клавиш: пролистайте до пустого экрана (светодиод погаснет)
Код
Структура скетча:
- Electronic Keyboard — основной код
- Song1…Song5 — массивы нот и длительностей
- pitches.h — библиотека частот нот (C0…D8)
Основной скетч (Electronic Keyboard)
#include <LiquidCrystal.h>
#include "pitches.h"
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int LCDswitchPin = 7;
int LCDswitchState = 0, prevLCDswitchState = 0;
int blueLED = 6;
int LCDswitchCounter = 0;
int notes[] = {262, 294, 330, 349, 392, 440, 494}; // C4..B4
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
pinMode(LCDswitchPin, INPUT);
pinMode(blueLED, OUTPUT);
digitalWrite(blueLED, LOW);
}
void loop() {
LCDswitchState = digitalRead(LCDswitchPin);
int keyVal = analogRead(A0);
Serial.println(keyVal);
lcd.noDisplay();
digitalWrite(blueLED, LOW);
if (LCDswitchState == HIGH) { // вход в меню
digitalWrite(blueLED, HIGH);
lcd.display();
lcd.clear();
LCDstart();
}
// Распознавание нажатой клавиши по АЦП
if (keyVal == 1023) tone(8, notes[0]); // C
else if (keyVal >= 990 && keyVal <= 1010) tone(8, notes[1]); // D
else if (keyVal >= 960 && keyVal <= 980) tone(8, notes[2]); // E
else if (keyVal >= 900 && keyVal <= 945) tone(8, notes[3]); // F
else if (keyVal >= 650 && keyVal <= 710) tone(8, notes[4]); // G
else if (keyVal >= 500 && keyVal <= 550) tone(8, notes[5]); // A
else if (keyVal >= 5 && keyVal <= 10) tone(8, notes[6]); // B
else if (keyVal <= 1) noTone(8);
}
// Функции меню (LCDstart, Song1title...Song5title) — по цепочке
// каждая ждёт нажатия меню (след. песня) или клавиши (играть)
// Song5title при нажатии меню сбрасывает счётчик и очищает экран
Примеры песен
Song1 — тема Super Mario Bros (полная версия из туториала).
Song2 — Mario Underworld.
Song3 — тема Jeopardy.
Song4, Song5 — короткие заготовки (идентичны). Замените массивы melody[] и noteDurations[] на свои.
Библиотека pitches.h
Содержит #define NOTE_C4 262 и т.д. до NOTE_DS8 4978. Сохраните в папке скетча.
Производственный процесс
- Начало работы с TJBot: сборка, настройка и голосовое управление ИИ-роботом
- Умный датчик полива «Thirst Alert» на Arduino — DIY сигнализация засухи для растений
- Итальянские словесные часы на Arduino Nano, NeoPixel, LCD и RTC
- Превратите MIDI-клавиатуру в интерактивного репетитора по фортепиано с Arduino, LED-лентой и MuseScore
- Простой ИК-датчик препятствий на Arduino: ИК-светодиод и фотодиод
- Надежный счетчик кВт·ч на Sigfox с Arduino MKR Fox 1200
- Bluetooth-монитор температуры на Arduino Nano с NTC-термистором
- Компактный стерео FM-радио на RDA5807 и Arduino Nano
- Бесконтактный жестовый замок: APDS-9960 + Arduino для безопасного доступа
- Точный тест времени реакции на Arduino UNO