Миди контроллер своими руками

Миди контроллер своими руками

Содержание

Самым трудным оказалось найти фейдеры. Купить их в городе невозможно, в российских интернет-магазинах какое то гуано, заказывать за рубежом не хотелось из за Почты России с ее молниеносной доставкой. Я уже, в общем то, хотел сделать все вообще без единого движкового резистора, когда коллега подкинул мне пару старых японских резисторов и я все же поставил один как кроссфейдер. Вообще, я почти не тратил деньги на этот проект и большинство деталей обрели вторую жизнь в этом устройстве. Корпус я пару месяцев до этого извлек из помойки на работе, в нем был собран какой то контроллер разряда аккумулятора (вероятно электропогрузчика, вероятно японского потому что там была дюймовая резьба, которую пришлось перенарезать). Мне понравилось что он литой и основательный. По работе мне часто приходится иметь дело с промышленной электроникой, что конечно наложило свой отпечаток и я постарался сделать устройство максимально технологичным в сборке. Я ненавижу шлейфы проводов вырывающиеся из устройства когда ты откручиваешь его крышку, поэтому я решил сделать мезониную конструкцию или этакий бутерброд из плат. Это несколько сложнее чем просто насверлить дырок в корпусе, вставить в них переменных резисторов и соединить все проводами, но зато у меня в корпусе нет ни одного провода и все разбирается-собирается как АК-47.

Первая плата в «бутерброде» это стандартный макетный «шилд» (shield) арудуино, на котором я по быстрому распаял аналоговый мультиплексор 4051, который занимается тем что переключает сигнал с каждого потенциометра на один из аналоговых входов ардуино. (всего их 6, а мне надо было минимум 8, поэтому пришлось мультиплексировать).

Помимо мультиплексора на плате два светодиода, один из которых индицирует питание через USB, а другой через ключ на транзисторе висит на ноге Tx atmega и мигает при передаче MIDI сообщения.

Вторая плата несет на себе все внешние органы управления ( потенциометры и кнопки) и является фальш панелью. Плата разведена в Layout Sprint и напечатана по кустарной ЛУТ технологии.



При сборке платы последовательно вставляются друг в друга, последняя закрывает корпус, через 4 фторопластовые шайбы накладывается лиецевая панель из матированного оргстекла и весь «бутерброд» стягивается 4 винтами.

Устройство в сборе выглядит так:

Вероятно это самый маленький диджейский миди контроллер).

Читайте также:  Маленькие видеокамеры беспроводные для скрытого наблюдения

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

Если опустить детали, то работает это примерно так: При повороте ручки потенциометра меняется напряжение на его среднем выводе ( от 0 до 5 В, что соответствует его крайним положениям), напряжение оцифровывается АЦП и мы получаем байт который преобразуем в формат MIDI сообщения и шлем в последовательный порт, который есть у микроконтроллера для связи с другими цифровыми устройствами. На плате ардуино распаян USB-UART чип FT232 который поднимает виртуальный COM порт на компе. Дальше драйвер древнего синта Rоland который как нельзя кстати создан для работы через COM порт.

И вуаля. Единственная загвоздка это то, что стандартная скорость обмена в MIDI протоколе не стандартна для COM порта, но это быстро пофиксили обитатели форума ардуино, хакнув драйвер FT232.
Необходимо отредактировать файл FTDIPORT.INF

Маководы могут воспользоваться вот этим приложением
Ну и наконец в вашем любимой музыкальной программе любые элементы интерфейса раскидываются на кнопки и крутилки.

Вот небольшое видео в общих чертах демонстрирующее работу контроллера:

Мне давно хотелось разбудить в себе композитора и начать творить свою собственную электронную музыку. Однако я был (мягко говоря) обескуражен высокими ценами на MIDI контроллеры. Но порыскав по просторам интернета у меня появилась задумка создать собственный контроллер, используя для этого Arduino Uno и токопропроводящие краски!

Давайте начнём)

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

