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


Для начала немного разберемся, что такое MIDI. MIDI расшифровывается как Musical Instrument Digital Interface или по-русски цифровой интерфейс музыкальных инструментов. В передаваемом коде этого интерфейса могут быть зашифрованы параметры громкости, тональности, темпа и других характеристик музыкальных инструментов. Данные интерфейса MIDI обычно передаются по пятипрошодным шинам с разъемами круглой формы DIN 41524 также с пятью контактами, как показано будет на схеме, приведенной ниже. Стандартная скорость передачи данных такого последовательного интерфейса составляет 31.25 кбит/с. Передача осуществляется однонаправленно, то есть в связанной интерфейсом MIDI системе музыкальные инструменты, например, синтезаторы могут только передавать данные головному устройству, например, пульту управления звуковым окружением или компьютеру. Следует помнить, что данные интерфейса MIDI представляют собой не оцифрованный звук, а команды и значения, например, ноты, параметры звука и т.п.


Необходимые компоненты

  • 5-выводной разъём DIN/MIDI – 1 шт.
  • Оптопара 4n35 или аналог – 1 шт.
  • Диод IN914 или аналог – 1 шт.
  • Резистор 220 Ом – 1 шт.
  • Резистор 560 Ом (можно 220 и 230 в послед.) – 1 шт.
  • Монтажная плата – 1 шт.
  • Arduino – 1 шт.
  • Кабель MIDI – 1 шт.
  • MIDI-устройство – 1 шт.

Схема подключения Arduino к MIDI-устройствам




Схема, созданная с помощью fritzing, довольно подробно показывает соединения компонентов. Всё здесь подключается достаточно просто и легко. В основе схемы мы видим микросхему оптической гальванической развязки. Эта оптопара нужна для гальванической развязки линии MIDI от схемы Arduino. Без неё можно сжечь вход Arduino. В данном случае была взята оптопара серии 4n35, состоящая из светодиода и фототранзистора, впрочем, вместо нее подойдет любой другой оптрон со схожими характеристиками.


Будьте внимательны при подключении диода, соблюдайте полярность. Данная схема была создана с учетом стандартов и характеристик интерфейса MIDI. Оригина схемы можно найти здесь http://www.midi.org/techspecs/electrispec.php


Код (скетч для Arduino)


Это простой скрипт взаимодействия с MIDI с использованием библиотеки MIDI.h (скрипт MIDI CALLBACK). Он проверяет, поступил ли сигнал (нота) NoteOn и переходит в соответствующую область обработки. В эту область вы можете вставить свой код.


#include MIDI_CREATE_DEFAULT_INSTANCE(); void handleNoteOn(byte channel, byte pitch, byte velocity) { // место для вашего кода при поступившем сигнале } void handleNoteOff(byte channel, byte pitch, byte velocity) { // место для вашего кода при отсутствии сигнала } void setup() { MIDI.setHandleNoteOn(handleNoteOn); MIDI.setHandleNoteOff(handleNoteOff); MIDI.begin(MIDI_CHANNEL_OMNI); } void loop() { MIDI.read; }

В очередной раз играя на гитаре и управляя звуком через 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шт.

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

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

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

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

Как видно из схемы кнопки подключил по матричной схеме. Задействованы встроенные подтягивающие резисторы 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) > 5) //--Если текущее значение отл. от прошлого { //--больше чем на 5, то посылаем новое значение MIDI.sendControlChange(chn,val,1); PrVal=val; } val=analogRead(1) / 8; //--Считываем значение с канала Y аналогично X if (abs(val-PrVal) > 5) { MIDI.sendControlChange(chn+4,val,1); PrVal=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 и печатка на гитхабе.

В очередной раз играя на гитаре и управляя звуком через 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шт.

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

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

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

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

Как видно из схемы кнопки подключил по матричной схеме. Задействованы встроенные подтягивающие резисторы 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) > 5) //--Если текущее значение отл. от прошлого { //--больше чем на 5, то посылаем новое значение MIDI.sendControlChange(chn,val,1); PrVal=val; } val=analogRead(1) / 8; //--Считываем значение с канала Y аналогично X if (abs(val-PrVal) > 5) { MIDI.sendControlChange(chn+4,val,1); PrVal=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 и печатка на гитхабе.

It wasn’t user controllable, BUT we learned an essential lesson: How to send a midi signal from an Arduino out of a midi port and to our computer.

Today, we’ll be learning how to make an actual . It can be controlled by knobs (potentiometers), faders, buttons, or in the example we’ll be talking about, switches.

First of all, I want to thank Bharat of Randumb for providing this information. Make sure to checkout his site for more awesome projects.

First, we’ll start by making this midi controller work over usb serial. Once you get that working flawlessly, you can apply the skills learned in my previous article on sending midi signals.

Let me know what you think of this build in the comment section below!

Recommended course : The DIY MIDI Controller Course . If you want to become a master at making your own custom controller, this is the course for you! Packed with 11 action-packed modules that include downloadable images, schematics, sample code, and libraries. Even if you’re a hobby musician that doesn’t know anything about circuitry or programming, this course breaks it down to an understandable sense.

What you need

The hardware needed is pretty basic. If you are going to be converting this project to full-on midi, you’ll additionally need some midi ports.

In this example we are using switches, but feel free to use anything else! Buttons work exactly the same.

An LED, a breadboard, and an enclosure are optional. If you are still in the experimental phase of your midi-mayhem, you can get away without those.

Hardware

  • Arduino Uno
  • 2x Switches, potentiometers, buttons, or faders
  • Spare wires
  • (Optional) LED
  • (Optional) Bread Board
  • (Optional) Enclosure

Software

  • Arduino IDE (Link )
  • Serial to MIDI converter (Link )
  • Midi YOKE Virtual MIDI port (Link )
  • MIDI-OX (to monitor midi signals) (Link )

Schematics

Here is the diagram for this project. Keep in mind that the schematic will vary if you decide to implement a midi port into this project.

A breadboard is used in the schematic. Although it is listed as an optional item, I’d still recommend purchasing one. They’re cheap and they make prototyping a hell of a lot easier.

Code

#define LED 13 // LED pin on Arduino board

#define switch1 10 // 1st Switch

#define switch2 9 // 2nd Switch

#define MIDI_COMMAND_CONTROL_CHANGE 0xB0

#define MIDI_COMMAND_NOTE_ON 0x90

#define MIDI_COMMAND_NOTE_OF 0x80

int switch1LastState = 0;

int switch1CurrentState = 0;

int switch2LastState = 0;

int switch2CurrentState = 0;

// the format of the message to send Via serial

uint8_t command;

uint8_t channel;

void blinkLed(byte num) { // Basic blink function

for (byte i=0;i

digitalWrite(LED,HIGH);

digitalWrite(LED,LOW);

pinMode(LED, OUTPUT);

pinMode(switch1,INPUT);

pinMode(switch2, INPUT);

Serial.begin(115200);

t_midiMsg midiMsg1; // MIDI message for Switch 1

t_midiMsg midiMsg2; //MIDI message for Swtich 2

switch1CurrentState = digitalRead(switch1);

switch2CurrentState = digitalRead(switch2);

if (switch1CurrentState == 1){

if(switch1LastState == 0){

midiMsg1.msg.command = MIDI_COMMAND_CONTROL_CHANGE;

midiMsg1.msg.channel = 1;

midiMsg1.msg.data2 = 1;

midiMsg1.msg.data3 = 0; /* Velocity */

/* Send note on */

Serial.write(midiMsg1.raw, sizeof(midiMsg1));

switch1LastState = switch1CurrentState;

if (switch2CurrentState == 1){

if(switch2LastState == 0){

midiMsg2.msg.command = MIDI_COMMAND_CONTROL_CHANGE;

midiMsg2.msg.channel = 2;

midiMsg2.msg.data2 = 2;

midiMsg2.msg.data3 = 0; /* Velocity */

/* Send note on */

Serial.write(midiMsg2.raw, sizeof(midiMsg2));

switch2LastState = switch2CurrentState;

Turning your Arduino into an actual midi device

Like I mentioned earlier, you can apply the knowledge from my to convert this project into a true midi controller.

Bharat had an interesting way to turn your Arduino into a midi device without the need of a midi port.

Here’s how it works:

Basically, we’re going to be making the Arduino show up as an HID midi device.

This is possible by installing midi firmware on your Arduino’s Atmeg8u2 chip. Keep in mind that using this method will be a pain if you plan to go back and revise your code. You’d have to reinstall the previous firmware and then go back to the midi firmware all over again.

Final Notes

voilà!!

Hopefully by now your midi controller is fully functioning.

Don’t hesitate to leave a comment down below if you can’t get your Arduino midi controller to function properly. I’d be happy to answer!

В очередной раз играя на гитаре и управляя звуком через 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шт.

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

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

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

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

Как видно из схемы кнопки подключил по матричной схеме. Задействованы встроенные подтягивающие резисторы 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) > 5) //--Если текущее значение отл. от прошлого { //--больше чем на 5, то посылаем новое значение MIDI.sendControlChange(chn,val,1); PrVal=val; } val=analogRead(1) / 8; //--Считываем значение с канала Y аналогично X if (abs(val-PrVal) > 5) { MIDI.sendControlChange(chn+4,val,1); PrVal=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, затем использовал . В дальнейшем подключил к этим пинам кнопку.

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


  • 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 и печатка на гитхабе.