Сегодня я научу вас, как сделать детское пианино на базе микроконтроллера 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};
И наконец фото готового проекта: