Инструменты пользователя

Инструменты сайта


проект_детского_пианино

Проект детского пианино

Сегодня я научу вас, как сделать детское пианино на базе микроконтроллера Arduino UNO. Это не является серьезной поделкой, сборка оного не вызовет у вас никаких сложностей, более того, можно ничего не паять, а собрать на макетной плате. Музицировать на нем не получится, но если нажимать в нужном ритме клавиши, то услышите свою музыку, которую вы запишите.

Необходимо

Конвертируем музыку в код

Основой этого проекта послужить сервис по переводу мелодий в формате MIDI в код, понятный для ардуино: https://extramaster.net/tools/midiToArduino/

Суть данного сервиса проста, вы грузите музыку, получаете код, который в свою очередь загружаете на Arduino и вуаля, можно слушать любую музыку через бузер. Но есть и минусы, например память у Arduino UNO всего 32 Кб памяти и полностью записать музыку вы точно не сможете. Также нельзя слушать музыку в «многоголосье», то есть строго записываем только один инструмент.

Но нам это скучно, поэтому мы выбираем любую музыку, находим ее в формате MIDI и скачиваем. Далее загружаем на этот сервис и получаем подобный код:

// Credit:
// Midi to Arduino Converter
//     - Andy Tran (extramaster), 2015
// https://www.extramaster.net/tools/midiToArduino/
//
// Process:
// Midi -> Midi tracks -> Note mappings -> Frequency
//
// CC0
 
// Set this to be the pin that your buzzer resides in. (Note that you can only have one buzzer actively using the PWM signal at a time).
int tonePin = 11;
void setup() {
 
}
 
void midi() {
 
    tone(tonePin, 146, 450.0);
    delay(500.0);
    tone(tonePin, 174, 225.0);
    delay(250.0);
    tone(tonePin, 164, 225.0);
    delay(250.0);
    tone(tonePin, 130, 225.0);
    delay(250.0);
    tone(tonePin, 164, 225.0);
    delay(250.0);
    tone(tonePin, 195, 225.0);
    delay(250.0);
    tone(tonePin, 233, 225.0);
    delay(250.0);
    tone(tonePin, 220, 450.0);
    delay(500.0);
    tone(tonePin, 174, 450.0);
    delay(500.0);
 
}
 
void loop() {
    // Play midi
    midi();
}

Подключаем бузер на 11 пин, запускаем на Arduino и слушаем, если все работает, то идем дальше.

Подготавливаем код

Копируем наш код и вставляем сюда: piano_parser Получаем готовые массивы с записанными в них тональностями звука и вставляем их вместо строчек:

int myPins[] = {261, 311, 349, 311, 349};
int myPing[] = {360.0, 360.0, 270.0, 270.0, 180.0, 360.0};

В этом коде:

