Оглавление:

EAL - MIDI-контроллер Arduino: 7 шагов
EAL - MIDI-контроллер Arduino: 7 шагов

Видео: EAL - MIDI-контроллер Arduino: 7 шагов

Видео: EAL - MIDI-контроллер Arduino: 7 шагов
Видео: Arduino midi controller (все просто 🎛️) 2024, Июль
Anonim
EAL - MIDI-контроллер Arduino
EAL - MIDI-контроллер Arduino

Сделано Сёреном Остергаардом Петерсеном, OEAAM16EDA

Эта инструкция описывает MIDI-контроллер на базе Arduino. Это школьный проект. Используя свою руку, вы можете играть простые мелодии через MIDI-соединение и подключенный MIDI-инструмент (или, как в этом случае, ноутбук с программным обеспечением softsynth). Вы можете играть ноты до мажор, c-d-e-f-g-a-b-c. Чтобы подключить MIDI-контроллер к ноутбуку, вам понадобится интерфейс MIDI-USB, например m-audio Uno.

Шаг 1. Демонстрационное видео

Image
Image

Увеличьте громкость и наслаждайтесь!

Как это работает:

MIDI-контроллер использует плату Arduino MEGA 2560. Два световых датчика (LDR), встроенные в 16-миллиметровую электрическую трубку, образуют систему с двумя датчиками и используются для создания стабильного триггера без ложного двойного срабатывания. Фонарик излучает световой луч, когда луч прерывается рукой, играющей на контроллере, нижний датчик света определяет отсутствие луча, а ультразвуковой датчик HC-SR04 измеряет расстояние от датчика до руки.

Измеренное расстояние используется в программе Arduino для расчета и установки соответствующего значения номера ноты, которое будет упаковано в сообщение MIDI Note On и передано через интерфейс MIDI. Интерфейс вывода MIDI использует шестнадцатеричный инвертор 74HC14 и представляет собой в значительной степени стандартную схему. MIDI-связь использует serial1, стандартный последовательный порт используется для отладки.

Когда рука перемещается прямо вверх и в сторону от светового луча, верхний датчик света снова улавливает световой луч, и сообщение MIDI Note Off упаковывается и передается на MIDI-выходе.

Игровая зона между датчиками составляет около 63 см, а общая длина MIDI-контроллера составляет около 75 см.

Шаг 2: Подробная информация о датчиках освещенности

Подробная информация о датчиках света
Подробная информация о датчиках света
Подробная информация о датчиках света
Подробная информация о датчиках света

Два световых сенсора устанавливаются друг на друга, образуя двойную сенсорную систему. Это предотвращает ложное срабатывание при правильном использовании в программном обеспечении. Каждый датчик света состоит из модуля фоторезистора, встроенного в стандартную электрическую трубку диаметром 16 мм. С помощью ножовки проделывают прорезь в каждой трубке, и печатную плату фоторезистора можно вдавить в прорезь. Датчики скреплены изолентой, а также прикреплены к одному концу куска дерева. Свет не должен попадать на датчики сзади. В датчиках света встроены подтягивающие резисторы на 10 кОм.

Шаг 3: Подробная информация об ультразвуковом датчике HC-SR04

Подробная информация об ультразвуковом датчике HC-SR04
Подробная информация об ультразвуковом датчике HC-SR04

Ультразвуковой датчик HC-SR04 закреплен на другом конце MIDI-контроллера. Здесь же размещен яркий фонарик, он создает необходимый световой луч.

Шаг 4: Схема Aduino

Автодром Адуино
Автодром Адуино
Автодром Адуино
Автодром Адуино

Схема вывода MIDI представляет собой стандартный шестигранный инвертор 74HC14 с несколькими резисторами и 5-контактным гнездовым разъемом DIN. Схема 74HC14 управляет выходом MIDI и в то же время обеспечивает некоторые средства защиты платы Arduino от «реального мира», подключенного к выходу MIDI. Дополнительной практичной функцией является светодиодный индикатор активности MIDI, который сигнализирует об отправке данных.

Я использовал подходящий прототип печатной платы для своего оборудования, потому что у меня было много проблем с плохими соединениями на моей макетной плате. Схема сделана во Fritzing, копию в формате pdf в высоком разрешении можно скачать, нажав на ссылку ниже. Я предпочитаю использовать правильную программу создания схем, такую как Kicad, я думаю, что Fritzing ограничен для чего угодно, кроме простейших экспериментов.

