Пока еще проводная, но микроконтроллеры ждут своего часа (спойлер - дождались).
Пока еще проводная, но микроконтроллеры ждут своего часа (спойлер - дождались).

Недавно я опубликовал здесь статью о беспроводной сплит-клавиатуре Sofle RGB Wireless. В целом, с ней все хорошо: работает, глюков нет, за исключением мелочей. Единственное — мне все же больше нравятся низкопрофильные клавиатуры. Это я понял, когда через пару дней работы на Sofle RGB вернулся к Lily58 Pro. Настолько я привык к ней, что отвыкать оказалось сложно. Но по возвращении меня стала раздражать одна вещь — провода.

Кабель к компьютеру и шнур между половинками работали безотказно, но, во-первых, это лишние элементы на столе. Во-вторых, это причина ограниченной мобильности. Переставить ноутбук, подключить второй ПК, разнести половинки шире — и снова приходится вспоминать о длине кабеля. Короче, я решил ее сделать беспроводной. Забегая наперед скажу, что все получилось. Эта статья, к слову, написана посредством Lily58 Pro. Но было много всего интересного, о чем расскажу под катом. Поехали!

Контроллеры и новая архитектура

В проводной Lily58 используется Pro Micro с QMK — это контроллер, рассчитанный на питание и передачу данных по USB. Тут все просто: считываются и обрабатываются нажатия клавиш, на этом все. В беспроводной конфигурации требования другие. Контроллер должен еще поддерживать работу от аккумулятора и обеспечивать беспроводное соединение. Короче, нужно было менять микроконтроллеры. Оказалось, что все просто.

На Amazon купил два контроллера на nRF52840 — по одному на каждую половину. Стоят они по 7 евро каждый, что очень недорого. Форм-фактор и разводка совместимы с nice!nano v2. Это, кстати, ключевой момент: Lily58 Pro разведена под Pro Micro, и эти платы повторяют ту же посадку и шаг выводов. Они просто встают в сокеты. Никакой переделки матрицы и адаптеров не требуется. Нужно только учесть, что у беспроводных модулей на два контакта больше, это питание батареи.

По железу все неплохо: ARM Cortex-M4F 64 МГц, 1 МБ флеша и 256 КБ оперативной памяти. Для клавиатуры с проводом такие рес��рсы выглядели бы избыточными. В беспроводной версии они к месту. Здесь одновременно работают Bluetooth, синхронизация половинок, обработка слоев, макросы и логика энергосбережения. Когда памяти достаточно, все работает без сбоев.

Отдельно про питание. Контроллеры этого формата уже рассчитаны на Li-Po 3,7 В, зарядка идет через USB. Аккумулятор подключается напрямую, ничего дополнительно городить не нужно. Соответственно, в корпусе нет лишних плат и проводов — только контроллер и батарея.

Меняем старые микроконтроллеры на новые.
Меняем старые микроконтроллеры на новые.

Облачная инфраструктура для ваших проектов

Виртуальные машины в Москве, Санкт-Петербурге и Новосибирске с оплатой по потреблению.

Подробнее →

Прошивка контроллеров: от платы к полноценной клавиатуре

В беспроводной сплит-клавиатуре прошивка — тот этап, который превращает голый контроллер (nice!nano или любой другой на базе nRF52840) в рабочее устройство. Без нее плата остается просто куском железа с чипом: система ее не увидит как клавиатуру, а раскладка и вся логика просто не заработают.

И здесь меня ждал приятный сюрприз. А именно встроенный загрузч��к, который делает процесс прошивки максимально простым. Никаких внешних программаторов, проводов к пинам SWD или специальных утилит не нужно. Контроллер сам появляется в системе как обычный съемный USB-диск. Разработчикам спасибо.

Поскольку клавиатура состоит из двух независимых половин, прошивка для каждой из них собирается отдельно. В ZMK это два файла формата .uf2 — один для левой половины (обычно называется left.uf2), другой для правой (right.uf2). Я собирал их через GitHub Actions: настроил workflow под свой конфиг и на выходе получал два готовых артефакта. Это удобно и быстро — не нужно держать локальную среду с кучей зависимостей.

Главный источник ошибок новичков — перепутать файлы при прошивке. Как говорится, одна ошибка — и ты ошибся. Если что не так, получите зеркальную раскладку или вообще неработающую половину.

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

Обновление прошивки происходит очень просто, почти как копирование файла на флешку. Берете половину клавиатуры, которую хотите прошить, дважды нажимаете кнопку Reset на контроллере (double-tap reset), и плата переходит в режим загрузчика. Она появляется в системе как USB-накопитель с названием вроде NICENANO или NRF52BOOT. Открываете этот «диск» и просто перетаскиваете в него нужный файл .uf2. Как только копирование завершится, контроллер автоматически перезагрузится, «диск» исчезнет, и плата запустится уже с новой прошивкой.