int tonePin = 11;
int myPins[] = {349, 329, 329, 293, 293, 349, 329, 293, 293, 329, 349, 466, 440, 440, 349, 349, 466, 440, 329, 349, 329, 329, 293, 293, 349, 329, 293, 293, 329, 349, 466, 440, 440, 349, 349, 466, 440, 329, 349, 329, 329, 293, 293, 349, 329, 293, 293, 329, 349, 466, 440, 440, 349, 349, 466, 440, 329, 349, 329, 329, 293, 293, 349, 329, 293, 293, 329, 349, 466, 440, 440, 349, 349, 466, 440, 329, 293, 293, 293, 293, 293, 261, 261, 195, 220, 233, 293, 277, 220, 220, 293, 293, 293, 293, 293, 261, 261, 195, 233, 293, 233, 220, 293, 293, 293, 293, 293, 261, 261, 195, 220, 233, 293, 277, 220, 220, 293, 293, 293, 293, 293, 261, 261, 195, 195, 195, 233, 293, 329, 220, 220, 220, 261, 329, 349, 329, 329, 293, 293, 349, 329, 293, 293, 329, 349, 466, 440, 440, 349, 349, 466, 440, 329, 349, 329, 329, 293, 293, 349, 329, 293, 293, 329, 349, 466, 440, 440, 349, 349, 466, 440, 329, 293, 293, 293, 293, 293, 261, 261, 195, 220, 233, 293, 277, 220, 220, 293, 293, 293, 293, 293, 261, 261, 195, 233, 293, 233, 220, 293, 293, 293, 293, 293, 261, 261, 195, 220, 233, 293, 277, 220, 220, 293, 293, 293, 293, 293, 261, 261, 195, 195, 195, 233, 293, 329, 220, 220, 220, 261, 329, 349, 329, 329, 293, 293, 349, 329, 293, 293, 329, 349, 466, 440, 440, 349, 349, 466, 440, 329, 349, 329, 329, 293, 293, 349, 329, 293, 293, 329, 349, 466, 440, 440, 349, 349, 466, 440, 329, 293, 329, 349, 329, 293, 261, 261, 440, 349, 261, 293, 329, 349, 329, 293, 261, 233, 220, 277, 329, 349, 329, 349, 329, 329, 293, 293, 349, 329, 293, 293, 329, 349, 466, 440, 440, 349, 349, 466, 440, 329, 349, 329, 329, 293, 293, 349, 329, 293, 293, 329, 349, 466, 440, 440, 349, 349, 466, 440, 329, 349, 329, 329, 293, 293, 349, 329, 293, 293, 329, 349, 466, 440, 440, 349, 349, 466, 440, 329, 349, 329, 329, 293, 293, 349, 329, 293, 293, 329, 349, 466, 440, 440, 349, 349, 466, 440, 329};
int myPing[] = {281.25, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 281.25, 140.625, 140.625, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 562.5, 281.25, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 281.25, 140.625, 140.625, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 562.5, 281.25, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 281.25, 140.625, 140.625, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 562.5, 281.25, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 281.25, 140.625, 140.625, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 562.5, 281.25, 140.625, 421.875, 281.25, 281.25, 140.625, 421.875, 281.25, 140.625, 421.875, 281.25, 281.25, 140.625, 421.875, 281.25, 140.625, 421.875, 281.25, 281.25, 140.625, 421.875, 140.625, 421.875, 140.625, 421.875, 562.5, 281.25, 140.625, 421.875, 281.25, 281.25, 140.625, 421.875, 281.25, 140.625, 421.875, 281.25, 281.25, 140.625, 421.875, 281.25, 140.625, 421.875, 281.25, 281.25, 140.625, 421.875, 140.625, 281.25, 281.25, 140.625, 421.875, 1125.0, 140.625, 140.625, 140.625, 281.25, 281.25, 281.25, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 281.25, 140.625, 140.625, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 562.5, 281.25, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 281.25, 140.625, 140.625, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 562.5, 281.25, 140.625, 421.875, 281.25, 281.25, 140.625, 421.875, 281.25, 140.625, 421.875, 281.25, 281.25, 140.625, 421.875, 281.25, 140.625, 421.875, 281.25, 281.25, 140.625, 421.875, 140.625, 421.875, 140.625, 421.875, 562.5, 281.25, 140.625, 421.875, 281.25, 281.25, 140.625, 421.875, 281.25, 140.625, 421.875, 281.25, 281.25, 140.625, 421.875, 281.25, 140.625, 421.875, 281.25, 281.25, 140.625, 421.875, 140.625, 281.25, 281.25, 140.625, 421.875, 1125.0, 140.625, 140.625, 140.625, 281.25, 281.25, 281.25, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 281.25, 140.625, 140.625, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 562.5, 281.25, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 281.25, 140.625, 140.625, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 562.5, 281.25, 140.625, 281.25, 140.625, 140.625, 281.25, 281.25, 281.25, 140.625, 140.625, 281.25, 140.625, 281.25, 281.25, 281.25, 281.25, 281.25, 562.5, 562.5, 562.5, 281.25, 281.25, 281.25, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 281.25, 140.625, 140.625, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 562.5, 281.25, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 281.25, 140.625, 140.625, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 562.5, 281.25, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 281.25, 140.625, 140.625, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 562.5, 281.25, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 281.25, 140.625, 140.625, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 140.625, 281.25, 562.5};

int i=0;         // переменная, для защиты от залипания кнопки
int p=0;        // переменная, для защиты от залипания кнопки
int g=0;       // переменная, для защиты от повтора
void setup() {
  Serial.begin(9600);
  pinMode(3, INPUT_PULLUP);
}
bool flag = false;
uint32_t btnTimer = 0;
void loop() {
g=sizeof(myPins)/sizeof(myPins[0]);
  bool btnState = !digitalRead(3);
  if (btnState && !flag && millis() - btnTimer > 1) {
    flag = true;
    btnTimer = millis();
    Serial.println(i);   // Вывод позиции ноты
    tone(tonePin, myPins[i], myPing[i]);
    p=1;
  }

  if (!btnState && flag && millis() - btnTimer > 120) {
    flag = false;
    btnTimer = millis();
i=i+p;
p=0;
  }
if (i>g) {
  i=0;
}
}

