USB MIDI-контроллер на Arduino

image

В очередной раз играя на гитаре и управляя звуком через Peavey ReValver и прочие Amplitube, задумался о приобретении MIDI-контроллера. Фирменные устройства, вроде Guitar Rig Kontrol 3, стоят около 13 000 рублей, и обладают только напольным исполнением. То есть оперативно менять положения нескольких регуляторов весьма проблематично.

Различные контроллеры DJ направленности выглядели интереснее за счет обилия фейдеров и энкодеров. Решено было совместить приятное с полезным и сделать MIDI-контроллер самому.

Начальные требования: 2-7 фейдеров, столько же роторных потенциометров/энкодеров, около 10 кнопок, подключение по USB.

Далее стал выбирать компоненты. Arduino выбрал по причине наличия, в принципе можно использовать ту же ATmega32u4, STM, либо другой контроллер. Фейдеры и кнопки нашел в местном радиомагазине. Энкодер и потенциометры уже были когда-то куплены. Тумблеры нашел в гараже. Корпус решил изготовить из верхней крышки DVD плеера.

Комплектующие:
  • Arduino UNO R3 1 шт.
  • Фейдеры сп3-25а 5 шт.
  • Рот. потенциометры 3 шт.
  • Энкодер 1 шт.
  • Кнопки pbs-26b 16 шт.
  • Крышка от DVD 1 шт.
  • Тумблеры 2шт.


Сначала согнул корпус и пропилил в нем бормашиной отверстия под фейдеры:

image

Затем просверлил отверстия для тумблеров и рот. потенциометров, разметил положение кнопок. Так как сверла на 19 (да и соответствующего патрона для дрели) у меня не было, то отверстия для кнопок сверлил на 13, а затем увеличивал разверткой.



Основа готова, теперь можно думать, как подключать все это добро к Arduino. Во время изучения данного вопроса наткнулся на замечательный проект HIDUINO. Это прошивка для ATmega16u2 на борту Arduino, благодаря которой устройство определяется как USB-HID MIDI device. Нам остаётся только отправлять данные MIDI по UART со скоростью 31250 бод. Чтобы не захламлять исходники дефайнами с кодами MIDI событий, я воспользовался этой библиотекой.

Так как я использовал Arduino, то решил сделать шилд, к которому уже и будут подключаться вся периферия.
Схема шилда:

image

Как видно из схемы кнопки подключил по матричной схеме. Задействованы встроенные подтягивающие резисторы ATmega328, поэтому логика инверсная.

Инициализация кнопок
   for(byte i = 0; i < COLS; i++){      //--Конфигурируем строки мтрчн клвтр как выходы
        pinMode(colPins[i], OUTPUT);     //--подаём на них лог. 1
        digitalWrite(colPins[i], HIGH);  
      }                                        
    for(byte i = 0; i < ROWS; i++){      //--Конфигурируем столбцы мтрчн клвтр как входы--------- 
        pinMode(rowPins[i], INPUT);      //--включаем встроенные в мк подтягивающие резисторы--
        digitalWrite(rowPins[i], HIGH); 
      } 

Считывание значений
  for(byte i = 0; i < COLS; i++)                                                                    //-Цикл чтения матричной клавиатуры----- 
    {
      digitalWrite(colPins[i], LOW);                                                                //--На считываемый столбец выставляем 0---
      for(byte j = 0; j < ROWS; j++)                                                                //--Построчно считываем каждый столбец--
        {                                                                                           //--И при нажатой кнопке передаём ноту--
          dval=digitalRead(rowPins[j]);
          if ( dval == LOW && buttonState[i][j] == HIGH ) MIDI.sendNoteOn(kpdNote[j][i],127,1); 
          if ( dval == HIGH && buttonState[i][j] == LOW ) MIDI.sendNoteOff(kpdNote[j][i],127,1);
          buttonState[i][j] = dval;
        }
       digitalWrite(colPins[i], HIGH);  
    }   



Забыл разместить на печатке диоды, пришлось подпаивать к кнопкам.

Потенциометры подключены через мультиплексор 4052b к вводам АЦП.

Считывание положений потенциометров
  for(byte chn = 0; chn < 4; chn++)        //-Цикл чтения значений потенциометров
   {
     set_mp_chn(chn);                      //--Задаём параметры мультиплексора
     val=analogRead(0) / 8;                //--Считываем значение с канала X
     if (abs(val-PrVal[chn]) > 5)          //--Если текущее значение отл. от прошлого
       {                                   //--больше чем на 5, то посылаем новое значение
       MIDI.sendControlChange(chn,val,1);  
       PrVal[chn]=val;
       }
     val=analogRead(1) / 8;                //--Считываем значение с канала Y аналогично X
     if (abs(val-PrVal[chn+4]) > 5)
       { 
       MIDI.sendControlChange(chn+4,val,1); 
       PrVal[chn+4]=val;
       }
   }  


