Привет, Хабр! В своей прошлой статье о сплит-клавиатуре Lily58 Pro я рассказывал, как переделал ее из проводной в беспроводную. Тогда все закончилось вполне успешно: обе половинки заработали через Bluetooth, OLED-дисплеи и RGB-подсветка остались на своих местах. Причем изображения на дисплеях заменил на кастомные — с котиками и процентами зарядки аккумулятора. Казалось, что теперь можно просто пользоваться клавиатурой и забыть о проводах.
Но довольно быстро выяснилось (примерно через две–три недели), что радоваться рано. Клавиатура начала вести себя странно. Аккумуляторы разряжались слишком быстро, в беспроводном режиме был небольшой лаг при вводе символов, а иногда буквы задваивались. В итоге пришлось снова доставать инструменты, заказывать новые детали и разбираться, что же пошло не так. Об этом и расскажу в новой статье.
Китайские контроллеры: когда экономия выходит боком
Для первой версии беспроводной Lily58 я использовал недорогие аналоги nice!nano v2 на базе nRF52840. Купил их на Amazon, по 8 € каждый. Прошивка на них записывалась без особых проблем, обе половинки подключались по Bluetooth, а клавиатура реагировала на нажатия. Поначалу никаких серьезных подозрений не возникало, тем более что с подобными контроллерами я раньше не сталкивался. Но спустя некоторое время выяснилось, что нормально прошиться и стабильно работать — немного разные вещи.

Больше всего неприятностей доставляла правая половинка. Она могла некоторое время работать от аккумулятора, а затем внезапно отключиться. После подключения USB все оживало, но стоило снова перейти на батарею, как история повторялась. Светодиод зарядки при этом работать перестал, хотя сам аккумулятор заряжался (я проверял мультиметром). Ну а проценты на OLED могли заметно меняться без понятной причины. Сначала я грешил на сам аккумулятор, тем более что использовал батареи малой емкости от непроверенного продавца (ну нет у меня проверенных).

Почти сразу добавились проблемы с вводом. Некоторые нажатия проходили с задержкой, отдельные символы могли пропускаться, а иногда, наоборот, появлялись повторные буквы. Я грешил на свитчи и время от времени их менял. Вроде бы проблема уходила, но только на время. Для клавиатуры, на которой приходится много печатать, это уже серьезная неприятность. Особенно раздражало, что неисправность не проявлялась постоянно: какое-то время все работало как положено, а затем снова начинались странности. Проверял настройки прошивки, переподключал половинки, пробовал разные варианты конфигурации, но добиться устойчивого результата не получалось.
В какой-то момент все дошло до ситуации, когда клавиатура постоянно была подключена проводами к зарядкам, так что вместо проводной клавиатуры, подключенной к USB одним кабелем, я получил «беспроводную» с двумя кабелями. В итоге плюнул и поставил обратно проводные контроллеры — те, что были до переделки клавы. Сразу все стало как нужно. Хорошо, что я не выбросил их и не перепрошивал для других нужд.

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

Все обдумав, пришел к выводу, что покупать на том же Amazon те же контроллеры не стоит. Пошел на AliExpress и заказал другие китайские аналоги nice!nano v2. На этот раз попались красные платы, три штуки обошлись примерно в 16 €. Они отличались от предыдущих в основном цветом, поэтому особых чудес я не ожидал. Решил, что поставлю, а если будет та же проблема, то полностью вернусь на проводной интерфейс.

Прошил, подключил батареи, поставил контроллеры. И сильно удивился, поскольку все не только заработало как нужно, но даже лучше. Внезапно пропали задвоения символов, исчезли внезапные отключения, зарядка проходила в штатном режиме. Третью плату я пока оставил про запас.

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

