Новогодняя ёлка? Нет, Lily58 с подсветкой и кастомным прозрачным корпусом
Осталось добавить подарки и посадить в центре Деда Мороза.
Привет, SE7EN! Я снова с историей о своей клавиатуре — кажется, на этот раз её доработка наконец завершена. В предыдущей статье я рассказывал, как модернизировал беспроводную Lily58 Pro: заменил контроллеры, установил ёмкие аккумуляторы и напечатал новый корпус. Результат меня в целом устроил, но сам корпус выглядел не слишком аккуратно: канавки в пластике пришлось делать паяльником.
Такое решение мне не давало покоя, поэтому я решил всё переделать. В этой статье расскажу, что из этого вышло. Я доработал 3D-модель, предусмотрел съёмные крышки аккумуляторных отсеков и каналы для проводов, а количество светодиодов увеличил до 45. Попутно пришлось разобраться с GitHub и настройками ZMK: после сборки светилась только часть подсветки. Поехали!
Что хотелось улучшить
После предыдущей модернизации клавиатура работала исправно. Контроллеры nice!nano v2, OLED-дисплеи, энкодер и Bluetooth функционировали как положено, аккумуляторы тоже не вызывали нареканий. Зато меня не устраивали расположение и яркость подсветки, а также необходимость разбирать корпус ради доступа к батареям. Провода внутри тоже были уложены не слишком аккуратно. Поэтому главной задачей стала переделка корпуса: сначала я решил изменить 3D-модель, а затем заняться электроникой.

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

При необходимости яркость можно уменьшить или вовсе выключить подсветку — такая возможность тоже предусмотрена. В итоге я выбрал 24 светодиода для левой половины и 21 для правой.

Ещё одной задачей был удобный доступ к аккумуляторам. Раньше для этого приходилось снимать плату и рисковать повредить проводку или другие соединения. Я подготовил два варианта корпуса — для батарей на 1350 и 3000 мА·ч — и в обоих предусмотрел съёмные лючки снизу. Теперь аккумулятор можно извлечь без полной разборки клавиатуры. Заодно я немного изменил расположение внутренних компонентов и избавился от нескольких лишних отверстий.
Доработка корпуса
Для светодиодов я предусмотрел канавки шириной 13 мм и глубиной 2 мм. Под провода сделал отдельные каналы глубиной около 2 мм, чтобы они не выступали над внутренней поверхностью корпуса. Свободного пространства немного, поэтому пришлось учитывать положение креплений, разъёмов и аккумуляторов. Некоторые участки модели я переделывал по несколько раз, проверяя, не пересекаются ли новые углубления с существующими элементами. В итоге подсветку удалось разместить там, где нужно, не увеличивая габариты корпуса.
Отдельного внимания потребовали лючки. Нужно было выделить достаточно места для батареи, сохранить крепления и сделать крышку, которую можно снять без разборки половинки. В варианте для аккумулятора на 1350 мА·ч я изменил посадочное место, главным образом увеличив его длину. В версии на 3000 мА·ч отсек получился крупнее, но устроен по тому же принципу. Крышки в обоих случаях находятся снизу, поэтому добраться до батарей стало намного проще.


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

В сравнении с прежним вариантом конструкция стала аккуратнее и, что важнее, удобнее в обслуживании.
Монтаж светодиодов
Для подсветки я выбрал адресные RGB-светодиоды семейства WS2812. Каждый из них оснащён встроенным контроллером, поэтому цвет и яркость задаются программно. Светодиоды соединяются последовательно: выход данных одного подключается ко входу следующего, а питание подводится к цепочке отдельно. Таким образом, управлять всеми элементами можно с одного сигнального вывода микроконтроллера. Есть и обратная сторона: если в цепи нарушится контакт, последующие светодиоды могут перестать работать.

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