Используемые материалы:

1 шт. Arduino MEGA 2560

Фоторезистор (LDR) 2 шт. Со встроенным подтягивающим резистором (из комплекта 37 датчиков)

1 шт. Ультразвуковой датчик HC-SR04

1 шт. 74HC14 шестигранный инвертирующий триггер Шмитта

2 шт резистор 220 Ом 0.25Вт

1 шт резистор 1 кОм 0,25 Вт

1 шт. Светодиод с низким током 2 мА

1 керамический конденсатор 100 нФ (для развязки источника питания, непосредственно на выводах питания 74HC14)

Макетная плата или прототип печатной платы

2 электрические трубки 16 мм, длина 65 мм

1 кусок дерева, длина 75см

Скотч

Провода

Шаг 5: Список входов / выходов

Список вводов / выводов
Список вводов / выводов

Шаг 6: Код Aduino

Скетч test_Midi6 использует библиотеку NewPing, которую вы должны включить в среду программирования Arduino, чтобы использовать ультразвуковой датчик HC-SC04. Скетч прокомментирован на датском языке, извините.. Чтобы скетч был хорошо структурирован, отдельные функции созданы для различных логических частей скетча, а глобальные переменные по большей части избегаются. Программный поток визуализирован в pdf блок-схеме MIDI-контроллера.

// 15-05-2017 версия: test_Midi6

