Несколько лет тому назад ко мне в руки попала компактная драм-машина от небезызвестных 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 например.
Накупив кнопочек и микросхем, за вечер я собрал вот такой прототип:
Тут-то меня постигло первое разочарование — кнопки. Кнопки были отвратительны, тугие и оставляли следи на пальцах при активной игре. Я прекрасно помню, какие кнопки были в моем Teenage Engineering PO-12, с виду точно такие же, но мягкие и плавные. Позже я заказал себе несколько семплов разных кнопок и все они оказались вполне пригодными для такой игрушки, но те первые, самые доступные из ближайшего чип и дипа, совсем никуда не годились.
Хардвар
Прототип как-то работал, концепция устройства была понятна, дело за печатной платой. К существующим компонентам я лишь добавил кнопочки для программирования установленного микроконтроллера, PLS-пины для прошивки и финального дебага, LiPo аккум и платку заряда литиевого аккумулятора на основе TP4056. Так торопился, что забыл добавить LDO для питания ESP32 да и банальную кнопку включения. Хотя конечно сперва был огромный соблазн навесить сразу кучу разных фитч на плату начиная от экрана и заканчивая дополнительными midi-выходами. Развел плату в EASYEDA буквально за пару вечеров и отправил в печать на DirtyPCB.
Такие платы приехали через 3 недели.
Софтвар
После того как PCB-шка была собрана, пришло время дописать прошивку и пройтись по всем граблям, раскиданным на этапе проектирования хардварной части. Во-первых, я узнал, что не все ADC-входы у EPS32 одинаково полезны можно использовать вместе с WiFi или bluetooth, а именно ADC2 порт не работает корректно вместе с Bluetooth. На какой порт я завел считывание данных с мультиплексора? Ну конечно же на него!
Позже, когда девайс уже завелся и успешно работал, я стал ловить странный баг: клавиатура периодически отваливалась от компа. А причина оказалась проста, AMS1117-3.3, который я поставил в схему совсем не подходил для питания ESP32 от литиевой батарейки, потому что просаживал напряжение на целых 0.7 В. Обнаружив это, я заменил его на менее прожорливый LD3985M30R. Поборов эту проблему, у меня наконец-то таки ура все заработало
Да, совсем забыл сказать: поскольку я использую стойкую нелюбовь к Arduino IDE, то на отладки и написания прошивки очень воодушевился, открыв для себя PlatformIO.
Корпус
Все-таки использовать девайс с висящей на обратной стороне LiPo-батарейкой мне показалось слишком, и я решил сделать небольшой корпусок.
Корпуса, напечатанные на 3D-принтере, всегда казались мне слишком DIYными на вид, и я решил нарезать корпус на lasercut`е.
За вечер во Fusion360 я сделал бампер из 6 миллиметрового акрила и крышку.
Результат
Получилась компактная клавиатура размером с айфон. Вот небольшое видео с примером работы
После того как я допилил прошивку и собрал девай в корпус, мне захотелось сделать вторую версию с midi-выходом, oled-экраном и устраненными косяками предыдущей PCBшки, но в последствии отказался от этого.
zhovner
Правильно ли я понимаю, что оно будет работать с любым софтом на телефоне, который понимает MIDI? Команды MIDI как-то стандартизированы с блютусом?
Gho_st Автор
Все так! Практически весь современный софт на телефоне понимает сейчас BLE MIDI стандарт. Для тех немногих программ которые понимают midi, но не понимает midi over bluetooth можно воспользоваться бесплатной программой от Korg: BLE-MIDI.
Да, есть BLE-MIDI стандарт