Мелодия с днем рождения на Arduino Nano с 3-полосной полифонией
Компоненты и расходные материалы
| × | 1 |
Приложения и онлайн-сервисы
|
Об этом проекте
Воспроизведите тему полифонии «С днем рождения» на Arduino Nano с помощью трех зуммеров на одном мини-макете.
Прежде всего - демонстрация
Подключите эту штуку к любому источнику питания USB (не только к компьютеру), и она будет бесконечно воспроизводить мелодию «С днем рождения» ... почти ... пока она вам не надоест =]
Кстати, индикаторы мигают при каждом изменении ноты в соответствующем канале / зуммере.
Схема
Идея заключалась в том, чтобы сделать сверхкомпактное устройство (почти) без пайки.
В конце концов мне удалось уместить все необходимое на такой крошечной макетной плате:
Отверстия внутри макета соединяются таким образом:
Хитрость здесь в том, что плата Arduino Nano помещается в такой макет, просто ИДЕАЛЬНО позволяя нам подключать некоторые дополнительные компоненты с обеих сторон макета.
Извините, ребята ... Мне лень рисовать здесь какие-либо схемы, но этот случай НАСТОЛЬКО прост, что я уверен, что этих крупных планов будет более чем достаточно, чтобы во всем разобраться =]
Как видите, здесь я использую плату Arduino Nano v3.0 от Gravitech, но подойдет любой аналог. Зуммеры и светодиоды здесь ОЧЕНЬ обычные. На самом деле им не обязательно соответствовать каким-либо специальным параметрам.
Резисторы здесь 100 Ом ... хотя общий "стандарт" защиты светодиодов от перегрузки 220 Ом ... да кого это волнует ... ¯ \ _ (ツ) _ / ¯
Единственное, что, вероятно, не так очевидно здесь, на этих фотографиях, - это то, что контакты зуммеров вставлены в макет следующим образом:
Также обратите внимание, что центральный канал больше остальных - это потому, что он используется для «басового» музыкального канала ☝🏻
... просто шучу! ^ __ ^ Они все пищат как сумасшедший хор мышей без разницы в звуковых возможностях =]
Таким образом, вы можете без проблем использовать три идентичных зуммера, однако вам придется разместить их в немного разных положениях на макетной плате, а также изменить номера выходных контактов в программном коде в соответствии с вашим новым размещением зуммеров.
Также обратите внимание на еще одну небольшую "хитрость" ... в любом случае, мы находимся на взломе тут стер что ли? =] Итак, я использую несколько ввода / вывода Arduino. здесь булавки как заземление контакты для зуммеров и светодиодов 😱😱. Да это правильно. Фактически, если вы установите состояние «LOW» для любого вывода ввода / вывода Arduino в своей программе, вы можете использовать эти выводы точно так же, как вы используете стандартные выводы GND на платах Arduino. Круто, правда?;)
О программе ...
Полный список скетча Arduino IDE представлен ниже. Однако вам придется установить дополнительную библиотеку «Tone», чтобы скомпилировать скетч, который вы можете скачать здесь:
https://www.dropbox.com/s/q1udxg4yi47emeo/Tone.zip?dl=0
(если есть всплывающее окно с регистрационным «предложением», просто закройте его кнопкой «x» в углу)
Самый простой способ установить эту библиотеку:в главном меню Arduino IDE выберите Sketch - Include Library - Add .ZIP Library ... а затем выберите загруженный zip-файл ... легко ¯ \ _ (ツ) _ / ¯
Эта библиотека необходима для одновременной генерации нескольких тонов на одном контроллере (для достижения этой цели она использует некоторые дополнительные аппаратные таймеры и аппаратные прерывания "под капотом"). Проще говоря, это что-то вроде "многозадачности деревенщины" на одном ядре процессора без какой-либо ОС =]
Кстати, вот автор библиотеки (спасибо братан! =]):
http://playground.arduino.cc/Profiles/Bhagman
... и страницу библиотеки на GitHub:
https://github.com/bhagman/Tone
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ 🙂:
Честно говоря, мой программный код здесь довольно громоздкий и его трудно читать. Это в основном из-за необходимости «жонглировать» тремя «независимыми» потоками мелодий одновременно только из одного линейного потока команд. Я действительно собирался реорганизовать код позже, чтобы иметь возможность отделить мелодии друг от друга и использовать его в будущем для воспроизведения разных песен ... но я, вероятно, не буду =]
Удачи. Любые отзывы приветствуются.
Спасибо, что дочитали до конца =]
Код
- С Днем Рождения
Happy_birthday Arduino
Не забудьте установить библиотеку тонов !!#includeTone solo; Tone bass; Tone rythm; const int t =600; // продолжительность четвертой ноты const int tt =t * 2; const int t14 =round (t * 1/4); const int t24 =round (t * 2/4); const int t34 =round (t * 3/4); const int bassLedPin =15; // вывод сигнала басового светодиода (он же A1) const int rythmLedPin =17; // ритм вывода сигнала светодиода (он же A3) const int soloLedPin =19; // вывод сигнала соло (он же A5) void wait (Tone t) {while (t.isPlaying ()) {}} int bassLedState =LOW; void switchBassLed () {if (bassLedState ==LOW) bassLedState =HIGH; иначе bassLedState =LOW; digitalWrite (bassLedPin, bassLedState);} int rythmLedState =LOW; void switchRythmLed () {if (rythmLedState ==LOW) rythmLedState =HIGH; иначе rythmLedState =LOW; digitalWrite (rythmLedPin, rythmLedState);} int soloLedState =LOW; void switchSoloLed () {if (soloLedState ==LOW) soloLedState =HIGH; иначе soloLedState =LOW; digitalWrite (soloLedPin, soloLedState);} установка void (void) {pinMode (14, OUTPUT); // вывод заземления светодиода (он же A0) pinMode (16, OUTPUT); // вывод заземления светодиода (он же A2) pinMode (18, OUTPUT); // вывод заземления светодиода (он же A4) pinMode (bassLedPin, OUTPUT); // сигнал басового светодиода pinMode (rythmLedPin, OUTPUT); // ритм светодиодного сигнала pin pinMode (soloLedPin, OUTPUT); // одиночный сигнал светодиода pinMode (2, OUTPUT); // вывод заземления соло зуммера pinMode (9, OUTPUT); // ритм зуммера заземляющий контакт solo.begin (6); // сигнал соло зуммера bass.begin (12); // сигнал басового зуммера rythm.begin (0); // Ритм зуммера, сигнальный пин solo.play (NOTE_D4, t34); switchSoloLed (); ждать (соло); solo.play (NOTE_D4, t14); switchSoloLed (); ждать (соло);} пустая петля (пустота) {bass.play (NOTE_G3, t); switchBassLed (); rythm.play (NOTE_G4, t24); switchRythmLed (); solo.play (NOTE_E4, t); switchSoloLed (); ждать (ритм); rythm.play (ПРИМЕЧАНИЕ_B4, t14); switchRythmLed (); ждать (ритм); rythm.play (NOTE_D5, t14); switchRythmLed (); ждать (rythm); bass.play (NOTE_B3, t); switchBassLed (); rythm.play (NOTE_G4, t24); switchRythmLed (); solo.play (NOTE_D4, t); switchSoloLed (); ждать (ритм); rythm.play (ПРИМЕЧАНИЕ_B4, t14); switchRythmLed (); ждать (ритм); rythm.play (NOTE_D5, t14); switchRythmLed (); ждать (rythm); bass.play (NOTE_D4, t); switchBassLed (); rythm.play (NOTE_G4, t24); switchRythmLed (); solo.play (NOTE_G4, t); switchSoloLed (); ждать (ритм); rythm.play (ПРИМЕЧАНИЕ_B4, t14); switchRythmLed (); ждать (ритм); rythm.play (NOTE_D5, t14); switchRythmLed (); ждать (rythm); bass.play (NOTE_D4, t); switchBassLed (); rythm.play (NOTE_D5, t24); switchRythmLed (); solo.play (NOTE_FS4, tt); switchSoloLed (); ждать (ритм); rythm.play (NOTE_FS5, t14); switchRythmLed (); ждать (ритм); rythm.play (NOTE_A5, t14); switchRythmLed (); ждать (rythm); bass.play (NOTE_FS4, t); switchBassLed (); rythm.play (NOTE_D5, t24); switchRythmLed (); ждать (ритм); rythm.play (NOTE_FS5, t14); switchRythmLed (); ждать (ритм); rythm.play (NOTE_A5, t14); switchRythmLed (); ждать (rythm); bass.play (NOTE_A4, t); switchBassLed (); rythm.play (NOTE_D5, t24); switchRythmLed (); solo.play (NOTE_D4, t34); switchSoloLed (); ждать (ритм); rythm.play (NOTE_FS5, t14); switchRythmLed (); ждать (ритм); rythm.play (NOTE_A5, t14); switchRythmLed (); solo.play (NOTE_D4, t14); switchSoloLed (); ждать (rythm); bass.play (NOTE_D4, t); switchBassLed (); rythm.play (NOTE_D5, t24); switchRythmLed (); solo.play (NOTE_E4, t); switchSoloLed (); ждать (ритм); rythm.play (NOTE_FS5, t14); switchRythmLed (); ждать (ритм); rythm.play (NOTE_A5, t14); switchRythmLed (); ждать (ритм); bass.play (NOTE_FS4, t); switchBassLed (); rythm.play (NOTE_D5, t24); switchRythmLed (); solo.play (NOTE_D4, t); switchSoloLed (); ждать (ритм); rythm.play (NOTE_FS5, t14); switchRythmLed (); ждать (ритм); rythm.play (NOTE_A5, t14); switchRythmLed (); ждать (ритм); bass.play (NOTE_A4, t); switchBassLed (); rythm.play (NOTE_D5, t24); switchRythmLed (); solo.play (NOTE_A4, t); switchSoloLed (); ждать (ритм); rythm.play (NOTE_FS5, t14); switchRythmLed (); ждать (ритм); rythm.play (NOTE_A5, t14); switchRythmLed (); ждать (ритм); bass.play (NOTE_G3, t); switchBassLed (); rythm.play (NOTE_G4, t24); switchRythmLed (); solo.play (NOTE_G4, tt); switchSoloLed (); ждать (ритм); rythm.play (ПРИМЕЧАНИЕ_B4, t14); switchRythmLed (); ждать (ритм); rythm.play (NOTE_D5, t14); switchRythmLed (); ждать (rythm); bass.play (NOTE_B3, t); switchBassLed (); rythm.play (NOTE_G4, t24); switchRythmLed (); ждать (ритм); rythm.play (ПРИМЕЧАНИЕ_B4, t14); switchRythmLed (); ждать (ритм); rythm.play (NOTE_D5, t14); switchRythmLed (); ждать (ритм); бас. игра (NOTE_D4, t); switchBassLed (); rythm.play (NOTE_G4, t24); switchRythmLed (); solo.play (NOTE_D4, t34); switchSoloLed (); ждать (ритм); rythm.play (ПРИМЕЧАНИЕ_B4, t14); switchRythmLed (); ждать (ритм); rythm.play (NOTE_D5, t14); switchRythmLed (); solo.play (NOTE_D4, t14); switchSoloLed (); ждать (rythm); bass.play (NOTE_G3, t); switchBassLed (); rythm.play (NOTE_G4, t24); switchRythmLed (); solo.play (NOTE_D5, t); switchSoloLed (); ждать (ритм); rythm.play (ПРИМЕЧАНИЕ_B4, t14); switchRythmLed (); ждать (ритм); rythm.play (NOTE_D5, t14); switchRythmLed (); ждать (ритм); bass.play (NOTE_B3, t); switchBassLed (); rythm.play (NOTE_G4, t24); switchRythmLed (); solo.play (NOTE_B4, t); switchSoloLed (); ждать (ритм); rythm.play (ПРИМЕЧАНИЕ_B4, t14); switchRythmLed (); ждать (ритм); rythm.play (NOTE_D5, t14); switchRythmLed (); ждать (ритм); бас. игра (NOTE_D4, t); switchBassLed (); rythm.play (NOTE_G4, t24); switchRythmLed (); solo.play (NOTE_G4, t); switchSoloLed (); ждать (ритм); rythm.play (ПРИМЕЧАНИЕ_B4, t14); switchRythmLed (); ждать (ритм); rythm.play (NOTE_D5, t14); switchRythmLed (); ждать (ритм); бас. игра (NOTE_C4, t); switchBassLed (); rythm.play (NOTE_C5, t24); switchRythmLed (); solo.play (NOTE_FS4, t); switchSoloLed (); ждать (ритм); rythm.play (NOTE_E5, t14); switchRythmLed (); ждать (ритм); rythm.play (NOTE_G5, t14); switchRythmLed (); ждать (ритм); bass.play (NOTE_E4, t); switchBassLed (); rythm.play (NOTE_C5, t24); switchRythmLed (); solo.play (NOTE_E4, t); switchSoloLed (); ждать (ритм); rythm.play (NOTE_E5, t14); switchRythmLed (); ждать (ритм); rythm.play (NOTE_G5, t14); switchRythmLed (); ждать (ритм); бас. игра (NOTE_G4, t); switchBassLed (); rythm.play (NOTE_C5, t24); switchRythmLed (); solo.play (NOTE_C5, t34); switchSoloLed (); ждать (ритм); rythm.play (NOTE_E5, t14); switchRythmLed (); ждать (ритм); rythm.play (NOTE_G5, t14); switchRythmLed (); solo.play (NOTE_C5, t14); switchSoloLed (); ждать (rythm); bass.play (NOTE_G3, t); switchBassLed (); rythm.play (NOTE_G4, t24); switchRythmLed (); solo.play (NOTE_B4, t); switchSoloLed (); ждать (ритм); rythm.play (ПРИМЕЧАНИЕ_B4, t14); switchRythmLed (); ждать (ритм); rythm.play (NOTE_D5, t14); switchRythmLed (); ждать (ритм); bass.play (NOTE_D3, t); switchBassLed (); rythm.play (NOTE_G4, t24); switchRythmLed (); solo.play (NOTE_G4, t); switchSoloLed (); ждать (ритм); rythm.play (ПРИМЕЧАНИЕ_B4, t14); switchRythmLed (); ждать (ритм); rythm.play (NOTE_D5, t14); switchRythmLed (); ждать (ритм); bass.play (NOTE_FS3, t); switchBassLed (); rythm.play (NOTE_D5, t24); switchRythmLed (); solo.play (NOTE_A4, t); switchSoloLed (); ждать (ритм); ждать (ритм); rythm.play (NOTE_FS5, t14); switchRythmLed (); ждать (ритм); rythm.play (NOTE_A5, t14); switchRythmLed (); ждать (ритм); bass.play (NOTE_G3, t); switchBassLed (); rythm.play (NOTE_G4, t24); switchRythmLed (); solo.play (NOTE_G4, tt); switchSoloLed (); ждать (ритм); rythm.play (ПРИМЕЧАНИЕ_B4, t14); switchRythmLed (); ждать (ритм); rythm.play (NOTE_D5, t14); switchRythmLed (); ждать (rythm); bass.play (NOTE_B3, t); switchBassLed (); rythm.play (NOTE_G4, t24); switchRythmLed (); ждать (ритм); rythm.play (ПРИМЕЧАНИЕ_B4, t14); switchRythmLed (); ждать (ритм); rythm.play (NOTE_D5, t14); switchRythmLed (); ждать (ритм); solo.play (NOTE_D4, t34); switchSoloLed (); ждать (соло); solo.play (NOTE_D4, t14); switchSoloLed (); ждать (соло);}
Производственный процесс
- Мониторинг CO2 с помощью датчика K30
- Слепоглухое общение с 1Sheeld / Arduino
- Управление монетоприемником с помощью Arduino
- Цветы - Arduino Nano, CrazyCircuits, DFRobot
- Arduino с Bluetooth для управления светодиодом!
- Емкостной датчик отпечатков пальцев с Arduino или ESP8266
- Игра с дисплеем Nextion
- Роботизированная рука, управляемая нунчук (с Arduino)
- Arduino Nano:управление двумя шаговыми двигателями с помощью джойстика
- Портативный счетчик Гейгера с Arduino Nano