С электроники нам понадобится:

  • 1 Arduino Uno с usb кабелем;

  • 1 баночка токопроводящей краски;

  • 1 монтажная плата размерами 5×7 см;

  • резисторы с сопротивлением 2.2 кОм;

  • резисторы с сопротивлением 10кОм;

  • резисторы с сопротивлением 4.7кОм;

  • 12 шт 2.7 MОм резисторов;

Кроме электроники, также потребуются следующие инструменты:

  • Паяльник и припой;
  • Кусачки;
  • Подставка для пайки деталей (третья рука);
  • Мультиметр;
  • Несколько проводов и/или тонкая металлическая проволока.

Создание платы начнём с припаивания штырей. Разместим согнутые штырьки в центре первого ряда на плате. Они в последующем будут служить «чувствительными» выводами, к которым будет подсоединяться клавиатура.

После установки штырей, обратите внимание – короткие выводы торчат из платы. Надавливаем на них, чтобы всё зашло заподлицо. Теперь припаиваем их и сразу проверяем места соединений на предмет короткого замыкания.

Примечание: Не припаивайте штырьки слишком долго, иначе они разогреются и расплавят пластик.

Для следующего этапа, расположим прямые гребёнки в слотах Arduino. Установим поверх штырей, что вставлены в Arduino, плату. Данное действие потребовало приложения небольшого усилия, поскольку штыри не идеально отцентрованы относительно отверстий платы.

После того, как успешно установили плату на штырях, убедитесь, что выводы находятся заподлицо с верхним краем платы. После чего их можно запаять.

Теперь удалим плату с Arduino и перевернём её на обратную сторону. Напаяем перемычки, на которые в дальнейшем будут крепится компоненты. Есть два способа сделать это:

  • Заполнить все необходимые отверстия припоем, а после соединить их друг с другом.
  • Использовать тонкую проволоку.

Советую использовать второй метод, поскольку он проще и быстрее. Если вы выберете этот метод, расположите проволоку на плате, как на изображении.

  • Красная точка означает — припаиваем провод в отверстие.
  • Желтая точка — соединяем тонкую проволоку со штырём на другой стороне платы (как на третьем изображении).

Как вы можете видеть, немного испортил нижний левый угол, когда нанёс слишком много припоя, поэтому будьте внимательны!

Совет: Если у вас нет тонкой проволоки, используйте обрезки выводов используемых резисторов.

Устанавливаем компоненты, а именно 2.7MОм резисторы, которые будут выполнять сенсорно-ёмкостные функции.

Примечание: Если вы хотите узнать больше о теоретических основах и практическом применении сенсорно-ёмкостных датчиков, советую ознакомится со следующими ссылками:

Расположим один 2.7MОм резистор снизу самого правого согнутого штыря и протолкнём ножки через отверстия (как на первом изображении). Теперь перевернём плату и протолкнём один вывод резистора обратно в следующее отверстие (как показано на втором изображении). Припаяем нижнюю ногу резистора к отверстию, а верхнюю ногу резистора к выводу штыря. После чего прикрепим 7cm провод на этот штырь (как видно с третьего изображения).

Повторим процесс со всеми резисторами и проводами, припаяв их на места. Нижнее ножки резисторов должны сформировать одно длинное соединение.

Совет: Выбирайте чередующееся цвета для проводов — это позволит проще производить соединение в последующих шагах.

Начнём с размещения кнопок и резисторов на плате, как на первом и втором изображениях. В моём случае использовал 2.2кОм резисторы, но можно использовать любой резистор со значением между 2кОм и 10кОм.

Перевернём плату и припаяем всё на свои места. Изображение 3 объясняет, какие различные соединения вам нужно будет сделать:

  • синяя точка – обозначает ножку кнопки, что необходимо припаять на плату;
  • розовaя точка – обозначает ножку резистора, которую необходимо припаять на плату;
  • красная линия означает — вам следует спаять две точки в одно соединение;
  • чёрная линия обозначает провод, что будет идти от одной ножки кнопки через отверстие в плате, что потом соединится со штырём на другой стороне.

Если всё спаяно правильно, две самые левые кнопки позволят изменять октавы, в то время как самая правая кнопка позволит включать LDR сенсор.

