Зачем?
Работаю бекэнд разработчиком в оптово‑розничном онлайн‑ритейлере непродовольственных товаров с собственной IT‑инфраструктурой (участвую в разработке и поддержке внутренних корпоративных систем).
И т.к. большую часть времени провожу за компьютером, то чаще чем рядовой пользователь покупал и менял клавиатуры, пытаясь найти «ту самую» по удобству (определенный топ для себя я конечно же сформировал — будет ниже).
Первоначально это были грамозкие полноформатные мембранки и механики от совершенно разных производителей.
Потом их заменила 60-75% оптика и низкопрофильная механика NuPhy и Keychron.
В какой-то момент мне попалась статья про ортолинейные раздельные (сплит) клавиатуры и их преимущества перед обычными клавиатурами (на тот момент я использовал Keychron на низкопрофильных оптических свичах), да и в целом о пользе для запястий.
Уже тогда (1-2 года назад) их было огромное количество всяких разновидностей, поэтому пришлось провести некий "research" чтобы определиться с выбором размерности, модели, прошивки и прочей функциональности.
И тут, как говорится — понеслось...
Просто купи готовую
После небольшого анализа полученной в результате поисков информации, остановил свой выбор на Sofle Choc клавиатуре на прошивке ZMK (ОС Zephyr) из-за приоритета беспроводных возможностей подключения и простоты конфигурации.

Вот такую я хотел приобрести (Sofle Choc): по моему мнению, она удовлетворяла бы всем моим потребностям — линейный энкодер, 5-ти позиционная кнопка (описывалась как быстрая замена мышки) и рефлективные дисплеи.
Но магазин в Китае в котором я заказывал сплит клавиатуру, решил иначе и прислал мне не Sofle Choc а другую, похожую (не 4 колоночную, а 3-х) — это была популярная в Азии Corne.

Китаец прислал Corne Choc с комментарием «она тоже хорошая»:‑)
К слову, эта Corne Choc стоила дороже, но пришла в разобранном виде (сама плата уже спаянная, корпус и отдельно АКБ) — собирал воедино уже самостоятельно, попутно собирая информацию о начинке.
Ну и сразу же выяснились нюансы. Например, что 5-ти позиционной кнопкой (справа) невозможно было пользоваться не держа правую клавиатуру двумя руками или что линейный энкодер (слева) имел малое количество точек и его надо было неслабо так крутить (можно было подправить в конфиге, но все же).

Именно в этот момент у меня закралась мысль, «а не собрать ли клавиатуру самому?». К тому же, я наткнулся на DIY PCB набор (все нужно было собирать и паять самому) именно Sofle Choc клавиатуры.
Но с DIY набором была одна проблема — не было нормальных корпусов. Те что продавались — это просто акриловый тонкий лист с вырезами под стойки и вся «начинка» у них была в открытом доступе.
Окей, гугл - Как создать корпус?
Посмотрев на корпус, который прислали с Corne, было понятно, что он не литой а напечатанный на 3д-принтере.
А почему бы и "да", подумал я и одновременно с PCB платой заказал и недорогой 3-д принтер (радикальненько, да, не спорю :-) ).

К моменту пока ждал доставки PCB плат Sofle клавиатур, успел натренироваться в проектировании и печати мелких моделей во FreeCad.

Так что когда платы были у меня, я сразу же приступил к проектированию корпуса (да, я видел, что есть уже готовые корпуса, но многие из них не подходили по размеру платы (v1 отличались от v2), да и в целом меня не устраивали уже готовые корпуса которые я находил для печати).

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

Для самих клавиш докупил низкопрофильные колпачки (Tai-Hao low-profile keycaps).
Пока проектировал и паял, выписывал требования для клавиатуры которую я бы хотел иметь на своем столе и получал удовольствие от того что получилось в промежуточном варианте.

Отдельно я докупил два рефлективных дисплея NiceView. Их преимущество перед обычным OLED (который шел в DIY комплекте) в том, что в активном режиме он потребляет очень малое количество энергии - что-то около 10 микроампер, что в 20 тысяч раз меньше потребления OLED дисплея (примерно 20 mA). Это как раз и есть преимущество рефлективной технологии - яркий свет (лампа сверху монитора, например) используется вместо нижней подсветки дисплея, обеспечивая хорошую читаемость.
Как засунуть мышку в клавиатуру?
Небольшая зарисовочка: примерно 30% времени я работаю на ноутбуке, остальное время за широкоформатном 34 дюймовым монитором и когда я пересаживался к монитору, мне хотелось избавиться от мышки - иметь управление мышью в самой клавиатуре, чтобы рука не летала по столу как прокаженная за мышкой и обратно к клавиатуре.
Начал поиск с банально готовых DIY решений, с уже написанным драйвером для ZMK - чтобы впаял и сразу можно было пользоваться. Но нашел только кучу информацию о трекболах (шаров).
В ру сегменте, пожалуй самый известный любитель этих самых шаров Ergosplits.

