Несколько лет тому назад ко мне в руки попала компактная драм-машина от небезызвестных 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шки, но в последствии отказался от этого.
Ссылка на Github c исходниками
Ссылка на проект с PCB
Автор: Иван