Паять пришлось под микроскопом: контакты светодиодов маленькие, а места вокруг почти нет. Сама пайка прошла без особых сложностей, зато укладка проводов заняла гораздо больше времени. Необходимо было обойти крепления, разъёмы и аккумуляторные отсеки, не допустив замыкания соседних соединений. В некоторых местах жилы проходят совсем рядом с контактными площадками платы, поэтому подозрительные участки я дополнительно изолировал. Внутри в итоге образовалась внушительная паутина, которую теперь не хочется тревожить без необходимости.
После монтажа я подключил питание и включил подсветку. Заработали только первые десять светодиодов, а остальные не реагировали ни на смену цвета, ни на переключение режимов. Сначала я заподозрил ошибку пайки: при последовательном соединении одного плохого контакта достаточно, чтобы данные перестали поступать дальше. Однако проверка не выявила очевидных проблем. Тогда я заглянул в настройки ZMK — уж слишком число работающих светодиодов напоминало программное ограничение.
Настройка ZMK через GitHub
Конфигурация моей Lily58 находится в репозитории GitHub, а прошивка собирается с помощью GitHub Actions. На выходе получаются файлы UF2, которые можно записать на nice!nano v2 через стандартный загрузчик. Для левой и правой половинок у меня используются отдельные конфигурации.
Сначала нужно открыть каталог config/boards/shields/lily58/. В нём находятся два файла:
lily58_left.overlay
lily58_right.overlay
Первый содержит дополнительные настройки левой половинки, второй — правой. В моём репозитории оба файла уже были, поэтому создавать их заново не пришлось. Для левой половинки нужно было добавить следующие строки:
&led_strip {
chain-length = <24>;
};
Здесь led_strip — существующий узел Devicetree, который отвечает за адресную подсветку. Запись &led_strip позволяет изменить его свойства без создания нового узла. Значение 24 соответствует числу светодиодов в левой половинке. Если элементов установлено больше или меньше, нужно указать своё число, иначе конфигурация не будет соответствовать фактической длине цепочки и подсветка может работать некорректно. Остальные параметры подсветки у меня уже были заданы, поэтому их менять не потребовалось.
С правой половинкой немного сложнее: в её overlay уже содержались настройки энкодера. Я оставил их без изменений и добавил только длину светодиодной цепочки. В результате lily58_right.overlay выглядит так:
/ {
right_encoder: encoder_right {
compatible = "alps,ec11";
a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>;
b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>;
steps = <80>;
};
sensors {
compatible = "zmk,keymap-sensors";
sensors = <&right_encoder>;
triggers-per-rotation = <20>;
};
};
&led_strip {
chain-length = <21>;
};
Верхняя часть файла описывает энкодер, нижняя — подсветку. Параметры steps и triggers-per-rotation зависят от модели энкодера и выбранных настроек, поэтому переносить их в другую конфигурацию необязательно. За управление громкостью отвечает привязка sensor-bindings в файле lily58.keymap — её я тоже не менял. По сути, новая настройка здесь состоит из последних трёх строк. Но, чтобы они попали в прошивку, пришлось также изменить build.yaml.
Правка build.yaml
Файл расположен в корне репозитория и содержит параметры сборки для обеих половинок: контроллер, шилды, дополнительные настройки CMake и имена готовых файлов. Сначала я попытался подключить overlay через ZMK_EXTRA_DTC_OVERLAY_FILE, но после сборки и перепрошивки число работающих светодиодов не изменилось. Оказалось, что в моей конфигурации нужен параметр EXTRA_DTC_OVERLAY_FILE. Он передаётся через CMake и позволяет указать дополнительный файл Devicetree.
Рабочая версия build.yaml получилась такой:
---
include:
- board: nice_nano_v2
shield: lily58_left nice_oled
cmake-args: -DCONFIG_ZMK_KEYBOARD_NAME=\"lily58_Oled\" -DCONFIG_ZMK_STUDIO=y -DCONFIG_ZMK_SLEEP=y -DCONFIG_ZMK_IDLE_TIMEOUT=60000 -DEXTRA_DTC_OVERLAY_FILE=/tmp/zmk-config/config/boards/shields/lily58/lily58_left.overlay
artifact-name: nice_lily58_left_oled
snippet: studio-rpc-usb-uart
- board: nice_nano_v2
shield: lily58_right nice_oled
cmake-args: -DCONFIG_ZMK_SLEEP=y -DCONFIG_ZMK_IDLE_TIMEOUT=60000 -DEXTRA_DTC_OVERLAY_FILE=/tmp/zmk-config/config/boards/shields/lily58/lily58_right.overlay
artifact-name: nice_lily58_right_oled
Здесь nice_nano_v2 обозначает контроллер, а lily58_left nice_oled и lily58_right nice_oled — варианты шилдов для половинок с OLED-дисплеями. Для левой стороны дополнительно включён ZMK Studio, позволяющий менять некоторые настройки клавиатуры без перепрошивки. Параметры сна и времени простоя я оставил прежними: они уже использовались в моей конфигурации. Путь /tmp/zmk-config/… относится к среде сборки GitHub Actions и в другом репозитории может отличаться. Главное, чтобы EXTRA_DTC_OVERLAY_FILE указывал на существующий файл.
После правки build.yaml его нужно сохранить в репозитории вместе с обоими overlay. Если автоматическая сборка GitHub Actions настроена, она начнётся после коммита.
У меня сборка запустилась, но изменения не применились. Зелёная отметка GitHub Actions сама по себе не гарантирует, что нужный overlay действительно был использован. Поэтому я решил проверить итоговый файл Devicetree — zephyr.dts, который формируется после объединения настроек платы, шилдов и дополнительных конфигураций. При локальной сборке он находится в каталоге zephyr внутри папки сборки; в GitHub Actions его содержимое можно вывести в журнал соответствующего этапа. В этом файле нужно найти узел светодиодной цепочки и проверить значение chain-length.
Для левой половинки оно должно равняться 24, для правой — 21. Если осталось десять, изменения не попали в итоговую конфигурацию, даже когда исходный overlay заполнен правильно. Тогда стоит проверить путь в build.yaml и журнал CMake, где перечислены используемые файлы Devicetree. Также полезно изучить этап West Build: там можно обнаружить неверный путь или другие ошибки подключения. В моём случае нужные значения появились в итоговом файле после замены параметра на EXTRA_DTC_OVERLAY_FILE.
После перепрошивки заработали все 45 светодиодов: 24 слева и 21 справа. RGB-режимы теперь применяются ко всей цепочке, а OLED-дисплеи, раскладка и остальные функции клавиатуры продолжили работать как прежде.
Результат
Подсветка работает на обеих половинках. Светодиоды установлены внутри корпуса, а не непосредственно под клавишами. Благодаря прозрачному пластику свет распространяется по стенкам и хорошо заметен в темноте.