Шары мне не понравились с самого начала — занимают кучу места, не функциональны (нет жестов, только считывание движения курсора), механика (подшипники под шар требуют обслуживания) и пожалуй самое главное — это цена. Забегая немного вперед, за цену хорошей сборки трекбола можно было купить штук 10 тачпадов которые я по итогу и выбрал:‑)
Дальше уже искал исключительно информацию о поддержке тачпадов и ZMK. И нашел сначала Cirque — есть и драйвера готовые и инструкции по пайке вместо дисплея.

Вот пример уже готовой реализации Cirque с Corne вместе с корпусом.
Но Cirque мне тоже не понравился — нет поддержки жестов и то что он круглый:‑)
Поняв, что инфо поле по абстрактной ZMK уже исчерпало себя, опустился на слой ниже — Zephyr ОС. Начал изучать информацию о поддерживаемых контроллерах тачпада для Zephyr.
И снова бинго! Нашел упоминание о контроллерах iqs5xx и Azoteq. Но почти не было информации о драйверах для ZMK и как тачпад заставить работать с клавиатурой. Поэтому просто заказал в местном магазине электроники Cirque (двух размеров) и Azoteq Tps43 и 65 (тоже двух размеров) — в расчете, что если не смогу подружить Azoteq c клавиатурой, то c Cirque уж точно получится.
Пока тачпады были в доставке, проектировал несколько версий корпусов под работу с тачпадом.
Изначально задумка была такая что тачпад будет как беспроводной\проводной донгл (центральное устройство), а половинки клавиатур, как периферийные устройства.
В рамках ZMK «центральное» устройство выступает в роли главного для передачи информации к ПК, а «периферийное» шлет информацию исключительно на «центральное».
Донгл планировалось магнитами крепить либо к правой, либо к левой половинке. Но из минусов — на столе появлялось бы новое устройство с АКБ которую, хоть и не так часто, но тоже нужно заряжать.
От этой идеи я быстро отказался в силу ее не состоятельности — сам тачпад почти всегда будет прикреплен к одной из половинок, следовательно, какой смысл в утилизации ресурсов дополнительного контроллера и АКБ?!
Рассматривал так же с реализацией без АКБ (как magsafe на ноутбуке) с магнитными коннекторами через прерывания, но по итогу пришел к выводу что проще просто разместить в одной из половин. К тому же сама форма корпуса клавиатуры в таком случае, будет меньше.

Когда определился где уже будет тачпад, то начал экспериментировать с его расположением - это мега важно, иначе пальцы начинают быстро уставать (это я понял пока тестировал его работу с первыми вариантами корпуса. Тот что зеленый снизу).

