Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Сборка электронного пианино с встроенными мелодиями на Arduino

Компоненты и материалы

КомпонентКоличество
Arduino UNO1
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() использует этот пин.

Сборка электронного пианино с встроенными мелодиями на Arduino
Сборка электронного пианино с встроенными мелодиями на Arduino
Сборка электронного пианино с встроенными мелодиями на Arduino

Как работает код

Инициализация

  • Подключаются библиотеки 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. Сохраните в папке скетча.

Производственный процесс

  1. Начало работы с TJBot: сборка, настройка и голосовое управление ИИ-роботом
  2. Умный датчик полива «Thirst Alert» на Arduino — DIY сигнализация засухи для растений
  3. Итальянские словесные часы на Arduino Nano, NeoPixel, LCD и RTC
  4. Превратите MIDI-клавиатуру в интерактивного репетитора по фортепиано с Arduino, LED-лентой и MuseScore
  5. Простой ИК-датчик препятствий на Arduino: ИК-светодиод и фотодиод
  6. Надежный счетчик кВт·ч на Sigfox с Arduino MKR Fox 1200
  7. Bluetooth-монитор температуры на Arduino Nano с NTC-термистором
  8. Компактный стерео FM-радио на RDA5807 и Arduino Nano
  9. Бесконтактный жестовый замок: APDS-9960 + Arduino для безопасного доступа
  10. Точный тест времени реакции на Arduino UNO