Энкодер повесил на аппаратное прерывание.

Считывание энкодера
void enc() // Обработка энкодера
{
  currenttime=millis();
  if (abs(ltime-currenttime)>50) //  антидребезг
   {
    b=digitalRead(4);
    if (b == HIGH && eval<=122) eval=eval+5;
      else if (b == LOW && eval>=5) eval=eval-5;
    MIDI.sendControlChange(9,eval,1); 
    ltime = millis();
   }
   
}


Печатную плату развёл в Sprint layout, Затем изготовил старым добрым ЛУТ'ом с использованием самоклеющейся плёнки и хлорного железа. Качество пайки страдает от ужасного припоя.

Готовый шилд:




Для заливки прошивки в ATmega32u4 я кратковременно замыкал 2 пина ICSP, затем использовал Flip. В дальнейшем подключил к этим пинам кнопку.



Прошивка работает, осталось прикрутить стенки и лицевую панель. Так как я размечал все по месту, то на рисование панели времени ушло больше, чем на всё остальное. Выглядело это так:
  • 1. В качестве фона картинки выставлялась миллиметровка
  • 2. Размечались отверстия
  • 3. Полученное выводилось на печать
  • 4. Вырезались все отверстия
  • 5. Откручивались и снимались все элементы
  • 6. Устанавливалась панель, устанавливались на места все кнопки/потенциометры
  • 7. Отмечались несоответствия шаблона и корпуса
  • 8. Переход к пункту 2, пока все отверстия не совпадут

Панель изготовлена из миллиметрового ПЭТ, покрытого плёнкой с принтом и ламинированием, отверстия вырезались лазером по cdr файлу. У иркутских рекламщиков все это обошлось мне всего в 240 рублей.



Боковые стенки выпилил из фанеры.

Вид устройства на текущий момент:





Стоимость комплектующих:
  • Arduino UNO R3 320 р.
  • Фейдеры сп3-25а 5х9=45 р.
  • Рот. потенциометры + ручки 85 р.
  • Энкодер 15 р.
  • Кнопки pbs-26b 16х19=304 р.
  • Панель 240 р.
  • Мультиплексор 16 р.
  • Фанера, текстолит, тумблера, корпус от DVD — в моём случае бесплатно.

Итого: 1025 руб.

Контроллер справляется с возложенными на него задачами и рулит звуком практически в любой программе аудио обработки.

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

Код для Arduino и печатка на гитхабе: https://github.com/vlr-baik/MyMidi

Материалы по теме


Поделиться публикацией

Похожие публикации