Цвета и режимы меняются средствами ZMK, поэтому для дальнейших экспериментов перепаивать ничего не придётся. Канавки теперь предусмотрены непосредственно в 3D-модели, а доступ к аккумуляторам обеспечивают отдельные лючки снизу.

При полной яркости клавиатура работает от аккумуляторов около полутора дней — разумеется, не в режиме непрерывной печати все 36 часов. Если она простаивает больше десяти минут, сначала выключаются экраны, а затем подсветка. При нажатии любой клавиши всё снова включается. Экономия должна быть экономной.
Планы на будущее
В ближайшее время хочу установить аппаратные выключатели питания на обе половинки. Сейчас аккумуляторы подключены постоянно, и для полного отключения их приходится отсоединять вручную. При обслуживании это неудобно, особенно когда нужно проверить пайку или поправить провода. Небольшие фиксируемые переключатели можно включить в разрыв положительного провода каждой батареи и отключать питание независимо от состояния прошивки.
Возможно, ещё сделаю ножки, чтобы наклонить обе половинки на 5–10 градусов. Говорят, так печатать удобнее. При этом можно обойтись без переделки корпуса: впаять в стенки шайбы от петель ноутбука и смоделировать ножки.
В целом результатом я доволен. Расскажите в комментариях о своих клавиатурах и их доработках — очень интересно узнать о вашем опыте.
Anthropic показала, как ИИ самостоятельно создаёт научные модели
Глава Nvidia признался в романе с возможной китайской шпионкой
До 80 часов автономной работы: Bloody представила три беспроводные игровые гарнитуры
Apple сделает Siri ИИ-агентом
Акции Nvidia упали на 5% на фоне шпионского скандала вокруг Дженсена Хуанга
Anthropic потратит 3,4 млрд долларов на генераторы для дата-центров
Baikal-S стал резервной опорой суперкомпьютера МГУ: создана российская система хранения данных
Nvidia инвестирует в четыре технологические компании из Южной Кореи