Зачем?

Работаю бекэнд разработчиком в оптово‑розничном онлайн‑ритейлере непродовольственных товаров с собственной IT‑инфраструктурой (участвую в разработке и поддержке внутренних корпоративных систем).

И т.к. большую часть времени провожу за компьютером, то чаще чем рядовой пользователь покупал и менял клавиатуры, пытаясь найти «ту самую» по удобству (определенный топ для себя я конечно же сформировал — будет ниже).

Первоначально это были грамозкие полноформатные мембранки и механики от совершенно разных производителей.

Потом их заменила 60-75% оптика и низкопрофильная механика NuPhy и Keychron.

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

Уже тогда (1-2 года назад) их было огромное количество всяких разновидностей, поэтому пришлось провести некий "research" чтобы определиться с выбором размерности, модели, прошивки и прочей функциональности.

И тут, как говорится — понеслось...

Просто купи готовую

После небольшого анализа полученной в результате поисков информации, остановил свой выбор на Sofle Choc клавиатуре на прошивке ZMK (ОС Zephyr) из-за приоритета беспроводных возможностей подключения и простоты конфигурации.

Sofle v1 Choc
Sofle v1 Choc

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

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

На самом деле Corne вполне достойная клавиатура, но я испытывал острую нехватку колонки с цифрами.
На самом деле Corne вполне достойная клавиатура, но я испытывал острую нехватку колонки с цифрами.

Китаец прислал Corne Choc с комментарием «она тоже хорошая»:‑)

К слову, эта Corne Choc стоила дороже, но пришла в разобранном виде (сама плата уже спаянная, корпус и отдельно АКБ) — собирал воедино уже самостоятельно, попутно собирая информацию о начинке.

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

Пришла разобранная. Благо паять ничего не пришлось...
Пришла разобранная. Благо паять ничего не пришлось...

Именно в этот момент у меня закралась мысль, «а не собрать ли клавиатуру самому?». К тому же, я наткнулся на DIY PCB набор (все нужно было собирать и паять самому) именно Sofle Choc клавиатуры.

Но с DIY набором была одна проблема — не было нормальных корпусов. Те что продавались — это просто акриловый тонкий лист с вырезами под стойки и вся «начинка» у них была в открытом доступе.

Окей, гугл - Как создать корпус?

Посмотрев на корпус, который прислали с Corne, было понятно, что он не литой а напечатанный на 3д-принтере.

А почему бы и "да", подумал я и одновременно с PCB платой заказал и недорогой 3-д принтер (радикальненько, да, не спорю :-) ).

Новенький Anycubic. Не знал какой выбрал, поэтому выбирал по отзывам и средней цене ;)
Новенький Anycubic. Не знал какой выбрал, поэтому выбирал по отзывам и средней цене ;)

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

Это уже итоговая итерация корпуса. После месяца работы.
Это уже итоговая итерация корпуса. После месяца работы.

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

Опыт в smd пайке имелся, так что это для меня оказалось нечто вроде медитации
Опыт в smd пайке имелся, так что это для меня оказалось нечто вроде медитации

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

Сборка воедино и проверка всех клавиш после прошивки
Сборка воедино и проверка всех клавиш после прошивки

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

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

Промежуточный вариант с Niceview дисплеями
Промежуточный вариант с Niceview дисплеями

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

Как засунуть мышку в клавиатуру?

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

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

В ру сегменте, пожалуй самый известный любитель этих самых шаров Ergosplits.

Sofle клавиатура с шаром уже называется Keyball
Sofle клавиатура с шаром уже называется Keyball

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

Дальше уже искал исключительно информацию о поддержке тачпадов и ZMK. И нашел сначала Cirque — есть и драйвера готовые и инструкции по пайке вместо дисплея.

Corne Cirque - тут заморачиваться не стали. Просто убрали дисплей и поставили тачпад вместо него без RST пина
Corne Cirque - тут заморачиваться не стали. Просто убрали дисплей и поставили тачпад вместо него без RST пина

Вот пример уже готовой реализации 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 тачпада)
Постарался максимально документировать каждую функцию комментариями.

К слову, у всех просто прекрасные документации:

При работе с тачпадом еще столкнулся с тем, что он довольно "прожорлив" (сами по себе 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).

Репозитории и документация

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

Все схемы для печати корпусов выложу в репозитории с прошивкой к клавиатуре.

Документация:


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