После того, как кнопки припаяны, продолжаем монтаж LDR, LED и соответствующих резисторов. Перед тем, как сделать это, будет мудро поэкспериментировать со значениями номиналов резисторов, что будут идти к LED. Возможно мой номинал слишком большой для включения вашего светодиода. Поэкспериментируйте немного, чтобы найти правильное значение резистора.

Совет: Любой резистор в интервале между 330 Ом и 5кОм будет хорошим решением для 5mm LED.

Теперь расположим LED, LDR и резисторы (4.7K для LDR) в нужных местах. Перевернём плату и припаяем всё. Третье изображение пояснит, какие различные соединения следует выполнить:

  • коричневые точки – выводы LDR, что следует припаять на плату;
  • розовая точка – ножка резистора, что следует припаять на плату;
  • оранжевые точки – выводы LED, что необходимо припаять на плату;
  • красная полоса – вам нужно спаять две точки в одно соединение;
  • чёрная полоса – провод, что будет идти от вывода резистора через отверстие платы, что потом будет соединяться со штырём.

Примечание: Перед припаиванием LED, убедитесь в том, что полярность светодиода верная. Положительный вывод LED следует соединить с резистором, а отрицательный вывод с землей.

Сейчас хорошее время протестировать удачно ли пропаяны соединения кнопок, LDR и LED. Это последняя возможность исправить ошибки, советую вам загрузить прикрепленный код и запустить программу. Скопируйте/ скачайте архив и загрузите Arduino_Test_Fixture_Code на плату Arduino.

Если всё удачно и тест завершён, можете двигаться к следующему шагу. Если нет, еще раз проверьте пропаянные соединения на плате. Мультиметр лучше держать под рукой, говорю это по своему личному горькому опыту.

Начнём с монтажа проводов в отверстия, как видно с первого изображения. В этом шаге удобно использовать два провода разных цветов.

Перевернём плату и отрежем провода нужной длины. Припаяем их к штырям, что заходят в разъемы Arduino. Прежде чем начать использовать MIDI контроллер, сначала нужно протестировать его соединения с помощью тестового скетча Аrduino_Test_Fixture_Code_2. Загрузите скетч, откройте последовательный порт и прикоснитесь к «чувствительным» штырям на плате. Если вы увидите текст ‘Note x is active’ для каждого штыря, во время касания, все выводы работают корректно.

После того, как плата готова, пришло время преобразовать Arduino в MIDI контроллер, который будет распознаваться музыкальными программами, такими как Ableton и Fl Studio или даже другими MIDI устройствами. Процесс состоит из двух шагов:

  1. Изменить текущие встроенные программы на Arduino Uno на MIDI совместимые программы;
  2. Загрузить MIDI скетч на Arduino.

Начнём с первого пункта. По условию в Arduino загружена прошивка usb-последовательный порт, что позволяет Arduino обмениваться сообщениями с ПК и Arduino IDE. С новой программой DualMoco, добавиться второй режим, что позволит Arduino выступать в роли MIDI устройства.

Будем использовать программу FLIP и следуя инструкции изменим прошивку Arduino. Работоспособный файл вы найдете в архиве в папке Firmware — файл DualMoco.hex.

После загрузки новой прошивки, переподключите Arduino к ПК. Если всё пройдёт успешно, Arduino не должен будет обнаруживаться Arduino IDE, потому что новая программа находится в режиме (MIDI mode). Откройте музыкальную программу, что способна записывать MIDI и проверьте, чтобы Arduino с именем MIDI/MOCO for LUFA отображалась над MIDI настройками, как вы можете видеть на 1-ом изображении.

Особенность DualMoco в том, что у неё есть второй режим — usb-последовательный порт, что позволяет загружать скетчи с Arduino IDE, точно также, как при обычной прошивке. Чтобы перевести Arduino во второй режим, соедините два ISCP вывода вместе, как показано на 1 и 2 изображении. Вы можете либо использовать кусочек провода или маленькую перемычку, как показано на изображениях. Теперь отключите USB кабель на несколько секунд от Arduino и переподключите его, Arduino должен обнаружится в Arduino IDE.

Примечание: Когда вы захотите переключится из режима usb-последовательный порт в MIDI режим, удалите перемычку с ISCP выводов, как показано на третьем изображении и переподключите Arduino к ПК.