Всего было сделано около 5 корпусов и черный на фото сверху был финальной версией.
Т.к. написанный драйвер считывал относительные координаты и жесты, то можно было поставить тачпад размером как 43 мм так и 65 мм. И чтобы определиться с выбором размера тачпада (учитывал при проектировании корпуса с самого начала), я сделал проще - на тачпад ноутбука наклеил скотч, закрасил его маркером и просто продолжил пользоваться ноутбуком. А после уже замерил примерное получившиеся окно (около 45 мм).
Тем самым был выбрал Azoteq TPS43 (40x43) - небольшой тачпад, который полностью удовлетворял всем потребностям.
Прошивка и драйвер тачпада
Пожалуй самое сложное для меня было написание прошивки для тачпада, т.к. из-за своей невнимательности (возможно сказывалась усталось и то, что занимался написанием в основном ночью) упускал самые важные этапы конфигурации описанные в документации.
Например, пропустил момент, что после записи конфигурационных регистров в тачпаде, нужно записать бит в ячейку памяти SETUP_COMPLETE, чтобы дать понять контроллеру тачпада что он готов к работе... На выяснения этого я потратил несколько дней - от проверки сигнальных пинов на осцилографе и конфигурации самих пинов, до полного перечитывания документации (где в прочем и нашел ответ).
Не буду душнить кодом драйвера на тачпад. Кому интересно, могут посмотреть в моем репозитории на GitHub (драйвер для Azoteq тачпада)
Постарался максимально документировать каждую функцию комментариями.
К слову, у всех просто прекрасные документации:
ZMK (https://zmk.dev/docs)
Azoteq (https://www.azoteq.com/images/stories/pdf/iqs5xx-b000_trackpad_datasheet.pdf)
При работе с тачпадом еще столкнулся с тем, что он довольно "прожорлив" (сами по себе iqs5xx контроллеры на самом деле позиционируются как низкопотребляемые, наверное так оно и есть. В доке так написано)) ) - тачпад в активном режиме потребляет около 2 мА и при емкости АКБ 1000 mA (вместе с дисплеем и контролером), заряда хватало примерно на 11 дней (с учетом выключенной RGB подсветки).
Поэтому я доработал драйвер еще и дописал режим сна - контроллер тачпада уходит в сон после 1 минуты неактивности (значение конфигурируемое и его можно изменить).
В режиме сна потребление уже заметно ниже (примерно на уровне NiceView дисплея) - около 20 микроАмпер. Это в разу продлевало жизнь клавиатуре.
Небольшая ремарка: я не проверял мультиметром, но судя по логам при отладке и доке на контроллер iqs5xx тачпада TPS43 \ TPS65 именно так и должно быть.
Но самое главное - это быстрая активация из режима сна и полная поддержка тачпада на абсолютно всех устройствах (проверено на Linux(Fedora, Ubuntu), MacOS и Android c iOS (телефоны, планшеты)).
ZMK на контроллерах nice_nano v2 (или аналогах pro_micro) очень шустро переключается по устройствам (по блютуз). Что меня лишь порадовало.
В моей реализации, драйвер тачпада поддерживает клики (левую правую, как на любых ноутбучных тачпадах), удержание (Drag & Drop), скролы, свайпы. Можно было еще добавить и зум, но я не припомню момента когда я им пользовался (не на клавиатуре, а именно на тачпаде).
Про ZMK
Само написание прошивок для ZMK довольно простое из-за модульной архитектуры.
Для стандартной клавиатуры достаточно настроить конфигурации через .keymap и .conf файлы, в build указать готовые конфигурации shield (например, Sofle) и board (например, nice_nano или его аналог pro_micro) и можно запускать сборщик.
Shield и Board ищутся в списке устройств ZMK (device tree), которые подтягиваются из основной библиотеки устройств в репозитории ZMK. И если указаны свои .keymap, .conf и .overlay файлы, то сборщик переопределяет на указанную конфигурацию.
Сам сборщик прошивок можно запустить как через GitHub Actions, так и локально через West (Zephyr toolchain).
Для кастомных клавиатур лучше запускать сборщик локально, т.к. это будет в разы быстрее.
В моем репозитории на клавиатуру (Прошивка для клавиатуры), я прописал удобные
makeкоманды и можно установить все необходимые зависимости для работы с west сборщиком всего за две команды:make startиsource ./env_activate.sh.
Драйвер (на тачпад в моем случае) пишется на Си с указанием конфигурации и "волшебного слова" compatible в .yml файлах для сборщика, которое должно также указываться в .overlay там где этот драйвер будет использоваться (не забыв указать репозиторий этого драйвера в west.yml чтобы сборщик подтянул необходимые файлы драйвера).
Слои в ZMK
Одно из преимуществ сплит клавиатур - это слои (помимо комбо, макросов и тап-холдов).
Их смысл в том, что можно вынести необходимую функциональность на удобный слой.
Помимо этого я активно использую комбо - для программиста самый топ, как по мне. Например, если одновременно нажать [F] + [G] то будет напечатан символ [ и т.д.

На слое raise разместил управление буфером и клавиши для управления позиционированием курсора (клавиши PgUp, PgDown, Home и End очень недооценены).
Под себя можно настроить почти все - в том числе и поведение по длительности нажатий (например, при зажатой [F] более 300 мс, активировать модификатор нажатия Shift).
Сборка прекрасного
Корпус, платы, драйвер и прошивка были готовы - оставалось лишь сборка и отладка.

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

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

Из-за большой крутилки энкодера, на удивление, им стало удобнее пользоваться - можно было управлять одним большим пальцем левой руки.
Для фанатов бенчмарков
Для начала назову мой ТОП-3 клавиатур на данный момент:
MacBook — это прям самый топ по удобству для меня (жаль что сами отдельные клавиатуры от Apple получились не очень)
Моя сплит клавиатура (Stelmakh Keyboard) — тачпад с клавиатурой это просто песня (если не за ноутбуком, пользуюсь именно этой клавиатурой)
Keychron K3 — старушка кейхрон еще с предзаказа на кикстартере (когда‑то была моей самой любимой)
Тест наскорость печати по трем клавиатурам (WPM — слов в минуту):
MacBook — 50 WPM;
Stelmakh Keyboard — 35 WPM;
Keychron K3 — 44 WPM.
Ну, вполне ожидаемо, что скорость печати на ортолинейной клавиатуре будет ниже. Правда в работе это не доставляет какой‑либо дискомфорт.
Про деньги
Если подводить итог с финансовой стороны только по клавиатуре то примерная стоимость будет такая:
DIY набор c PCB платами — 3.250 р
2-а АКБ (LP403450) — 2 х 350 р
Тачпад Azoteq TPS-43 — 1.000 р
2-а дисплея NiceView — 2 х 1.500 р
Демпфер силиконовый 10 мм (ножки) — 150 р
Набор стоек (3.5×2х3) и болтов (2×4) — 1.000 р
Печать корпуса — 1.000 р катушка PLA‑пластика (или около 2–4 тыс. если печать в сервисе 3д)
Итого: от 10.100 р.
Но это без учета разных расходников для пайки, разных энкодеров и тачпадов для теста (и без самого 3-д принтера :-) )
Если у вас есть тот, кто за небольшую сумму может вам все это спаять, то, думаю, в 15 тыс. можно уложиться в полностью готовую клавиатуру.
Итоги и планы
Стоило ли это того, не взирая на стоимость и потраченного времени (несколько месяцев)?
Как по мне, да, безусловно! Было интересно создавать устройство под себя и особенно конструировать корпус под него.
Изначально я начал проектировать PCB плату, чтобы без пайки проводами можно было бы использовать 0.5 flex 5 и 6 пиновые коннекторы (гибкие такие кабели) и чтобы можно было задействовать дополнительные 3 пина на контроллере nice_nano для включения работы RGB подсветки (из‑за тачпада и дисплея, я задействовал все пины какие только доступны с pcb платы).
Одно лишь это позволило бы снизить площадку (где энкодер и тачпад) до высоты самих клавиш — 1.9 см. Сейчас площадка чуть выше — 2.4 см.
Но на этой клавиатуре я так и не пользовался RGB подсветкой еще до установки тачпада и посчитав издержки (нужно было заказывать 5 PCB плат минимум), заморозил проект и пока не планирую его завершение - данный сетап клавиатуры меня полностью устраивает.

