midi-bluetooth клавиатура на esp32

    image


    Несколько лет тому назад ко мне в руки попала компактная драм-машина от небезызвестных teenage engineering. Тогда меня очень поразила идея — использовать печатную плату как часть корпуса и элемент дизайна устройства. С тех пор мне хотелось тоже собрать аналогичное по стилистике устройство. В результате я собрал простую midi-bluetooth клавиатуру, которая легко подключается к ноутбуку или айфону.


    Идея


    Изначально я хотел взять простой микроконтроллер с поддержкой USB (например, ATmega32u4) прикрутить к нему кнопочек, фейдеров и потенциометров, накидать все это на небольшую плату и на этом успокоиться. Но какой смысл во всей этой компактности, если вокруг будет виться длиннющий USB-кабель? Тут-то я и вспомнил про ESP32, который вроде как поддерживал bluetooth, и про относительно свежую и многообещающую технологию MIDI-BLE.


    Midi over Bluetooth


    Спецификация BLE-MIDI появилась не так давно в 2017 году и позволяет передавать MIDI-команды по Bluetooth со сравнительно небольшой задержкой 10-20 ms (для сравнения обычный USB — 4 мс). Технология успешно поддерживается всеми современными ОС, в частности iOS с 8-й версии, Android c 6-й, а также Windows 10 и Mac OS начиная с High Sierra. Работает все это весьма бодро, и, самое главное, можно без всяких проводов подцепить контроллер к айфону и поиграть на синтезаторе в каком-нибудь Garage Band.


    Программно реализовывать на практике все это оказалось не так уж и сложно. Всего-то нужно создать BLE-устройство с корректным MIDI Service UUID и MIDI Characteristic UUID, после чего можно общаться с подключенным устройством короткими BLE-пакетами, по структуре своей схожими с обычными MIDI-сообщениями (с добавлением двух служебных байтов)


    Не думаю, что имеет смысл в сотый раз рассказывать про устройство MIDI протокола — на эту тему есть бесчисленное количество статей. Ну а про MIDI-BLE можно почитать классный туториал тут


    Пруф оф концепт


    Первым делом хочется подкрепить свою идею каким-то простым и работающим прототипом; спустя полчаса ресерча по Github`у я залил в ESP-шку чей-то скетч, который, к моему удивлению, смог обнаружить мое устройство и даже отправить midi-команды на компьютер.


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


    Проблема нехватки ножек у ESP32 была решена их расширением с помощью мультиплексора CD74HC4067. Работать это должно было так: к CD74HC4067 подключены кнопки, микроконтроллер поочередно выставляет разные адреса на адресных шинах мультиплексора и считывает значение кнопки находящийся по соответствующему адресу с Common Output пина микросхемы. Кстати вместо кнопки можно вполне установить потенциометр и читать напряжения с них, тем самым добавить в девайс pitch-wheel например.


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


    image

    Тут-то меня постигло первое разочарование — кнопки. Кнопки были отвратительны, тугие и оставляли следи на пальцах при активной игре. Я прекрасно помню, какие кнопки были в моем Teenage Engineering PO-12, с виду точно такие же, но мягкие и плавные. Позже я заказал себе несколько семплов разных кнопок и все они оказались вполне пригодными для такой игрушки, но те первые, самые доступные из ближайшего чип и дипа, совсем никуда не годились.


    Хардвар


    Прототип как-то работал, концепция устройства была понятна, дело за печатной платой. К существующим компонентам я лишь добавил кнопочки для программирования установленного микроконтроллера, PLS-пины для прошивки и финального дебага, LiPo аккум и платку заряда литиевого аккумулятора на основе TP4056. Так торопился, что забыл добавить LDO для питания ESP32 да и банальную кнопку включения. Хотя конечно сперва был огромный соблазн навесить сразу кучу разных фитч на плату начиная от экрана и заканчивая дополнительными midi-выходами. Развел плату в EASYEDA буквально за пару вечеров и отправил в печать на DirtyPCB.


    Принципиальная схема


    image


    Такие платы приехали через 3 недели.


    Софтвар


    После того как PCB-шка была собрана, пришло время дописать прошивку и пройтись по всем граблям, раскиданным на этапе проектирования хардварной части. Во-первых, я узнал, что не все ADC-входы у EPS32 одинаково полезны можно использовать вместе с WiFi или bluetooth, а именно ADC2 порт не работает корректно вместе с Bluetooth. На какой порт я завел считывание данных с мультиплексора? Ну конечно же на него!


    image

    Позже, когда девайс уже завелся и успешно работал, я стал ловить странный баг: клавиатура периодически отваливалась от компа. А причина оказалась проста, AMS1117-3.3, который я поставил в схему совсем не подходил для питания ESP32 от литиевой батарейки, потому что просаживал напряжение на целых 0.7 В. Обнаружив это, я заменил его на менее прожорливый LD3985M30R. Поборов эту проблему, у меня наконец-то таки ура все заработало


    Да, совсем забыл сказать: поскольку я использую стойкую нелюбовь к Arduino IDE, то на отладки и написания прошивки очень воодушевился, открыв для себя PlatformIO.




    Корпус


    Все-таки использовать девайс с висящей на обратной стороне LiPo-батарейкой мне показалось слишком, и я решил сделать небольшой корпусок.


    Корпуса, напечатанные на 3D-принтере, всегда казались мне слишком DIYными на вид, и я решил нарезать корпус на lasercut`е.


    За вечер во Fusion360 я сделал бампер из 6 миллиметрового акрила и крышку.


    image


    image



    Результат


    Получилась компактная клавиатура размером с айфон. Вот небольшое видео с примером работы



    После того как я допилил прошивку и собрал девай в корпус, мне захотелось сделать вторую версию с midi-выходом, oled-экраном и устраненными косяками предыдущей PCBшки, но в последствии отказался от этого.


    Ссылка на Github c исходниками
    Ссылка на проект с PCB

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

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

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

      +2

      Правильно ли я понимаю, что оно будет работать с любым софтом на телефоне, который понимает MIDI? Команды MIDI как-то стандартизированы с блютусом?

        0
        Правильно ли я понимаю, что оно будет работать с любым софтом на телефоне, который понимает MIDI?

        Все так! Практически весь современный софт на телефоне понимает сейчас BLE MIDI стандарт. Для тех немногих программ которые понимают midi, но не понимает midi over bluetooth можно воспользоваться бесплатной программой от Korg: BLE-MIDI.

        Команды MIDI как-то стандартизированы с блютусом?

        Да, есть BLE-MIDI стандарт
        +2
        Очень прикольный проект. Очень классный. Хорошо было бы сделать kit-набор для сборки и продавать его желающим. Мой респект!
          0
          Спасибо!
          Я думал про kit-набор, и даже собрал проект со второй ревизией платы. Но честно говоря не хватило мотивации для того чтобы продолжать это развивать. Скорее хочется сделать что-нибудь новое с более крутой концепцией
            0
            Например MPE :) (MPE — Midi Polyphonic Expression, пример Roli Seabord)
          0

          Что означает шелкография с ножом?

            0
            были ассоциации с ножом для резки картона
            +2

            Что с latency вашего устройства.

              0
              Естественно задержка есть, в цифрах не измерял. На практике она не ощущается, не раздражает. Был случай когда она сильно чувствовалась (может быть канал был загружен, не могу сказать)
                0

                Судя по Bluetooth, задержка должна быть огромна. Но полноценно играть на таких кнопках все равно не получится, так что вряд ли вы ее почувствуете.


                Простой ямаховский синт в качестве миди-клавы, Logic, Reason, Cubase, VST-инструменты. На некоторых инструментах задержка уже вызывает рассинхронизацию мозга и уха, несмотря на подключение по миди-кабелю. Даже не представляю, какие задержки будут при подключении через BT.

              +1
              Изначально я хотел взять простой микроконтроллер с поддержкой USB (например, ATmega32u4) прикрутить к нему кнопочек, фейдеров и потенциометров, накидать все это на небольшую плату и на этом успокоиться. Но какой смысл во всей этой компактности, если вокруг будет виться длиннющий USB-кабель? Тут-то я и вспомнил про ESP32, который вроде как поддерживал bluetooth, и про относительно свежую и многообещающую технологию MIDI-BLE.

              Не один в один конечно, но тоже схожая история, начал пилить небольшое устройство (GitHub), походу дела понял что было бы неплохо если устройство будет беспроводным, в следствие чего заказал девборд ESP32S.
                0
                у ESP32 сложновато с USB, увы
                  0

                  Я же на Bluetooth-HID ориентируюсь, быстрый гуглеж выдал примеры и библиотеку

                    0
                    Я подумал что вы хотите одновременно Bluetooth и usb
                    0

                    А почему сложновато с usb?

                      0

                      У ESP32 нет аппаратного USB, далее вытекает что нужно писать хост на пк, который будет обрабатывать команды с мк отправляемые в COM-порт.
                      Если я ошибаюсь, поправьте.

                0
                Зачем было использовать ESP32, главной фичей которого является интегрированный wifi (не используемый в данном проекте)? Можно было взять любой приличный МК со встроенным bluetooth (например те же популярные STM32) и избежать половины проблем из статьи.
                  0
                  Под рукой была девборда с ESP32. А что из STM32 с интегрированным блютусом вы бы предложили?
                    0
                    Выбор МК не осуждаю, но если интересны альтернативы: STM32WB, NRF52/53.
                  0

                  Все хорошо, но с кнопками — клавишами нужно что-то делать. Тем более если играть по нотам практический смысл пропадает. В последнее время такие девайсы на сенсор переводят.

                    0

                    От сенсорных клав отказались еще в 90-х, насколько мне помнится. Невозможно на них играть, нет обратной связи на пальцы.

                      0
                      Много современных инструментов испольуют сенсорные клавиатуры на вскидку: arturia microfreak, вся линейка korg volca
                    0
                    Интересный проект, спасибо! Для себя подумываю создать что-то подобное, но не MIDI, а программируемую клавиатуру для разработчика — набор кнопок FN1 — FN12 с возможностью переключения на цифровую клавиатуру. Было бы к примеру полезно для разработчиков с последними макбуками, где вместо функциональных клавиш — тачбар. Себестоимость такой легко может быть в меньше 1000р, а аналоги (имхо довольно убогие и скорее заточенные под контент-криэйтеров) стоят от 7тр и выше.

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

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