Пришло время загрузить действующий скетч в Arduino, Arduino_Final_Code. Скачайте его, переведите Arduino в usbпоследовательный порт режим и загрузите код. Если необходимо точная настройка пороговой величины, поэкспериментируйте со значениями THRESHOLD и RES . После того, как все заработает, как и ожидалось, поменяйте текущую строку 17, с:

boolean m >

boolean m >

После того, как в код внесены последние изменения, пришло время протестировать музыкальную программу способную поддерживать MIDI устройства. Сначала переведём Arduino в MIDI режим, для этого:

  1. Загрузим финальный код в Arduino.
  2. Извлечем USB кабель с Arduino.
  3. Переключим Arduino в МIDI режим удалив перемычку с выводов ISCP.
  4. Установим USB кабель в Arduino.

Если всё прошло успешно, откройте музыкальную программу и начните прикасаться к штырькам. Магические звуки должны зазвучать….

После того, как плата для Arduino полностью завершена, пришло время сфокусироваться на клавиатуре и способе её подключения к плате. Существуют миллионы вариантов сделать это, но я выбрал скрепки, которые будут закреплены на окрашенной бумаге (их легко закрепить и можно использовать повторно).

Процесс припайки скрепок к проводам довольно прост:

  1. Отрезаем штекер с одной стороны провода;
  2. Зачищаем провод от изоляции на 5 мм;
  3. Припаиваем зачищенный провод к скрепке;
  4. Повторяем для всех 12 скрепок.

Примечание: Скрепки не должны быть покрыты никаким покрытием (краской или пластиком).

Хотя и можно играть на Arduino MIDI клавиатуре только прикасаясь к скрепкам, гораздо интереснее, сделать свой собственный трафарет и использовать его. Раскрасил распечатанный шаблон. Шаблон находится в архиве с проектами.

Раскрашивание шаблона довольно простое занятие, только убедитесь в том, что оставляете пространство между линиями и используете соответствующие краски, иначе ничего работать не будет. После того, как краска высохнет, закрепите скрепки на «клавишах» и можете приступать творить музыку.

Один товарищ обратился с вопросом: «А можно ли сделать самодельный MIDI-контроллер?»
Мне идея показалась интересной, но, прежде чем потратить на нее кучу денег, хотел бы услышать ваши мнения по этому поводу. Спасибо!

Итак, задача:

MIDI-контроллер, грубо говоря, коробочка с крутилками/вертелками и кнопочками, подключаемая к ПК по USB, прикидывающаяся MIDI-устройством и отдаящая MIDI-инструкции при кручении/верчении ее элементов управления.
Вот пример заводского образца:

Тут на самом деле все просто, есть уже даже подобные решения и схемы, например, вот.

Ну и схема:

И вроде все просто и понятно, V-USB для реализации MIDI over USB, кнопочки и переменные резюки в стандартном включении.

В чем затык?

Проблема в том, что у нашей железки должно быть гораздо больше элементов управления, а именно:

  1. 16 энкодеров (именно энкодеров, переменные резисторы не подходят, по причине невозможност поменять их значения программно)
  2. 30 кнопок (+-)
  3. 1 фейдер (переменный резистор ползункового типа)
  4. Экран для вывода информации
  5. По 1 светодиоду минимум для каждого элемента управления, для индикации его работы (итого около 50)

Значит будем использовать мультиплексирование.
Я так понимаю, ни у одного МК прерываний и ног не хватит, чтобы напрямую через прерывания отловить все изменения на всех кнопках и энкодерах? Значит кнопки и энкодеры мы будем сканировать. Как я понимаю, на каждый энкодер 2 сигнала, на кнопку — 1, итого 62.
— Если использовать принцип матричной клавиатуры, то потребуется 8×8 = 16 GPIO?
— Теперь индикация, тоже динамическая. Тут 7×7 = 14 GPIO?
— 7 GPIO на экранчик (имею ввиду классический текстовый 20×4 символов, хотя, если совсем не будет хватать ног или чего-то, то можно экранчику прикрепить отдельный МК и управлять им по I2C или UART).
— 2(3) GPIO — USB
Итого получается 40+, аха за рамки обычной 40-ножки мы вышли, а значит придется использовать что-то более многоногое.