И загружаем его на Arduino.

Сборка

Далее подключаем все по схеме:

Вы можете использовать кнопки в любом количестве.

И все! Можно играть, главное соблюдать ритм. Для затравки дам свою любимую мелодию, заставка Евангелиона:

int myPins[] = {261, 311, 349, 311, 349, 349, 466, 415, 391, 349, 391, 391, 466, 523, 349, 311, 466, 391, 466, 466, 523, 311, 233, 233, 311, 311, 349, 233, 233, 233, 391, 415, 391, 349, 311, 349, 391, 415, 391, 261, 261, 293, 311, 311, 293, 293, 311, 349, 415, 391, 349, 311, 391, 391, 349, 329, 349, 261, 261, 293, 293, 311, 233, 311, 311, 349, 233, 233, 233, 391, 415, 391, 349, 311, 349, 391, 415, 391, 261, 261, 293, 311, 311, 293, 293, 311, 349, 415, 391, 349, 311, 391, 391, 349, 329, 349, 391, 415, 391, 311, 311, 293, 311, 311, 293, 349, 349, 311, 293, 261, 293, 311, 311, 293, 349, 293, 261, 233, 311, 311, 293, 311, 311, 293, 349, 349, 311, 293, 311, 349, 391, 415, 391, 349, 311, 349, 391, 261, 311, 349, 311, 349, 349, 466, 415, 391, 349, 391, 391, 466, 523, 349, 311, 293, 293, 261, 293, 349, 311, 311, 261, 311, 349, 311, 349, 349, 466, 415, 391, 349, 391, 391, 466, 523, 349, 311, 466, 466, 391, 466, 466, 523, 261, 311, 349, 311, 349, 349, 466, 415, 391, 349, 391, 391, 466, 523, 349, 311, 466, 466, 391, 466, 466, 523, 311, 233, 233, 311, 311, 349, 233, 233, 233, 391, 415, 391, 349, 311, 349, 391, 415, 391, 261, 261, 293, 311, 311, 293, 293, 311, 349, 415, 391, 349, 311, 391, 391, 349, 329, 349, 261, 261, 293, 293, 311, 233, 311, 311, 349, 233, 233, 233, 391, 415, 391, 349, 311, 349, 391, 415, 391, 261, 261, 293, 311, 311, 293, 293, 311, 349, 415, 391, 349, 311, 391, 391, 349, 329, 349, 391, 415, 391, 311, 311, 293, 311, 311, 293, 349, 349, 311, 293, 261, 293, 311, 311, 293, 349, 293, 261, 233, 311, 311, 293, 311, 311, 293, 349, 349, 311, 293, 311, 349, 391, 415, 391, 349, 311, 349, 391, 261, 311, 349, 311, 349, 349, 466, 415, 391, 349, 391, 391, 466, 523, 349, 311, 293, 293, 261, 293, 349, 311, 311, 261, 311, 349, 311, 349, 349, 466, 415, 391, 349, 391, 391, 466, 523, 349, 311, 466, 466, 391, 466, 466, 523, 261, 311, 349, 311, 349, 349, 466, 415, 391, 349, 391, 391, 466, 523, 349, 311, 466, 466, 391, 466, 466, 523, 311, 311, 293, 311, 311, 293, 349, 349, 311, 293, 261, 293, 311, 311, 293, 349, 293, 261, 233, 311, 311, 293, 311, 311, 293, 349, 349, 311, 293, 311, 349, 391, 415, 391, 349, 311, 349, 391, 261, 311, 349, 311, 349, 349, 466, 415, 391, 349, 391, 391, 466, 523, 349, 311, 293, 293, 261, 293, 349, 311, 311, 261, 311, 349, 311, 349, 349, 466, 415, 391, 349, 391, 391, 466, 523, 349, 311, 466, 466, 391, 466, 466, 523, 261, 311, 349, 311, 349, 349, 466, 415, 391, 349, 391, 391, 466, 523, 349, 311, 466, 466, 391, 466, 466, 523};
int myPing[] = {360.0, 360.0, 270.0, 270.0, 180.0, 360.0, 180.0, 180.0, 90.0, 180.0, 270.0, 360.0, 360.0, 270.0, 270.0, 180.0, 360.0, 180.0, 180.0, 270.0, 1710.0, 180.0, 90.0, 360.0, 90.0, 270.0, 180.0, 90.0, 360.0, 180.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 360.0, 90.0, 90.0, 240.0, 240.0, 240.0, 360.0, 90.0, 90.0, 240.0, 240.0, 240.0, 360.0, 180.0, 240.0, 240.0, 240.0, 360.0, 360.0, 540.0, 180.0, 540.0, 180.0, 540.0, 90.0, 270.0, 180.0, 90.0, 360.0, 180.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 360.0, 90.0, 90.0, 240.0, 240.0, 240.0, 360.0, 90.0, 90.0, 240.0, 240.0, 240.0, 360.0, 180.0, 240.0, 240.0, 3.0, 237.0, 240.0, 240.0, 720.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 720.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 720.0, 360.0, 360.0, 270.0, 270.0, 180.0, 360.0, 180.0, 180.0, 90.0, 180.0, 450.0, 360.0, 360.0, 270.0, 270.0, 180.0, 135.0, 135.0, 180.0, 180.0, 90.0, 180.0, 450.0, 360.0, 360.0, 270.0, 270.0, 180.0, 360.0, 180.0, 180.0, 90.0, 180.0, 450.0, 360.0, 360.0, 270.0, 270.0, 180.0, 135.0, 135.0, 180.0, 180.0, 270.0, 450.0, 360.0, 360.0, 270.0, 270.0, 180.0, 360.0, 180.0, 180.0, 90.0, 180.0, 450.0, 360.0, 360.0, 270.0, 270.0, 180.0, 135.0, 135.0, 180.0, 180.0, 270.0, 270.0, 180.0, 90.0, 360.0, 90.0, 270.0, 180.0, 90.0, 360.0, 180.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 360.0, 90.0, 90.0, 240.0, 240.0, 240.0, 360.0, 90.0, 90.0, 240.0, 240.0, 240.0, 360.0, 180.0, 240.0, 240.0, 240.0, 360.0, 360.0, 540.0, 180.0, 540.0, 180.0, 540.0, 90.0, 270.0, 180.0, 90.0, 360.0, 180.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 360.0, 90.0, 90.0, 240.0, 240.0, 240.0, 360.0, 90.0, 90.0, 240.0, 240.0, 240.0, 360.0, 180.0, 240.0, 240.0, 3.0, 237.0, 240.0, 240.0, 720.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 720.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 720.0, 360.0, 360.0, 270.0, 270.0, 180.0, 360.0, 180.0, 180.0, 90.0, 180.0, 450.0, 360.0, 360.0, 270.0, 270.0, 180.0, 135.0, 135.0, 180.0, 180.0, 90.0, 180.0, 450.0, 360.0, 360.0, 270.0, 270.0, 180.0, 360.0, 180.0, 180.0, 90.0, 180.0, 450.0, 360.0, 360.0, 270.0, 270.0, 180.0, 135.0, 135.0, 180.0, 180.0, 270.0, 450.0, 360.0, 360.0, 270.0, 270.0, 180.0, 360.0, 180.0, 180.0, 90.0, 180.0, 450.0, 360.0, 360.0, 270.0, 270.0, 180.0, 135.0, 135.0, 180.0, 180.0, 270.0, 270.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 720.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 240.0, 720.0, 360.0, 360.0, 270.0, 270.0, 180.0, 360.0, 180.0, 180.0, 90.0, 180.0, 450.0, 360.0, 360.0, 270.0, 270.0, 180.0, 135.0, 135.0, 180.0, 180.0, 90.0, 180.0, 450.0, 360.0, 360.0, 270.0, 270.0, 180.0, 360.0, 180.0, 180.0, 90.0, 180.0, 450.0, 360.0, 360.0, 270.0, 270.0, 180.0, 135.0, 135.0, 180.0, 180.0, 270.0, 450.0, 360.0, 360.0, 270.0, 270.0, 180.0, 360.0, 180.0, 180.0, 90.0, 180.0, 450.0, 360.0, 360.0, 270.0, 270.0, 180.0, 135.0, 135.0, 180.0, 180.0, 270.0, 270.0};

И наконец фото готового проекта:

проект_детского_пианино.txt · Последнее изменение: 2021/01/12 21:51 — admin

Инструменты страницы