Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

USB-MIDI-адаптер

Компоненты и расходные материалы

Arduino Micro
Или Arduino Leonardo
× 1
6n137 Оптопара
× 1
1N4148 - быстрое переключение общего назначения
× 1
Конденсатор 100 нФ
× 1
Резистор 220 Ом
× 3
Резистор 10 кОм
× 1
Резистор в сквозное отверстие, 470 Ом
× 1
LED (общий)
× 1
держатель светодиода
кое-что для крепления светодиода в пластиковом корпусе
× 1
Аудио / видео разъем DIN, 5 контактов
плюс болты и гайки для крепления соединителей
× 2
Случай
Пластиковый корпус для всех компонентов
× 1
PCB
Часть общей печатной платы
× 1
Крепления для печатных плат
Что-нибудь для крепления вашей печатной платы к корпусу, например нейлоновые стойки
× 1

Приложения и онлайн-сервисы

IDE Arduino

Об этом проекте

Я искал в сети, как создать адаптер USB-MIDI с помощью Arduino, но, к сожалению, я нашел только не очень хорошие решения (плохие программные или аппаратные реализации MIDI). Поэтому я решил создать свой собственный и выложить результат здесь, на hackster.io.

Я использовал Arduino Leonardo с макетной платой для создания первого прототипа. Когда все заработало, я построил припаянную версию, используя вместо этого Arduino Micro. Оба основаны на ATmega32u4, который имеет собственный USB-порт, что позволяет ему работать как USB-MIDI-интерфейс для ПК, к которому вы его подключаете.

MIDI использует оптопару и несколько резисторов для создания полностью изолированной токовой петли. Схема довольно стандартная, я использовал 6n137, он быстрый и широко распространенный. Как показано на принципиальной схеме, только разъем MIDI OUT имеет контакт 2, подключенный к земле, это стандарт для MIDI.

Несколько фото конечного результата:

Что касается программного обеспечения, я решил использовать отличную библиотеку Control Surface. В отличие от некоторых других библиотек или реализаций, написанных вручную, Control Surface правильно обрабатывает все различные аспекты довольно сложного протокола MIDI.

Control Surface также позволяет добавлять всевозможные дополнения. Вы можете, например, добавить несколько потенциометров, педалей или кнопок, подключенных к аналоговым / цифровым входам, чтобы добавить дополнительные элементы управления MIDI. Просто загляните на веб-сайт Control Surface для получения дополнительной информации, это действительно просто!

Вы также можете зарегистрировать обратные вызовы, чтобы обрабатывать данные перед передачей с MIDI на USB или в другом направлении. В моем случае я использовал это, чтобы исправить сломанную реализацию MIDI в моем синтезаторе Roland D50. D50 посылает команду «все ноты выключены» каждый раз, когда нажимается последняя клавиша. Современные реализации, такие как большинство инструментов VST, которые я использую, интерпретируют это как немедленное резкое отключение всех сустейнов бегущей ноты. После фильтрации «все ноты отключены» D50 снова становится полезным в качестве мастер-клавиатуры.

Одна проблема, с которой я столкнулся с библиотекой Control Surface, заключается в том, что она плохо справляется с большими пакетами SysEx. Это приводило к ошибкам при попытке использовать редактор / библиотекарь D50, так как он отправлял довольно большие пакеты SysEx. Я добавил инструкции в заголовок комментария исходного кода о том, как исправить эту проблему. Автор библиотеки указал, что эта проблема будет устранена после выхода версии 2.x.

Я включил как базовый исходный код интерфейса USB-MIDI, так и версию с фильтрацией «все ноты отключены».

Вы также можете использовать другие библиотеки или написать свою собственную реализацию MIDI, конечно, оборудование должно работать с любой библиотекой MIDI с поддержкой USB MIDI и последовательного MIDI.

Совет по устранению неполадок:если вам не удается заставить этот интерфейс взаимодействовать с внешними MIDI-устройствами, возможно, вы поменяли местами контакты 4 и 5. Схемы контактов разъема иногда могут сбивать с толку поскольку они не всегда четко указывают, с какой стороны соединителя вы просматриваете.

Я надеюсь, что схемы и исходный код будут полезны всем здесь. Поставьте мне отметку "Нравится", если вам нравится этот проект, и не стесняйтесь оставлять комментарии ниже, если у вас есть какие-либо вопросы.

Код

  • Исходный код для базового интерфейса MIDI-USB.
  • Исходный код для адаптера MIDI-USB с фильтром "все ноты отключены".