После успешной загрузки обеих половин клавиатура переходит в рабочий режим ZMK. Левая половина автоматически становится центральной (central) и подключается напрямую к компьютеру или телефону по Bluetooth, а правая подключается к левой как периферия (peripheral).

Если нужно очистить старые Bluetooth-сопряжения (например, при смене устройств или если коннекта нет), это делается отдельной комбинацией клавиш, прописанной в вашей раскладке. Либо, если ничего не прописано, нужно загрузить специальный конфигурационный файл на обе половинки. Он затирает флеш-память и обнуляет все настройки. После этого нужно загружать уже файлы прошивки.

А что насчет раскладки

Возможностей много. Кастомизировать собственную можно либо прямо в GitHub с последующим обновлением прошивки, либо через инструмент ZMK Studio (есть десктопная и веб-версия). Подключение проходит без проблем (в прошивке поддержка ZMK должна быть прописана), после чего «на горячую» все меняем. Результаты сохраняются во флеш-памяти. 

Вот это моя раскладка.
Вот это моя раскладка.

Логика раскладки в ZMK строится вокруг слоев. Есть базовый слой — тот, на котором происходит обычный набор текста. Он активен по умолчанию и воспринимается как «основная» клавиатура. Все остальные уровни накладываются поверх него и временно или постоянно меняют поведение клавиш.

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

Вот один из слоев. Главная здесь проблема - запомнить, где какая клавиша.
Вот один из слоев. Главная здесь проблема - запомнить, где какая клавиша.

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

Отдельный уровень гибкости добавляет контекстное поведение клавиш. Короткое нажатие и удержание могут трактоваться по-разному: например, при быстром нажатии клавиша печатает букву, а при удержании работает как модификатор. В результате раскладка перестает быть статичной схемой и превращается в инструмент, который подстраивается под способ набора и привычки владельца. Короче, возможностей там миллион, настраивать можно месяцами. Главное — не забыть все сохранить, чтобы потом не было мучительно больно. 

Тестируем! 

Важная ремарка — нужны аккумуляторы, причем не какие-то, а исключительно 3,7В, причем миниатюрные. Ведь нужно же их где-то размещать в корпусе, верно? Для первых тестов я использовал то, что было под рукой: один аккумулятор от старого фитнес-трекера, второй — от беспроводной гарнитуры. Я изначально понимал, что с ними возможны проблемы, и ставил их только для проверки общей работоспособности клавиатуры — убедиться, что все включается, прошивается и соединяется. На долгую стабильную работу я не рассчитывал.

Косо, криво, но для теста пойдет.
Косо, криво, но для теста пойдет.

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

После теста я заказал новенькие элементы питания. Для своей сборки я взял аккумуляторы формата 301230 — литий-полимерные ячейки на 3,7 В с емкостью 80 мА·ч. Цифры в названии означают габариты: примерно 30 × 12 × 3 мм. Батареи очень тонкие и легкие, спокойно помещаются внутрь корпуса сплит-клавиатуры и не требуют переделки конструкции. Энергии в них около 0,3 Вт·ч — немного, но для компактной электроники это обычный уровень.

Стоят они недорого — порядка 20 евро за две штуки, заказывал с Amazon. Приятный момент: приходят уже с припаянными проводами, контакты аккуратно заизолированы. Так что ничего не нужно паять к самой ячейке. Подключил к плате — и можно тестировать автономную работу.

Конечно, я понимаю, что 80 мА·ч — это маленький запас. Тут было важным добиться автономности хотя бы сутки и иметь возможность поместить аккумуляторы в промежутке между нижней частью корпуса и платой.

Тут проблем не возникло, ведь толщина батареи всего 3 мм, что без труда позволяет установить ее где захочется. Сейчас тестирую автономность. Если не хватит, то закажу более емкие, но тогда придется распечатывать на 3D-принтере корпус для клавиатуры с «карманом» для батареи. 

Итог и дальнейшие планы

После установки новых аккумуляторов, обновления базы ZMK и упрощения конфигурации клавиатура наконец перешла в режим, который можно описать словами «просто работает». BLE стабилен, разряд идет плавно, сплит соединяется с ПК без проблем.

Еще один вариант размещения батарей - на “кроватке”, под чипом.
Еще один вариант размещения батарей - на “кроватке”, под чипом.

В планах — добавить адресную подсветку каждой клавиши. Тут нужно разобраться с питанием и контролем потребления, чтобы избежать неожиданностей. Но, думаю, справлюсь. Кроме того, хочу восстановить управление громкостью через энкодер на правой половине, корректно настроив overlay и пины A/B. Это было очень удобно

Подсветкой, кстати, можно управлять с клавиатуры. Настройка слоев позволяет организовать довольно сложные сценарии. Но это в ближайшем будущем, а пока — все. Не переключайтесь, дальше будет интересно!