Возможно я и передумаю, доделаю схему PCB и доработаю корпус как под готовый продукт, если наберется достаточное количество желающих собрать себе что-то подобное.
Сейчас же я сконцентрировался на другом проекте — начал собирать домашний мини‑сервер и хочу разместить там git хранилище для своих проектов.
Хорошо, что успел закупиться комплектующими и DDR4 ECC памятью еще до этого безобразия с ценами.
Дело в том, что пока я писал драйвер для тачпада, пытался использовать ИИ (не важно даже какой, +‑ они все давали одинаково хреновый ответ) и благодаря малой выборке, мне даже удалось найти источники его «вдохновения» — около 5 репозиториев с драйвером для тачпада ZMK из которые 4 полностью не рабочие.
Я сделал для себя вывод, что хочу делиться знаниями с людьми, а не с корпорациями по подписке за 20$. Поэтому следующий проект — свой сервер и личное git хранилище (например, GitTea).
Репозитории и документация
Продублирую здесь, чтобы вам не пришлось искать ссылки по статье.
Все схемы для печати корпусов выложу в репозитории с прошивкой к клавиатуре.
Документация:
ZMK (https://zmk.dev/docs)
Azoteq (https://www.azoteq.com/images/stories/pdf/iqs5xx-b000_trackpad_datasheet.pdf)
P.S. Вроде не упустил ничего важного, что хотел сказать, но если у вас возникли вопросы, задавайте его в комментариях или пишите мне в личку в телеграм. Постараюсь дать развернутый ответ.
