Детское пианино на Arduino
от Metalismatic
Сегодня я научу вас, как сделать детское пианино на базе микроконтроллера Arduino UNO. Это не является серьезной поделкой, сборка оного не вызовет у вас никаких сложностей, более того, можно ничего не паять, а собрать на макетной плате. Музицировать на нем не получится, но если нажимать в нужном ритме клавиши, то услышите свою музыку, которую вы запишите.
Необходимо:
Arduino UNO
Бузер
Провода Dupont
Тактовые кнопки 12 мм.
Макетная плата
Конвертируем музыку в код
Основой этого проекта послужить сервис по переводу мелодий в формате MIDI в код, понятный для ардуино:
https://extramaster.net/tools/midiToArduino/
Суть данного сервиса проста, вы грузите музыку, получаете код, который в свою очередь загружаете на Arduino и вуаля, можно слушать любую музыку через бузер. Но есть и минусы, например память у Arduino UNO всего 32 Кб памяти и полностью записать музыку вы точно не сможете. Также нельзя слушать музыку в "многоголосье", то есть строго записываем только один инструмент.
Но нам это скучно, поэтому мы выбираем любую музыку, находим ее в формате MIDI и скачиваем. Далее загружаем на этот сервис и получаем подобный код:
Подключаем бузер на 11 пин, запускаем на Arduino и слушаем, если все работает, то идем дальше.
Подготавливаем код
Копируем наш код и вставляем сюда:
https://wiki.droidbot.store/doku.php?id=piano_parser
Получаем готовые массивы с записанными в них тональностями звука и вставляем их вместо строчек:
В этом коде:
И загружаем его на Arduino.
Сборка
Далее подключаем все по схеме:
Вы можете использовать кнопки в любом количестве.
И все! Можно играть, главное соблюдать ритм. Для затравки дам свою любимую мелодию, заставка Евангелиона:
И наконец фото готового проекта:
Скоро проект будет доступен под заказ в моем магазине, в виде набора с корпусом.
Необходимо:
Arduino UNO
Бузер
Провода Dupont
Тактовые кнопки 12 мм.
Макетная плата
Конвертируем музыку в код
Основой этого проекта послужить сервис по переводу мелодий в формате 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();
- }
Подготавливаем код
Копируем наш код и вставляем сюда:
https://wiki.droidbot.store/doku.php?id=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.
Сборка
Далее подключаем все по схеме:
Вы можете использовать кнопки в любом количестве.
И все! Можно играть, главное соблюдать ритм. Для затравки дам свою любимую мелодию, заставка Евангелиона:
Открыть спойлер
И наконец фото готового проекта:
Скоро проект будет доступен под заказ в моем магазине, в виде набора с корпусом.