Потом смотрел отзывы в сети, где попалась пара подобных случаев. Эти вот черные клоны быстро начинали глючить у покупателей, а красные вели себя намного лучше. Короче, покупка дешевых китайских плат оказалась небольшой лотереей, причем с первым билетом мне не повезло.
OLED и ZMK: решаем проблемы задержки ввода
После замены контроллеров клавиатура стала работать почти идеально. Почти, да. За исключением одной крайне неприятной мелочи. При включенных OLED-дисплеях появлялся небольшой, но вполне заметный лаг при вводе текста. Причем стоило только отключить дисплеи физически, как проблема исчезала. Получалось довольно странно: сами экранчики работали нормально, показывали нужную информацию и не зависали, но при этом каким-то образом мешали основной функции устройства. Отказываться от них не хотелось.

Пришлось снова лезть в документацию ZMK и разбираться с параметрами конфигурации. Помогло выделение отдельной очереди для обновления дисплея и настройка приоритета соответствующего потока. Для этого в конфигурационном файле раскомментировал первую строку и добавил вторую:
CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y
CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_PRIORITY=10
Под первой был комментарий # esto creo que ya no es necesario. То есть испаноговорящий разработчик указывал, что не считает уже необходимостью этот параметр. Но нет, как оказалось, он важен.
После новой сборки прошивки лаги пропали целиком и полностью. Я крайне обрадовался: клавиатура наконец-то превратилась не в источник проблем, а в то, чем она должна быть — рабочим инструментом.
В чем тут трабл? Насколько я понимаю, раньше обновление изображения на дисплейчике могло конкурировать с другими задачами, а теперь обработка дисплея стала меньше мешать вводу. Конечно, это не универсальное решение для любой клавиатуры на ZMK, поскольку многое зависит от используемого оборудования и версии прошивки. Но в моем случае все решили два параметра.
От 80 до 3000 мА·ч: решаем проблему автономности
Для первой версии беспроводной Lily58 я выбрал небольшие литий-полимерные аккумуляторы емкостью 80 мА·ч. Почему они? Из-за размеров: батарейки спокойно помещались под контроллерами и не требовали переделки корпуса. Все бы ничего, но при включенных OLED-дисплеях и RGB-подсветке заряжать клавиатуру приходилось слишком часто. Особенно быстро садилась правая половинка, хотя часть проблем, как выяснилось позже, была связана с неисправным контроллером.
Конечно, можно было просто отключить подсветку и значительно сократить энергопотребление. В этом случае клавиатура держалась не несколько часов, а примерно сутки. Заряжались эти аккумуляторы на 100% примерно за час. Можно было работать, ставить на зарядку во время перекуса/прогулки и чувствовать себя комфортно еще сутки.
Но мне такой вариант совершенно не подходил, поскольку RGB была одной из причин, по которым я вообще заинтересовался этой клавиатурой. В ZMK есть настройки энергосбережения, позволяющие отключать отдельные функции при простое, была возможность снизить яркость и т. п. Но постоянно следить за состоянием аккумуляторов все равно не хотелось. Поэтому решил пойти другим путем и установить батареи значительно большей емкости. Благо пространство внутри корпуса позволяло немного поэкспериментировать.
Сначала рассматривал варианты на несколько сотен миллиампер-часов (у меня как раз была парочка электронных книг с разбитыми дисплеями). Емкость их аккумуляторов была около 1 000 мА·ч. Вполне достаточно.
Но потом я обнаружил в запасниках две батареи от, насколько я помню, внешнего аккумулятора. Это Li-ion емкостью в 3 000 мА·ч и толщиной 3 мм. Подключил — все работает, причем батареи пролежали у меня пару лет. И до сих пор хранили заряд.

