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

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


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


  1. serafims
    12.05.2015 11:22
    +2

    Мне кажется, у вас не припой плохой, а флюс, и плата очищена от окислов слабо. Либо паяльник чуть-чуть помощнее надо, чтобы такие полигоны лудить. Хорошо лудится оплеткой от кабеля.


    1. Valar386 Автор
      12.05.2015 13:47
      +1

      Плату сначала лудил в «жидком олове», но раствор был старый и ничего не вышло, за несколько часов на плате осел совсем тонкий слой. Лудить по новой уже не стал. Обычно лужу плоским жалом + глицерин.
      Припой действительно ужасный, и судя по высокой тем-ре плавления бессвицовый.


  1. alexcom
    12.05.2015 11:56
    +4

    Канифолью плату не испортить.


  1. FisHlaBsoMAN
    12.05.2015 12:17

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


  1. constnw88
    12.05.2015 12:25

    Браво! Как раз подумывал над подобным проектом для своей гитары, Вы меня подтолкнули к действиям. Да и Ардуино без дела как раз лежит.


    1. Valar386 Автор
      12.05.2015 18:15

      Спасибо. Советую сразу заказать на aliexpress корпус для педали и сделать порт для неё.


      1. constnw88
        12.05.2015 21:29

        Для того что я хочу их нужно несколько, что будет громоздким. Однако, я знаю где мне по чертежам сделают что надо недорого.


    1. Dorrin
      12.05.2015 18:46

      Думаю вам будет интересна реализация задания темпа отстукиванием(не потенциометром).


      1. constnw88
        12.05.2015 21:26

        Отличная фича, на метрономе в телефоне пользуюсь иногда.


  1. eta4ever
    12.05.2015 12:58
    +2

    Плата, конечно, ад и Чернобыль. Но в целом красиво, боковушки корпуса бы еще поаккуратнее, и будет очень симпатичный девайс.


  1. eta4ever
    12.05.2015 13:08
    +4

    Поделюсь технологией. Она на какой-то идеал не претендует, но мне результат и скорость нравятся. Нужна плата, какой-нибудь гелевый флюс (я использую мерзкий розовый ТТ), паяльник ватт на 60 и без разницы, какой припой. Флюс натурально ПАЛЬЦЕМ (ну, можно ватной палочкой) распределяется тонюсеньким слоем по всей плате, а затем микроскопическое (это важно!) количество припоя начинаем размазывать паяльником. Получается, например, так:

    image

    После лужения плату надо хорошенько помыть какой-нибудь калошей, т.к. флюс ТТ — плохо отмывающаяся бяка, обладающая относительно небольшим сопротивлением, были прецеденты плохой работы чипов с маленьким шагом выводов (у меня TSSOP20) от неотмытого ТТ.


    1. Valar386 Автор
      12.05.2015 13:51

      Спасибо, попробую. Обычно (но не в тот раз) использую плоское жало + глицерин.


    1. Gordon01
      12.05.2015 14:36
      +1

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


      1. eta4ever
        12.05.2015 14:38

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


        1. nekrolai
          12.05.2015 17:21

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


          1. eta4ever
            12.05.2015 17:44

            Да не, не ересь. Тонкий слой канифоли действительно быстро вымываются. А вот толстые капли — уже муторнее.


            1. Z80A
              12.05.2015 21:52
              +2

              Толстые капли легко снимаются/откалываются отверткой. А дальше спиртом.


              1. eta4ever
                12.05.2015 21:53

                Ага, именно отверткой и сковыривал.


          1. constnw88
            12.05.2015 21:35

            Но не легче, чем индикаторный флюс или паяльный жир.


          1. Int_13h
            13.05.2015 08:11

            Однажды приводил отремонтированную железяку к виду «только что с завода», протер спиртом- получил по всей плате белый липкий налет от остатков заводского флюса. Совсем нетоварный вид. Спас ацетон :)
            p.s. Привет кстати :)


      1. constnw88
        12.05.2015 21:31

        Из практики, полученной во время работы в СЦ по ремонту мобильных телефонов, ничего не отмывает плату лучше, чем Мистер мускул с нашатырем.


    1. ploop
      12.05.2015 19:49

      мерзкий розовый ТТ

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


      1. eta4ever
        12.05.2015 21:38

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


        1. ploop
          12.05.2015 21:48

          Мне он очень нравится по одной простой причине — паяется с ним все просто офигенно.

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

          Это повезло.
          Вот три фотки (извиняюсь, с телефона), ТТ не смыт. Покрылся слоем пыли, но плата в норме
          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
          На плате год, когда разрабатывал (и паял) указан на шелкографии.


          1. eta4ever
            12.05.2015 21:51

            Мне, наверное, повезло просто из-за того, что шаг 2.5 мм (макетка паечная обыкновенная) и много припоя.


    1. ploop
      12.05.2015 20:00

      Да, и на счёт пайки плат: советую чистый глицерин. Купить можно у парильщиков электронных сигарет (вейперов), поллитра стоит ~200 рублей, хватит на всю жизнь паяния. Естественно его смывать надо, но он смывается идеально.


  1. sashabeep
    12.05.2015 14:34

    Неплохо сделано. С моей дилетантской точки зрения, вполне красиво, только боковушки я бы сделал ламинированные на заказ. Единственное, что пока не удается постичь самому для самостоятельной сборки девайса — энкодеры, а их бы надо для управления транспортом, промоткой, лупами и т.д в тракторе. У меня сгорел контроллер, и осталась работающая звуковая часть от него с разъемами midi i/o в которые можно писать с serial1.write. Но постичь магию мультиплексоров и кода для работы со всеми ручками, что есть в проекте — пока что не получилось


  1. Valar386 Автор
    12.05.2015 16:00

    Посмотрите ссылки в конце статьи, многое должно стать понятно. Так же есть отличный курс по avr на easyelectronics.
    Если есть вопросы по коду — спрашивайте, постораюсь максимально подробно ответить.


    1. sashabeep
      13.05.2015 10:56

      Как сделать много энкодеров и кнопок? Какой готовый мультиплексор можно взять?


      1. Valar386 Автор
        13.05.2015 11:39

        Кнопки у меня подключены матрицей, то есть для 16 кнопок используется 4+4=8 пинов МК.
        Статьи про подключение энкодеров к МК: 1, 2.
        Для увеличения числа вводов/выводов можно использовать мультиплексоры, сдвиговые регистры и другие элементы.
        Мультиплексоры распространённые 4051, 4052, либо отечественные аналоги. Видео про использование мультиплексоров.


        1. sashabeep
          13.05.2015 11:48

          Про матрицу, конечно, понятнее всего, у меня в «готовом» наборе есть такая с 16 кнопками, остальное посмотрю, спасибо за ссылки


  1. sphinks
    12.05.2015 18:01

    А видео можно, что получилось в итоге по звуку гитары?


    1. Valar386 Автор
      12.05.2015 19:12
      +1

      Звук гитары зависит не от контроллера, а от ПО. Вся обработка происходит на ПК.


  1. aitras
    12.05.2015 20:31

    А Guitar Rig будет поддерживать эту штуку?


    1. Valar386 Автор
      12.05.2015 21:04
      +1

      Проверил на демо GR5pro — работает


  1. Lovesuper
    13.05.2015 10:29
    +1

    Плата — просто ад какой-то! Настоящий грайнд-метал или дет-метал (не знаю как там) :)