Разработка протокола последовательной связи Arduino

8

Я делаю интерфейс барабанного секвенсора для электронной музыки .

введите описание изображения здесь

Он использует Arduino Mega в качестве микропроцессора, и в настоящее время он взаимодействует с программой обработки, которую я написал для последовательной связи. Оттуда сообщения OSC отправляются в программу Max / MSP, которую мой партнер по сотрудничеству написал для создания потока данных midi.

Так:

введите описание изображения здесь

Мой физический интерфейс -> Arduino Mega -> последовательный ввод / вывод -> Обработка -> OSC -> Max / MSP -> Midi (-> музыкальное приложение)

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

Мои серийные сообщения настроены так:


PL,1;        // transport control: play
PL,0;        // transport control: stop
SW,30;       // swing value 30
TM,130;      // tempo value 130
SD,1,8,04,0; // Step sequencer data, pattern 1, voice 8 (of 8), step 04 (of 16), off
MU,8,1;      // Mute, voice 8 (of 8), on
SO,4,0;      // Solo, voice 4 (of 8), off
VL,3,127;    // Velocity, voice 3 (of 8), value 127
CC,1,127;    // Midi CC, controller 1, value 127
NN,1,36;     // Note number, voice 1 (of 8), value 36 (usually a kick drum)

Итак, вы можете видеть, что по количеству запятых на точку с запятой я могу определить, как анализировать последовательные данные из arduino в программе обработки. Из Обработки эти виды сообщений преобразуются в OSC следующим образом:


/beatseqr/play 1
/beatseqr/play 0
/beatseqr/swing 30
/beatseqr/tempo 130
/beatseqr/matrix/1/8/04 0
/beatseqr/mute/8 1
/beatseqr/solo/4 0
/beatseqr/velocity/3 127
/beatseqr/midicc/1 127
/beatseqr/midinn/1 36

И все это работает хорошо, но это неэффективно. Мне действительно нужно приложение для обработки в середине?

введите описание изображения здесь

Теперь я попытался отделить части Обработки и OSC от уравнения, но мне не хватает некоторых знаний в отношении дизайна протокола последовательных данных.

Я знаю, что udpreceiveв Максе есть объект. И это работает хорошо, я думаю? Может быть, я использую это неправильно.

В какой-то момент я переключил весь свой код arduino так, чтобы он не отправлял символы новой строки в конце каждого последовательного сообщения, поскольку это ничего не значило для udpreceiveобъекта Макса . На самом деле, если я правильно помню, он будет принимать только первое сообщение до первой новой строки, а затем прекратит обработку данных. Поэтому, чтобы обойти это, я убрал все символы новой строки, а затем он непрерывно извергался в max / msp.

Тогда следующая проблема этого метода состоит в том, что udpreceiveобъект принимает только один символ за раз. Поэтому я пытался использовать jsобъект javascript для объединения входящих символов, а затем анализировать их по точкам с запятой и запятым. Проблема, с которой я столкнулся, заключалась в том, что она была непредсказуемой и нестабильной. Символы будут выпадать, и сообщение будет невозможно обработать. Так что это действительно заставляет меня задуматься, стоит ли мне менять протокол последовательных данных на что-то более надежное? Или я просто делаю это неправильно?

Должен ли я просто все это очистить и начать все заново, используя прошивку Firmata? Я видел несколько руководств по использованию фирм с Max / MSP , и я думаю, что мог бы по-новому взглянуть на то, что делает код на коробке и нужно ли вообще это делать. Может ли фирма принимать строковые данные на выводе для отправки на бортовой последовательный ЖК-дисплей? если я смогу управлять ЖК-дисплеем с max / msp, это может сработать нормально.

Есть какой-нибудь совет?

Стив Кули
источник
1
+1 только за OMGWTFкнопку, но очень хорошо продуманный и подробный вопрос тоже!
Полином
1
Вы видели эту страницу ? Существует несколько способов взаимодействия с Max / MSP, которые не включают обработку. Кто-нибудь из них работает / не работает для вас?
angelatlarge
@angelatlarge Да, вроде. Вроде нет. Я надеюсь получить совет о том, правильно ли я выполняю работу с последовательным протоколом или нет, но я открыт для повторного использования альтернативного метода связи, если я все же смогу получить те же функции в конце.
Стив Кули

Ответы:

1

Возможно ли, что ваша проблема вызвана Arduino? Я знаю, что это звучит странно, потому что Arduino сильно полагается на последовательную связь и обычно не терпит неудачу. Но я бы посоветовал вам попробовать свой Arduino с разными скоростями, выводить данные, читаемые человеком, и осуществлять мониторинг с помощью терминальной программы. У меня была та же самая проблема, и это было вызвано земной проблемой моего arduino. Кроме того, другим решением может быть использование пользовательского дизайна Arduino с тактовой частотой, подходящей для последовательного интерфейса, например 14,7456 МГц, или с любым значением, кратным 3,6864 МГц. Надеюсь, поможет...

superkeci
источник