Теперь в каждой половинке отдельный аккумулятор емкостью 3 000 мА·ч. По сравнению с первоначальными 80 мА·ч это увеличение в 37 раз. Запас получился достаточно большим, чтобы перестать постоянно думать о зарядке. По крайней мере, именно такого результата я и добивался. Сейчас пошли уже вторые сутки после установки, а клавиатура с подсветкой не разрядилась. Остается 23%. Изначально было что-то около 40%. Конечно, заряд может отображаться некорректно.
Прошивка оценивает оставшийся заряд по напряжению батареи, а такая оценка не учитывает реальную емкость установленного элемента питания. Особенно заметны погрешности после перехода с крошечных аккумуляторов на гораздо более крупные. Поэтому делать выводы только по цифрам на дисплее было бы неправильно. Посмотрим.
Полного цикла разрядки я пока не проводил: не успел. Но по первым наблюдениям и расчетному энергопотреблению рассчитываю примерно на одну–две недели работы при умеренной яркости RGB. При отключенной подсветке автономность должна вырасти многократно: возможно, это будет пара месяцев. Но ради этого увеличивать аккумуляторы я точно не собирался. Главное, что необходимость постоянно подключать кабель осталась в прошлом. Беспроводная клавиатура стала наконец беспроводной по факту, а не по названию.
Новый корпус: аккумуляторы поместились, а про подсветку забыли
Установка больших аккумуляторов потребовала переделки корпуса. Старые батарейки спокойно помещались под контроллерами, но с элементами на 3 000 мА·ч такой вариант уже не проходил. Пришлось открыть STL-модели и подготовить внутри достаточно большие посадочные места. Заодно решил напечатать корпус из полупрозрачного PLA, чтобы свет от RGB был заметен не только через отдельные отверстия, но и сквозь сам пластик. Получилось довольно симпатично, хотя добиться хорошего рассеивания света оказалось сложнее, чем я первоначально предполагал.

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

Когда все наконец удалось собрать, обнаружилась довольно забавная неприятность. Я предусмотрел место для огромного аккумулятора, убрал мешающие крепления, напечатал прозрачный корпус, но совершенно забыл про светодиодную ленту. В результате батарея перекрыла значительную часть света от RGB. Формально подсветка продолжала работать, только толку от нее стало гораздо меньше. Особенно смешно это выглядело с учетом того, что увеличенная емкость как раз должна была позволить пользоваться светодиодами без постоянной зарядки. Получилось, что одну проблему решил, а другую создал собственными руками.

Перепечатывать корпус еще раз совершенно не хотелось, и так уже убил порядочно времени. Поэтому решил обойтись без новой модели и просто проплавил в нижней части корпуса канавку под светодиодную ленту. PLA достаточно легко размягчается при нагревании, так что удалось подготовить углубление нужной формы без дополнительной печати. После этого уложил туда RGB, а между подсветкой и аккумулятором проложил изоленту. Она закрывает электрические контакты и служит дополнительной изоляцией. Светодиоды разместил так, чтобы выступающие части не упирались в батарею.

В итоге светодиоды снова стали нормально подсвечивать полупрозрачный корпус. Причем такое расположение оказалось вполне удачным: свет проходит через пластик и создает более мягкое свечение, чем при открытом расположении отдельных RGB-элементов.
Что получилось в итоге
После всех переделок Lily58 Pro заметно изменилась по сравнению с вариантом из первой статьи. Вместо проблемных китайских контроллеров теперь установлены другие платы на базе все тех же nRF52840. ZMK нормально работает с OLED-дисплеями и RGB-подсветкой. Аккумуляторы увеличены с 80 до 3 000 мА·ч на каждую половинку. При этом сама клавиатура осталась такой же удобной: низкопрофильные переключатели, сплит и привычная раскладка никуда не делись. Ради этого, собственно, вся затея и начиналась.
Основные проблемы, из-за которых клавиатурой было неудобно пользоваться, удалось устранить. Bluetooth больше не доставляет прежних неприятностей, задержки при печати исчезли, а запас энергии стал значительно больше. Осталось только понаблюдать за реальной автономностью и понять, насколько предварительные расчеты совпадают с практикой.
Вообще, с самодельными клавиатурами получается довольно интересная история. Сначала кажется, что достаточно один раз подобрать переключатели, собрать платы и настроить прошивку, после чего можно спокойно пользоваться готовым устройством. Но потом находятся более удобные контроллеры, хочется увеличить аккумуляторы, изменить корпус или добавить какую-нибудь фичу. Каждая такая переделка действительно может сделать клавиатуру лучше, однако одновременно появляется риск сломать то, что до этого прекрасно работало. Поэтому пока я решил остановиться на достигнутом.