Исходный код для базового интерфейса MIDI-USB Arduino
 / * * USB-MIDI-адаптер. * * --- * * Чтобы разрешить более крупные пакеты sysex, измените библиотеку Control Surface следующим образом:* * In:* src \ MIDI_Parsers \ MIDI_MessageTypes.hpp * change:* uint8_t length; * to:* size_t length; * * В:* src / Settings / Settings.hpp * изменение:* constexpr size_t SYSEX_BUFFER_SIZE =128; * в:* constexpr size_t SYSEX_BUFFER_SIZE =320; * * Это должно быть исправлено, когда выйдет Control Surface 2.x. * * --- * * Чтобы использовать другое имя USB-устройства, отредактируйте файл hardware / arduino / avr /boards.txt в вашей установке Arduino IDE с правами администратора. * Изменить:* leonardo.build.usb_product ="Arduino Leonardo" * на:* leonardo.build.usb_product ="..." * вернуть обратно после загрузки проекта на ваше устройство Arduino. * / # include  // Включаем библиотеку Control Surface .USBMIDI_Interface midiusb; // вместо этого используем эту библиотеку для вывода всех MIDI-данных на последовательный монитор // USBDebugMIDI_Interface midiusb; HardwareSerialMIDI_Interface midiser ={Serial1, MIDI_BAUD}; // Создать фабрика MIDI-каналов для подключения MIDI-интерфейсов друг к другу и к Control Surface MIDI_PipeFactory <5> pipe; // Пример добавления дополнительных контроллеров:// CCPotentiometer pot ={A0, MIDI_CC ::Expression_Controller}; // контакт, к которому подается питание Светодиод подключенconst int ledPin =10; // настройка codevoid setup () {Serial.begin (115200); // включение светодиода питания pinMode (ledPin, OUTPUT); digitalWrite (ledPin, HIGH); // пересылаем MIDI USB на последовательный порт MIDI midiusb>> pipe>> midiser; // пересылаем MIDI-последовательный порт на MIDI USB-мидайзер>> pipe>> midiusb; // отправляем контрольные сообщения только на MIDI USB Control_Surface>> pipe>> midiusb; // подключаем MIDI USB и последовательный порт к управляющей поверхности midiser>> pipe>> Control_Surface; midiusb>> трубы>> Control_Surface; // инициализируем поверхность управления _after_ подключения интерфейсов Control_Surface.begin ();} // основной цикл обработкиvoid loop () {Control_Surface.loop ();} 
Исходный код для адаптера MIDI-USB с фильтром "все ноты отключены" Arduino
 / * * USB MIDI адаптер с фильтром «все ноты отключены». * * --- * * Чтобы разрешить более крупные пакеты sysex, измените библиотеку Control Surface следующим образом:* * In:* src \ MIDI_Parsers \ MIDI_MessageTypes.hpp * change:* uint8_t length; * to:* size_t length; * * В:* src / Settings / Settings.hpp * изменение:* constexpr size_t SYSEX_BUFFER_SIZE =128; * в:* constexpr size_t SYSEX_BUFFER_SIZE =320; * * Это должно быть исправлено, когда выйдет Control Surface 2.x. * * --- * * Чтобы использовать другое имя USB-устройства, отредактируйте файл hardware / arduino / avr /boards.txt в вашей установке Arduino IDE с правами администратора. * Изменить:* leonardo.build.usb_product ="Arduino Leonardo" * на:* leonardo.build.usb_product ="..." * вернуть обратно после загрузки проекта на ваше устройство Arduino. * / # include  // Включаем библиотеку Control Surface .USBMIDI_Interface midiusb; // вместо этого используем эту библиотеку для вывода всех MIDI-данных на последовательный монитор // USBDebugMIDI_Interface midiusb; HardwareSerialMIDI_Interface midiser ={Serial1, MIDI_BAUD}; // Создать фабрика MIDI-каналов для подключения MIDI-интерфейсов друг к другу и к Control Surface MIDI_PipeFactory <4> pipe; // Пример добавления дополнительных контроллеров:// CCPotentiometer pot ={A0, MIDI_CC ::Expression_Controller}; // контакт, к которому подается питание Светодиод подключен const int ledPin =10; // Пользовательский обратный вызов MIDI, который печатает входящие сообщения. Struct MyMIDI_Callbacks:MIDI_Callbacks {// Обратный вызов для сообщений канала (ноты, изменение управления, изменение высоты тона и т. Д.). void onChannelMessage (Parsing_MIDI_Interface &midi) переопределить {ChannelMessage cm =midi.getChannelMessage (); if (cm.header ==0xb0 &&cm.data1 ==0x7b) {// игнорировать сообщения «все заметки отключены» return; } else if (cm.header ==0x90 &&cm.data2 ==0x00) {// конвертируем сообщения "note on" со скоростью 0 в сообщения "note off" cm.header =0x80; } midiusb.send (см); } // Обратный вызов для системных эксклюзивных сообщений void onSysExMessage (Parsing_MIDI_Interface &midi) override {SysExMessage se =midi.getSysExMessage (); // пересылать системные эксклюзивные сообщения без изменений midiusb.send (se); } // Обратный вызов для сообщений в реальном времени void onRealTimeMessage (Parsing_MIDI_Interface &midi) override {RealTimeMessage rt =midi.getRealTimeMessage (); // пересылать сообщения в реальном времени без изменений midiusb.send (rt); }} обратные вызовы; // настройка codevoid setup () {Serial.begin (115200); // включение светодиода питания pinMode (ledPin, OUTPUT); digitalWrite (ledPin, HIGH); // пересылаем MIDI USB на последовательный порт MIDI midiusb>> pipe>> midiser; // отправляем контрольные сообщения только на MIDI USB Control_Surface>> pipe>> midiusb; // подключаем MIDI USB и последовательный порт к управляющей поверхности midiser>> pipe>> Control_Surface; midiusb>> трубы>> Control_Surface; // инициализируем Control Surface _after_ подключение интерфейсов Control_Surface.begin (); // устанавливаем методы обратного вызова midiser.setCallbacks (callbacks);} // основной цикл обработкиvoid loop () {Control_Surface.loop ();} 

Схема

Заполняется только вкладка схемы usb_midi_interface_twiE32gvR3.fzz

Производственный процесс

  1. Сигнал тревоги для растений, предупреждающий о жажде
  2. Итальянские часы со словами
  3. Только три контакта для клавиатуры 4x3
  4. Минимальная MIDI-ударная установка с 3D-принтером
  5. Счетчик кВтч Sigfox
  6. Монитор температуры Bluetooth
  7. DIY Простой измеритель емкости с автоматическим выбором диапазона (10pF-10000microF)
  8. Блокировка, управляемая жестами
  9. Изолированный аналоговый вход для Arduino
  10. Измерьте время реакции