Управляем самодельными железяками по воздуху при помощи Open Sound Control

    В этом материале я постараюсь рассказать, каким образом можно с телефона или планшета на iOS и Android удалённо управлять вашим самодельным устройством подключенным к сети. Любой, хоть сколь-нибудь знакомый с темой, к этому моменту уже решил, что речь пойдёт об очередном веб-интрефейсе к вашим Arduino и mbed’ам — спешу перебить ваши мысли — не пойдёт. Способ, о котором я хочу рассказать, быстр, дёшев, имеет готовую обратную связь, удобные контролы и обладает наглядностью, которой позавидует самый вылизанный веб-интерфейс.



    Чтобы материал не показался оторванным от реальной жизни, я покажу, как мы 4 месяца назад проделали этот фокус с нашим Лайтпаком. Эта ситуация немного отличается от сферического сценария применения протокола Open Sound Control (дальше OSC) в вакууме, но тем не менее, является хорошим примером того, как он может быть эффективно использован в быстром прототипировании.

    Задача


    В наличии мы имели open-source USB-устройтво подсветки, которое управляется кроссплатформенным софтом и имеет на стороне этого софта API для управления из внешних программ или плагинов. Мы хотели управлять этим устройством по сети с наших планшетов и смартфонов. Включать и выключать его, менять профили настроек, управлять яркостью, регулировать подсветку по каждому отдельному каналу и может быть даже запускать другие плагины.

    В вашем случае ситуация может быть иной, не осложнённой посредником в виде полноценного ПК и какого-то API. Например, устройство на ARM/AVR периодически подключающееся к сети, или хотя бы Arduino c ethernet-шилдом, который 24/7 логирует для вас потребление электроэнергии за щитком в подъезде и шлёт данные прямиком в гуглодокумент.

    Первое, что приходит в голову для решения такой задачи — веб-интерфейс. Казалось бы универсально: можно получить доступ с любой платформы. Но заставлять постоянно крутиться веб-сервер, каким бы микроскопическим он ни был, нам не хотелось. Да и хороших конструкторов веб-интерфейсов, которые бы имели подходящие нам контролы, мы сходу не нашли, рисовать свои не хотели и понимали, что результат всерьёз сможет работать лишь на десктопе и рядовой МК его не осилит в случае если в будущем нам придётся управлять standalone-устройством.

    Однако, если к устройству можно подключиться через сеть (в нашем случае слать команды в API можно прямо через Telnet) можно было бы написать полноценное приложение для мобильной платформы, которое бы просто слало пакеты-сообщения, а сервер парсил их и таким образом управлял бы устройством. Не смотря на то, что мы за вечер собрали небольшой прототип для Android, который эксплуатировал этот способ, он всё-равно оставался “дорогим” даже в сравнении с веб-интерфесом.

    Время шло, задача записалась где-то на подкорке и не вылезала оттуда до тех пор, пока я случайно не наткнулся на мобильное приложение TouchOSC, которое (практически) одинаково хорошо работает на iOS и Android.



    После демонстрационных роликов и скриншотов пройти мимо не попробовав было попросту невозможно.)

    Идея


    Если коротко, то приложение TouchOSC (AppStore, Google Play) реализует на ваших мобильных девайсах интерфейсы протоколов OSC и MIDI, с которыми привыкли работать все специализированные синтезаторы, редакторы звука, программы для диджеев, студий звукозаписи и пр. При этом TouchOSC даёт возможность использовать не только предустановленные раскладки контролов (layouts) кнопок-слайдеров-ярлычков, но и очень просто и быстро рисовать свои собственные в специальном редакторе. Всё это добро работает через wi-fi, но может работать и по проводам при наличии специальных адаптеров.

    Типичная раскладка из состава предустановленных выглядит примерно так. Уровень сложности: «Корейцы», что, впрочем не мешает вам повторить её в редакторе раскладок.



    Поверхностный анализ показал, что это приложение не единственное и по желанию для iOS можно воспользоваться iOSC, OSCemote, Mrmr OSC controller, Remokon for OSC (для Android даже перечислять не буду — их ещё больше). Этот же анализ показал, что сам протокол используется в большом числе программ и устройств, а самое главное для нас то, что библиотеки и обёртки с его реализацией существуют для многих языков программирования и платформ (вот, например, варианты для Arduino и mbed). Неполный список есть на официальном сайте.

    У нас появилась возможность нетипичным образом применить новый, интересный, на первый взгляд, инструментарий. Впереди был свободный выходной день, поэтому со словами “вызов приянт” timsat на одну половину монитора развернул Гугл, а на вторую Notepad++.

    Протокол


    Open Sound Control — это пакетный протокол передачи данных между мультимедийными устройствами (в первую очередь электронными музыкальными инструментами/ синтезаторами и ПК), который в последнее время всё чаше используется как замена MIDI. Основновной фичей протокола остаётся работа через сеть, но есть и другие особенности. Последняя версия спецификации доступна на сайте Центра Аудио-технологий университета Беркли (CNMAT).

    Как я уже упоминал, на сегодняшний день типичное применение протокола — обеспечение интерфейса между устройствами ввода (синтезаторами, планшетами, игровыми контроллерами и пр.) и специализированными программами такими, как Super Collider, Traktor, REAPER и пр. OSC “из коробки” поддерживается такими потрясающими устройствами, как Lemur и Monome.

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

    Вот пример сообщений, которыми обмениваются OSC-сервер и клиент:

    /1/fader2 0.497120916843
    /1/fader2 /z
    /1/rotary1 0.579584240913
    /1/rotary1 0.605171322823
    /1/rotary1 /z

    В данном случае у нас имеется точный идентификатор контрола и /1/fader2 0.497120916843 означает, что со второго ползунка на первой вкладке (да, там можно использовать несколько вкладок в пределах одного лэйаута) к серверу приехало значение 0.49 и т.д. Z-message из этого примера можно включить по желанию и о нём я расскажу позже.

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

    Реализация


    Для работы с API Лайтпака мы используем собственную обёртку написанную на Python. Поэтому, а ещё потому, что для Питона существовала удовлетворяющая нас OSC-библиотека, мы решили написать небольшой скриптик, который фаткически являлся коннектором между API и сетевым устройством посылающим OSC-сообщения. Главные требования для такой реализации:

    • Доступность портов клиента/сервера (в TouchOSC можно настроить свои)
    • Клиент и сервер должны находиться в одной сети.

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

    Для тех, кто, как и я, предпочитает картинки, наколхозил схему взаимодействия:



    В нашем случае обмен между коннектором и API реализован через сокеты (это фича самого API), при этом, как видно в демо всё работает довольно быстро. Разумеется, в уравнении с хомяком на Ардуино, прямо за роутером будет находится само устройство с центром логики в виде микроконтроллера с прошивкой в которую уже включены библиотеки для работы с сетью и OSC.

    Фактически для реализации, нам предстояло разобраться лишь с процессом инициализации обмена, обратной связью и преобразованием получаемых/передаваемых значений. Львиную долю кода занимает простой маппинг. Т.е. после того, как вы нарисуете лэйаут у вас на руках будет список адресов контролов (кнопочек, слайдеров, ярлычков и пр), каждый из которых нужно сопоставить с функцией API. Всё.


    Честно говоря, не знаю, о чём тут можно написать подробнее. С точки зрения программирования задача примитивна. Исходный код этого “коннектора” по обыкновению лежит у нас в репозитории и доступен для всех.

    Кстати, в TouchOSC реализованы некоторые довольно удобные дополнительные фичи: Во-первых, есть возможность использовать сообщение /ping которым обмениваются клиент с сервером для поддержки соединения даже когда сами данные не бегают. Во-вторых, поддерживается так называемый z-message — специальное сообщение, которое говорит серверу, что пользователь на клиенте наконец-то закончил возюкать пальцем по экрану (момент окончания ввода). Мы не использовали эту фичу, но не исключаю, что существуют ситуации в которых она окажется крайне полезной. В-третьих, как и большинство похожих приложений, TouchOSC умеет слать на сервер даные со встроенного в мобильный девайс акселерометра. Т.е. вы можете использовать свой смартфон или планшет как хитрое устройство ввода для ваших сетевых самоделок (крутить камерой на сервомашинках и пр.).

    Подводные камни


    Всё, что касается взаимодействия с приложением TouchOSC проходит гладко. Даже загрузка собственных лэйаутов осуществляется “по воздуху” нажатием одной кнопки. Единственный на сегодняшний день заметный недостаток — это невозможность загрузки собственных лэйаутов для версии под Android. В переписке с автором ему удалось убедить меня в том, что “уже вот-вот, готовлю к релизу”.

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

    В целом, процесс создания такого машапа предельно интуитивен и не займёт много времени. Вот почему я бы посоветовал использовать OSC для быстрого прототипирования вместо полноценных клиент-серверных стеков с веб-интерфейсами. Тем более, если вы собираетесь презентовать этот прототип на мероприятии, или, скажем, заказчику, более наглядного варианта реализации сопровождающегося вау!-как-у-вас-такое-пропустили-в-эппстор вопросами я попросту не знаю.

    Итак, ещё раз: Если вам необходимо быстро и дёшево реализовать простой способ наглядного управления самодельным сетевым устройством с обратной связью, то протокол OSC — интересный выбор.
    • +41
    • 12,6k
    • 7
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 7

      0
      зачётно!
        +1
        Перенесите описание протокола повыше, а то пол статьи читаешь и не можешь понять, что ж такое OSC этот.
        А так неплохая статья
          0
          Кто нибудь знает, этот же протокол используется во всех современных, работающих по сети, DJ и DMX системах управления?
            0
            Эта TouchOSC для андроида бесплатна, а для айос стоит 5 баксов! Что за расизм?
              0
              Для Android пока нет способа заливать собственные раскладки. Думаю поэтому автор пока не берёт деньги за эту версию.
              0
              Очень интересно! А текстовые сообщения он может посылать? В смысле есть возможность набора текста на устройстве с помощью TouchOSC?
                0
                Принимать текст в TouchOSC можно. Мы таким образом передавали на него имена профилей. Слать произвольный текст со стороны TouchOSC на сервер нельзя. Во всяком случае я таких возможностей и контролов там не углядел.

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

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