Комментарии 48
    +2
    Мне кажется, у вас не припой плохой, а флюс, и плата очищена от окислов слабо. Либо паяльник чуть-чуть помощнее надо, чтобы такие полигоны лудить. Хорошо лудится оплеткой от кабеля.
      +1
      Плату сначала лудил в «жидком олове», но раствор был старый и ничего не вышло, за несколько часов на плате осел совсем тонкий слой. Лудить по новой уже не стал. Обычно лужу плоским жалом + глицерин.
      Припой действительно ужасный, и судя по высокой тем-ре плавления бессвицовый.
      +4
      Канифолью плату не испортить.
        0
        Вы меня опередили. Я делал миди клаву из китайского синтезатора.
          0
          Браво! Как раз подумывал над подобным проектом для своей гитары, Вы меня подтолкнули к действиям. Да и Ардуино без дела как раз лежит.
            0
            Спасибо. Советую сразу заказать на aliexpress корпус для педали и сделать порт для неё.
              0
              Для того что я хочу их нужно несколько, что будет громоздким. Однако, я знаю где мне по чертежам сделают что надо недорого.
              0
              Думаю вам будет интересна реализация задания темпа отстукиванием(не потенциометром).
                0
                Отличная фича, на метрономе в телефоне пользуюсь иногда.
              +2
              Плата, конечно, ад и Чернобыль. Но в целом красиво, боковушки корпуса бы еще поаккуратнее, и будет очень симпатичный девайс.
                +4
                Поделюсь технологией. Она на какой-то идеал не претендует, но мне результат и скорость нравятся. Нужна плата, какой-нибудь гелевый флюс (я использую мерзкий розовый ТТ), паяльник ватт на 60 и без разницы, какой припой. Флюс натурально ПАЛЬЦЕМ (ну, можно ватной палочкой) распределяется тонюсеньким слоем по всей плате, а затем микроскопическое (это важно!) количество припоя начинаем размазывать паяльником. Получается, например, так:

                image

                После лужения плату надо хорошенько помыть какой-нибудь калошей, т.к. флюс ТТ — плохо отмывающаяся бяка, обладающая относительно небольшим сопротивлением, были прецеденты плохой работы чипов с маленьким шагом выводов (у меня TSSOP20) от неотмытого ТТ.
                  0
                  Спасибо, попробую. Обычно (но не в тот раз) использую плоское жало + глицерин.
                    +1
                    Раньше тоже так делал. Теперь вместо флюса использую паяльный жир, а плату мою фейри под струей воды. Начисто промываю дистилятом из фильтра.
                    Никакой возни с вонючей химией, чистая, как с хорошего завода плата, минимум усилий.
                    С ужасом вспоминаю флюсы и уж тем более канифоль, которую приходилось аж «замачивать» во всяких ацетонах.
                      0
                      Попробую жир в следующий раз, спасибо. От канифоли, действительно, избавляться тяжко, стараюсь ее не использовать.
                      По химии — все равно без нее не получается, все более-менее «невонючее», но фоторезист лучше всего смывается ацетоном.
                        0
                        Извините уважаемые, я может быть какую то ересь сейчас скажу, но канифоль же спиртом смывается «на ура». Паять приходится мало, тем более платы, использую канифоль и спирт выручал всегда и везде.
                          0
                          Да не, не ересь. Тонкий слой канифоли действительно быстро вымываются. А вот толстые капли — уже муторнее.
                            +2
                            Толстые капли легко снимаются/откалываются отверткой. А дальше спиртом.
                              0
                              Ага, именно отверткой и сковыривал.
                            0
                            Но не легче, чем индикаторный флюс или паяльный жир.
                              0
                              Однажды приводил отремонтированную железяку к виду «только что с завода», протер спиртом- получил по всей плате белый липкий налет от остатков заводского флюса. Совсем нетоварный вид. Спас ацетон :)
                              p.s. Привет кстати :)
                            0
                            Из практики, полученной во время работы в СЦ по ремонту мобильных телефонов, ничего не отмывает плату лучше, чем Мистер мускул с нашатырем.
                            0
                            мерзкий розовый ТТ

                            ТТ разный бывает. Есть розовый индикаторный (как у вас похоже), он используется только для пайки феном, так как без прогрева активен, имеет сопротивление и быстро разъедает монтаж, если не смыть.
                            Есть другой ТТ, тут писал про него. Вот это штука просто отличная, но нигде найти не могу, в отличии от розового, который везде продаётся. Девайс, паянный им без смыва, работает 4 года (часы, плата открыта), никакой коррозии. Паяется отлично. Если найдёте — берите не глядя.
                              0
                              Да, индикаторный. Мне он очень нравится по одной простой причине — паяется с ним все просто офигенно. Практически как с кислотой, но не так брутально в плане разъедания. Кстати, что касается разъедания розовым ТТ — недавно разбирал один девайс примерно пятилетней давности. Несмытый. Припой весь почернел по поверхности, но на работе это никак не сказалось.
                                0
                                Мне он очень нравится по одной простой причине — паяется с ним все просто офигенно.

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

                                Это повезло.
                                Вот три фотки (извиняюсь, с телефона), ТТ не смыт. Покрылся слоем пыли, но плата в норме
                                dl.dropboxusercontent.com/u/22991016/images/IMG_20150512_214237.jpg
                                dl.dropboxusercontent.com/u/22991016/images/IMG_20150512_214242.jpg
                                dl.dropboxusercontent.com/u/22991016/images/IMG_20150512_214340.jpg
                                На плате год, когда разрабатывал (и паял) указан на шелкографии.
                                  0
                                  Мне, наверное, повезло просто из-за того, что шаг 2.5 мм (макетка паечная обыкновенная) и много припоя.
                              0
                              Да, и на счёт пайки плат: советую чистый глицерин. Купить можно у парильщиков электронных сигарет (вейперов), поллитра стоит ~200 рублей, хватит на всю жизнь паяния. Естественно его смывать надо, но он смывается идеально.
                              0
                              Неплохо сделано. С моей дилетантской точки зрения, вполне красиво, только боковушки я бы сделал ламинированные на заказ. Единственное, что пока не удается постичь самому для самостоятельной сборки девайса — энкодеры, а их бы надо для управления транспортом, промоткой, лупами и т.д в тракторе. У меня сгорел контроллер, и осталась работающая звуковая часть от него с разъемами midi i/o в которые можно писать с serial1.write. Но постичь магию мультиплексоров и кода для работы со всеми ручками, что есть в проекте — пока что не получилось
                                0
                                Посмотрите ссылки в конце статьи, многое должно стать понятно. Так же есть отличный курс по avr на easyelectronics.
                                Если есть вопросы по коду — спрашивайте, постораюсь максимально подробно ответить.
                                  0
                                  Как сделать много энкодеров и кнопок? Какой готовый мультиплексор можно взять?
                                    0
                                    Кнопки у меня подключены матрицей, то есть для 16 кнопок используется 4+4=8 пинов МК.
                                    Статьи про подключение энкодеров к МК: 1, 2.
                                    Для увеличения числа вводов/выводов можно использовать мультиплексоры, сдвиговые регистры и другие элементы.
                                    Мультиплексоры распространённые 4051, 4052, либо отечественные аналоги. Видео про использование мультиплексоров.
                                      0
                                      Про матрицу, конечно, понятнее всего, у меня в «готовом» наборе есть такая с 16 кнопками, остальное посмотрю, спасибо за ссылки
                                  0
                                  А видео можно, что получилось в итоге по звуку гитары?
                                    +1
                                    Звук гитары зависит не от контроллера, а от ПО. Вся обработка происходит на ПК.
                                    0
                                    А Guitar Rig будет поддерживать эту штуку?
                                      +1
                                      Проверил на демо GR5pro — работает
                                      +1
                                      Плата — просто ад какой-то! Настоящий грайнд-метал или дет-метал (не знаю как там) :)
                                        0
                                        Хочу попробовать сделать.

                                        Как бы узнать, какое максимальное количество миди-фейдеров/кнопочек можно завести на Ардуине?

                                        Заранее спасибо.
                                          +1
                                          Для кнопок можно подключить каскад сдвиговых регистров, который займёт всего 3 пина.

                                          Фейдеры подключаются через мультиплексоры. Если использовать 3 мультиплексора 4052b — это 24 фейдера, 6 управляющих пинов и 6 считывающих. При необходимости мультиплексоры можно подключать последовательно.

                                          Таким образом мы можем подключить очень много кнопок (ограничение только по быстродействию программы) через сдвиговые регистры, и 32 фейдера через мультиплексоры (можно и больше, но тогда придётся заморачиваться с управляющими пинами).
                                            +1
                                            Спасибо. Примерно пять часов после прочтения вашей статьи я искал мультиплексоры и рисовал примерные схемы :-)
                                              0
                                              Извините, ещё вопрос.
                                              А можно одним мультиплексором обойтись, 32-канальным, чтобы не подключать через несколько мультиплексоров?
                                              Если да, какой можете порекомендовать, если можете?
                                              Заранее спасибо.
                                                +1
                                                Можно конечно). Беглый поиск выдал ADG726/ADG732. Сам такие не использовал пока.
                                                  0
                                                  Ну да, я на них смотрел как раз, но я не шарю, потому и спросил, вдруг, вы что-то конкретное можете порекомендовать из опыта.

                                                  А тогда ещё вопрос про энкодеры, если несложно.
                                                  Как их сделать много, через что подключать, какие ограничения по количеству (я так понимаю, что они как кнопки просто)?
                                            0
                                            Какая модель энкодера, скажите, пожалуйста? Чё почём?
                                              0
                                              Энкодеры с Алиэкспресс, брал 20 штук за 6 долларов. Ищутся по запросу: 20pcs EC12 E12 audio encoder / 360 degree
                                              0
                                              Привет, это опять я. Собрал матрицу пэдов из вашей схемы без диодов, не было их под рукой.
                                              Баг такой, что нельзя нажать одновременно две ноты на одной вертикали, при этом одновременно ноты на одной горизонтали работают нормально.
                                              Не расскажете, зачем в схеме диоды? Может, как раз для этого?
                                                0
                                                Как раз для этого. Диод не дает замыкаться соседним столбцам
                                                  0
                                                  Так получается, если я хочу нажимать несколько нот одновременно, и чтобы отпускания их работали корректно, мне нужно у каждой кнопки по диоду, правильно?
                                                    0
                                                    Во, кажется, обошёлся восемью диодами: по одному диоду на столбец и по одному на строку.

                                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                  Самое читаемое