// Søren Østergaard Petesen // Arduino MEGA 2560 // Эта программа предназначена для упрощенного MIDI-контроллера с использованием внешнего интерфейса MIDI, например программного обеспечения на ПК. // MIDI controlleren kan sende toneanslag (примечание о команде) hhv. (обратите внимание на команду) для en oktav C-C, C dur skala. // Der spilles med en "karate hånd" på et brædt // hvor sensorerne er monteret. MIDI-команда запускает двойной датчик LDR, da der skal laves en sikker // обнаружение приземления на борту (примечание включено), samt når hånden fjernes igen (примечание выключено). // MIDI-команда "note on" или "note off" лучше всего из 3 байтов, которые отправляются через последовательный порт // вы можете использовать аппаратное обеспечение MIDI-интерфейса. // Tonehøjden bestemmes vha ultralydssensor HC-SR04 #include // bibliotek til den anvendte ultralydssensor HC-SR04 #define TRIGGER_PIN 3 // Штырь Arduino до триггерного штифта ультразвукового датчика #define ECHO_PIN 2 // Штифт Arduino для ультразвукового датчика # Ультразвуковой датчик Arduino define MAX_DISTANCE 100 // Максимальное значение для Ping #define Median 5 // Antal målinger der beregnes gennemsnit af for at få en sikker afstandsbestemmelse NewPing sonar (TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // Создание объекта NewPing. int Senspin1 = 53; // Underste LDR1 føler int Senspin2 = 52; // Øverste LDR2 føler byte MIDIByte2; // Объявление переменных для MIDIByte2 bool klar_note_on = 1; // Вариабельная декларация для klar_note_on, styrer afsendelse для примечания к команде. Første kommando er en note on kommando bool klar_note_off = 0; // Вариабельная декларация для klar_note_off, Styrer afsendelse af note off kommando void setup () {pinMode (Senspin1, INPUT); // Сенсор ввода pinMode (Senspin2, INPUT); // Сенсор ввода Serial1.begin (31250); // Сообщение Serial1 до MIDI: 31250 бит / сек Serial.begin (9600); // мониторинг последовательного порта, til test} void loop () {bool Sensor1 = digitalRead (Senspin1); // Læs LDR1 - ниже LDR bool Sensor2 = digitalRead (Senspin2); // læs LDR2 - øverste LDR if (Sensor1 && klar_note_on) // hvis LDR1 активируется и закрывается на заметку на {byte Note_Byte = Hent_tonehojde (); // Hent тональный сигнал через датчик ultralyds MIDIByte2 = Hent_MidiByte2 (Note_Byte); // Получение MidByte2, номера MIDI-ноты, værdien 0xFF er out of range Send_Note_On (MIDIByte2); // функция kald Send_Note_On klar_note_on = 0; // der skal kun отправляет заметку о команде klar_note_off = 1; // næste kommando er note off} if (Sensor2 &&! Sensor1 && klar_note_off) // Hvis der skal отправляет примечание от kommando gøres det her.. {Send_Note_Off (MIDIByte2); // отправить записку от команды klar_note_off = 0; // der skal kun отправляет en note off kommando} if (! Sensor1 &&! Sensor2) // ее больше не нужно знать о команде, hånd er væk fra brædt {klar_note_on = 1; }} byte Hent_MidiByte2 (byte NoteByte) {// Номер MIDI-ноты возвращателя функции Denne, значение от NoteByte byte MIDIB2; switch (NoteByte) // ее параметры, определяющие значение MIDIByte2, имеют значение Note_Byte {case 0: {MIDIB2 = 0x3C; // тон 'C'} break; случай 1: {MIDIB2 = 0x3E; // тонен 'D'} break; случай 2: {MIDIB2 = 0x40; // тон 'E'} break; случай 3: {MIDIB2 = 0x41; // тон 'F'} break; случай 4: {MIDIB2 = 0x43; // тонен 'G'} break; случай 5: {MIDIB2 = 0x45; // тон 'A'} break; случай 6: {MIDIB2 = 0x47; // тонен 'B'} break; случай 7: {MIDIB2 = 0x48; // тон 'C'} break; по умолчанию: {MIDIB2 = 0xFF; // вне допустимого диапазона}} return MIDIB2; // номер MIDI-ноты, возвращающего номер} byte Hent_tonehojde () {// Эта функция возвращает результат ultralydsmålingen unsigned int Tid_uS; // målt tid i uS byte Afstand; // beregnet afstand i cm byte resultat; // добавление ошибки const float Omregningsfaktor = 58.3; // 2 * (1/343 м / с) / 100 = 58, 3 мкСм / см, последние 2 дня после удаления мусора. Tid_uS = sonar.ping_median (медиана); // Посылаем эхо-запрос и возвращаемся, отправляем сообщение Median Målinger Afstand = Tid_uS / Omregningsfaktor; // Продолжительность до расстояния в см (0 = вне диапазона расстояний) resultat = Afstand / 8; // Берегите результат return resultat; // Результат возврата} void Send_Note_On (byte tonenr) {// Указать функцию отправителя в примечании к команде на MIDI-интерфейсе const byte kommando = 0x90; // Примечание о команде на MIDI-канале 1 const byte volumen = 0xFF; // объем / скорость = 127 Serial1.write (команда); // отправляем записку по команде Serial1.write (tonenr); // отправить номер тона Serial1.write (volumen); // отправить объем (скорость)} void Send_Note_Off (byte tonenr) {// Отменить функцию отправителя примечания от команды к MIDI-интерфейсу const byte kommando = 0x80; // Отключение команды на MIDI-канале 1 const byte volumen = 0xFF; // объем / скорость = 127 Serial1.write (команда); // отправить записку от команды Serial1.write (tonenr); // отправить номер тона Serial1.write (volumen); // отправляем объем (скорость)}

Шаг 7: Основы MIDI-коммуникации

MIDI (цифровой интерфейс музыкальных инструментов) - это универсальный протокол последовательной связи для взаимодействия электронных музыкальных инструментов и других устройств. Используется последовательная связь (31250 бит / с, среда передачи - токовая петля, оптоизолированная на стороне приемника. Используются 5-контактные разъемы DIN. В одном физическом MIDI-соединении возможно 16 логических каналов связи. Многие команды определены в MIDI. стандарт, в этом проекте я использую две команды, эти команды состоят из 3 байтов:

а) Примечание по команде:

1. отправка байта = 0x90 означает примечание по команде на MIDI-канале 1

2. byte send = 0xZZ ZZ - номер ноты, я использую диапазон от 0x3C до 0x48

3. отправка байта = 0xFF FF = 255, что означает максимальный объем, диапазон от 0x00 до 0xFF

б) Команда отключения ноты: 1. byte send = 0x80 означает команду отключения ноты на MIDI-канале 1

2. byte send = 0xZZ ZZ - номер ноты, я использую диапазон от 0x3C до 0x48

3. отправка байта = 0xFF FF = 255, что означает максимальный объем, диапазон от 0x00 до 0xFF

Рекомендуемые: