Электронная подпись недействительна. Определение надежности цифровой подписи. Добавление строки подписи
Midi - представляет собой специальный интерфейс, придуманный для обмена данными между музыкальными инструментами. В данном проекте мы будем подружим плату Arduino и midi интерфейс и будем передавать midi данные при помощи Arduino и обрабатывать данные на компьютере. Подключение Arduino к компьютеру мы будем осуществлять через mid-USB переходник. А обрабатывать данные через известную многим музыкантам программу FL studio.
Для начала давайте подключим Arduino к midi кабелю. Внешний вид midi-USB кабеля представлен на рисунке ниже. На данном кабеле есть 2 специальных разъема. Одни предназначен для ввода данных в компьютер а другой соответсвенно для вывода. Для подключения нам понадобиться всехо лишь один резистор номиналом в 2.2 кОм.
Внешний вид midi-USB кабеля
На переходнике имеются 2 индикатора для отображения процесса переданных или полученных данных. Если все подключенно и настроенно правильно то они будут моргать в такт передаваемым midi-данным.
Схема подключения Arduino к midi-USB кабелю
Для соединения используются 3 провода, один это собсвенно сами midi-данные, а другие это питание с Arduino. Плюсовой вывод подсоединяется через ограничивающий резистор. Не совсем понимаю зачем подводить напряжение, у меня к примеру работало все на одном проводе с данными. Провода с питанием скорее всего необходимы для подавления помех которые могут быть наведены в проводе с midi-данными.
Настройка программы FL studio для работы с внешними midi-данными
Для настройки программы необходимо зайти в настройки самой программы, выбрать вкладку midi и нажать кнопку сканировать midi устройства (Rescan MIDI devices). подключенный шнур должен сразу определиться.
Код программы на Arduino передающий midi-данные
void setup() { Serial.begin(31250); } void loop() { for (int note = 0x1E; note < 0x5A; note ++) { noteOn(0x90, note, 0x45); delay(100); noteOn(0x90, note, 0x00); delay(100); } } void noteOn(int cmd, int pitch, int velocity) { Serial.write(cmd); Serial.write(pitch); Serial.write(velocity); }Первым делом необходимо настроить скорость передачи последовательного порта в методе setup(). Передача данных осуществляется через метод noteOn(), в теле которого при помощи метода write() поочередно записываються 3 байта информации.
После записи данной программы на Arduino и подключения midi-USB переходника, на нем сразу же должна заморгать лампочка INPUT, что говорит о том что все идет как надо и данные передаются. А в программе FL stuido должен сразу появиться звук. Ни каких настроек кроме сказанных выше делать не нужно.
В очередной раз играя на гитаре и управляя звуком через 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, пока все отверстия не совпадут
Боковые стенки выпилил из фанеры.
Вид устройства на текущий момент:
Стоимость комплектующих:
- Arduino UNO R3 320 р.
- Фейдеры сп3-25а 5х9=45 р.
- Рот. потенциометры + ручки 85 р.
- Энкодер 15 р.
- Кнопки pbs-26b 16х19=304 р.
- Панель 240 р.
- Мультиплексор 16 р.
- Фанера, текстолит, тумблера, корпус от DVD - в моём случае бесплатно.
Контроллер справляется с возложенными на него задачами и рулит звуком практически в любой программе аудио обработки.
В планах покрыть фанеру морилкой и вырезать из оргстекла нижнюю крышку. Так же добавить порт расширения для подключения напольного контроллера.
Код для Arduino и печатка на гитхабе.