В общем, пока список вопросов примерно следующий:

  1. Справится ли обычная AVR-ка на 16 мегагерцах с поставленной задачей? (опрашивать все элементы управления, индицировать их работу, получать и передавать данные по USB в ПК)
  2. Кто какой МК посоветует для решения данной задачи? Причем не обязательно AVR, в принципе есть желание поковыряться с STM32, там как раз есть многоногие камни со скоростью выше 16 MHz и аппаратным USB. Тогда можно будет сделать еще больше индикации: не по 1 светодиоду на каждый энкодер, а по несколько, чтобы отображать позицию (как на заводском образце с картинки).
  3. Может по мультиплексированию кто что посоветует? Может есть смысл использовать сдвиговые регистры?
  4. Еще какие-то мысли? Любые идеи приветствуются!

Я хочу, чтобы все понимали: я не прошу вас решать мою задачу! Пожалуйста, не воспринимайте мой пост в этом ключе! Я лишь хочу выслушать мнения и идеи о реализуемости данного проекта и о том, на какой элементной базе было бы логичнее его реализовывать. Ибо опыта у меня в этой области кот наплакал, и конечно не хочется выкинуть кучу денег на то, что в итоге не заработает, или заработает, но коряво.

В любом случае всем спасибо за помощь! Если проект пойдет — обязательно поделюсь наработками!

Update 1:

In the year 2011 I evaluated current microcontroller solutions again and switched to LPC1769 since it offers more features for almost the same price.

Дескать функций у него больше, за ту же цену… (еще на страницах пробегало гораздо более странное утверждение, что STM паять сложнее, чем LPC «LPC doesn’t require SMD soldering and therefore is more DIY friendly!», я как понял потому, что они используют готовый модуль LPCEXPRESSO) Хм… Но я почему-то совершенно не хочу LPC…

Update 2:

Комментарии ( 119 )

Теперь индикация, тоже динамическая. Тут 7×7 = 14 GPIO?

Если использовать принцип матричной клавиатуры, то потребуется 8×8 = 16 GPIO?

Справится ли обычная AVR-ка на 16 мегагерцах с поставленной задачей? (опрашивать все элементы управления, индицировать их работу, получать и передавать данные по USB в ПК)

  • mr_freeman
  • 22 января 2012, 22:47

Ну сама по себе справится без проблем, а вот как там с V-USB и сколько она ресурсов отнимет, не знаю.

Много отнимает, очень много… Это меня и беспокоит… Причем при этом мы в итоге получаем самую медленную реализацию USB (которая на некоторых современных хостах вообще отказывается определяться).
Поэтому сам я пока склоняюсь к STM32 с аппаратным USB (да, AVR-ки с усб тоже есть, но их достать мне куда сложне, да и зачем?).

Про сдвиговые регистры можно поподробнее? То есть существуют ведь варианты, например, тупо ставим в цепочку подряд 7 сдвиговых регистров на 8 ног каждый, получаем 56 ног из 3 — это 1 вариант, другой вариант: 2 свдиговых регистра (по 8 ног) + 4 (например) ноги динамически, итого 7 ног тратим, 4*2*8 = 64 получаем.

Я как раз реализовывал тут недавно проект с бегущей строкой (есть тут статья), там для светодиодов использовался такой вариант: сдвиговые регистры на строку, их там было 12 (x8=96) и 8 строк динамически. Там скорости хватило, но там не было никаких USB при этом… Данные брал с SD карты. А вот USB, как мне кажется, как раз решает…

  • JustACat
  • 22 января 2012, 22:58

Про сдвиговые регистры можно поподробнее? То есть существуют ведь варианты, например, тупо ставим в цепочку подряд 7 сдвиговых регистров на 8 ног каждый, получаем 56 ног из 3 — это 1 вариант, другой вариант: 2 свдиговых регистра (по 8 ног) + 4 (например) ноги динамически, итого 7 ног тратим, 4*2*8 = 64 получаем.

Оценить статью
Добавить комментарий