skip to content
Архитектура в курилке
Dactyl

Mini Thumb Dactyl Manuform на rp2040: сборка и мини-обзор

/ чтиво на 14 минут

Содержание

TLDR

Оригинальный репозиторий

Форк QMK с нерабочим конфигом

Модели на Printables

Моя сборка

Мой конфиг

Введение

Я уже сравнительно давно упарываюсь в тему механических клавиатур. Начиналось все как всегда - китайщина с дешевыми кликающими свичами, от которых даже у соседей дрожали окна. Дальше были кастомные 80% (и в целом понимание, что значат все эти проценты), потом 60%1 платы, пайка, кастомные наборы, кастомные кейкапы…

В эту кроличью нору очень просто провалиться с головой, ведь выбор огромен, тем более сейчас. Производители наконец стали чаще делать 60% платы с отдельными стрелками (Nuphy - мои герои), стало много низкопрофильных клавиатур, а главное - они перестали стоить как крыло самолета!

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

Первым делом я решил заказать на Ali кит для пайки, тем более что давно хотелось собрать что-то эдакое. Этим китом стала Sofle V2.

Sofle

Отличная клавиатура, единственным ее минусом для меня была только ее толщина - хотелось что-то такое небольшое, чтобы брать с собой в офис или в поездки. Ибо после переучивания на слепой метод печати, особенно когда каждую половинку клавиатуры можно поставить как хочешь, хочется чего-то эдакого. Так я пришел к разработке и сборке собственной клавиатуры - Volucris.

Volucris

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

Каких-то рациональных причин для того, чтобы начать собирать Dactyl у меня не было. Просто было интересно начать новый проект, имея на руках достаточно свободных компонентов: свичи были, был свободный комплект кейкапов, которые очень хотелось куда-то заиспользовать, 3д-принтер ждал своей очереди.

И поэтому после недолгих поисков выбор пал на Dactyl Manuform, а точнее на ее модификацию - Mini Thumb.

Что за зверь

Dactyl Manuform

Dactyl Manuform - это достаточно известный форк более старой клавиатуры - Dactyl.

Она:

  • Параметрическая2 - в репозитории проекта лежит все, чтобы ее подправить под себя, но при этом
  • Раздельная - под каждую руку идет своя половинка, можно более эргономично расставить все на столе

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

  • Столбчатая - в противовес классическим клавиатурам, у этой столбцы никак не сдвинуты, а наоборот, располагаются так, чтобы пальцам было проще и быстрее находить нужные клавиши

У данного проекта довольно большое комьюнити, в частности мне очень помог репозиторий Awesome Dactyl. Почти на каждый вариант сборки там есть примеры и гайды. Так как я уже давно сижу на Sofle, то и старался подобрать вариант, у которого будет такая же (ну или хотя бы максимально близкая) раскладка.

Мой выбор пал на Mini Thumb.

Mini thumb

Сборка

В начале план был прост:

  • Качаем 3д-модели и печатаем

  • Распаиваем вручную свичи и диоды

  • Дружим все это с платой микроконтроллера и AUX разъемом

  • Прошиваем

  • PROFIT

Но все оказалось не совсем так просто.

Печать

Модели можно найти как на Printables, так и просто в самом репозитории3.

Вроде бы печатать всего ничего, всего по 2 детали, на каждую половину. Но, боже, сколько же там поддержек. Возможно, еще пришлось повозиться, потому что я решил выставить высоту слоя не на обычные 0.2 мм, а на 0.12, чтобы поверхность была приятнее на ощупь.

Printing

Оглядываясь назад, я бы порекомендовал не мучить себя и оставить классические 0.2 или вообще довести высоту слоя до 0.3. Где-то в обзорах я видел, что люди печатают так, потом красят/грунтуют. На самом деле не вижу в этом большого смысла, кроме как внешний вид и эстетика, потому что сама по себе клава не предполагает частого соприкасания с корпусом.

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

Пайка

Все с самого начала пошло не по плану.

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

Во-вторых, у меня под рукой только были ноунейм платы на базе rp2040, и я был уверен, что они по распиновке и по всему остальному будут идентичны привычным мне Pro Micro платкам. Ох, как же я ошибался.

Wiring 1

Как видно из фото выше, я начал с соединения столбцов. И вроде бы все просто, но отчего-то я решил, что надо к 3 столбцу приделать лишний свич. Это повлекло за собой проблемы еще с двумя столбцами, и это все потом пришлось резать и перепаивать. Но часы дебага это все равно не вернет.

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

Дальше оставалось присоединить это все к плате микроконтроллера. В моем распоряжении были пара ноунейм плат на базе rp2040, вроде таких:

MCU

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

Итоговая схема

Schematic

Для простоты приложу схему соединения строк/столбцов с платой микроконтроллера в каждой из частей:

Layout

А вот как это выглядит в моем случае:

Inside 1 Inside 2

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

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

На момент написания статьи основная версия QMK - 1.2.0, тогда как форк, который предоставлял автор mini-thumb делался порядка 5 лет назад, и у меня ничего так и не взлетело. Не придумав ничего умнее - начинаем делать свое.

Кастомный конфиг

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

И поэтому все делалось практически с нуля.

Что из себя представляет конфиг QMK? Это здоровенная папка, в которой каталогизированы сотни различных вариаций раскладок и клавиатур на любой вкус и цвет.

Одних только Dactyl-ей штук 10.

Dactyl QMK

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

За основу решил взять handwired/dactyl_manuform/5x6. Потому что он в целом больше всего подходил под описание того, что мне надо было, и там был конфиг, который хотя бы на текущей версии QMK пытался скомпилироваться.

Заранее убираем все упоминания подсветки - я ее не планировал делать, так что просто выпиливаем:

keyboard.json
"rgblight": {
"led_count": 12
},
"ws2812": {
"pin": "D3"
},

Первая попытка была проста - заменить камень, ведь это тоже было под atmega32u4:

keyboard.json
"processor": "atmega32u4",
"bootloader": "caterina",
"processor": "RP2040",
"bootloader": "rp2040",

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

Окей, с ногами проца разобрались, меняем:

keyboard.json
"matrix_pins": {
"cols": ["D4", "C6", "D7", "E6", "B4", "B5"],
"rows": ["F6", "F7", "B1", "B3", "B2", "B6"]
"rows": ["GP2", "GP22", "GP20", "GP23", "GP21"],
"cols": ["GP4", "GP5", "GP6", "GP7", "GP8", "GP9"]
},
"split": {
"enabled": true,
"serial": {
"pin": "D0"
"pin": "GP3"
}
},

Скомпилилось, но не хочет прошиваться, хотя все корректно, окей, гуглим дальше. Оказывается, что нужно указывать другой какой-то драйвер, чтобы все взлетело. Хорошо, подошел "driver": "vendor".

И это мы еще пропускаем все связанное с подбором правильных значений объекта "layouts", настройкой keymaps.c и геморроем вокруг пина GP26.

GP26

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

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

Оказалось, что на rp2040 чипах пины GP26, GP27, GP28 и GP29 - это ADC, то есть они не гарантируют нормальную работу как обычный GPIO пин. И стоило только перекинуть всю строку на GP2, как все заработало, как и надо.

Итоговый конфиг

keyboards/handwired/dactyl/5x6/keyboard.json
{
"keyboard_name": "Dactyl-Manuform (5x6)",
"manufacturer": "tshort",
"maintainer": "qmk",
"usb": {
"vid": "0x444D",
"pid": "0x3536",
"device_version": "0.0.1"
},
"features": {
"bootmagic": false,
"command": true,
"extrakey": true,
"mousekey": true,
"nkro": false
},
"qmk": {
"locking": {
"enabled": true,
"resync": true
}
},
"matrix_pins": {
"rows": ["GP2", "GP22", "GP20", "GP23", "GP21"],
"cols": ["GP4", "GP5", "GP6", "GP7", "GP8", "GP9"]
},
"diode_direction": "COL2ROW",
"split": {
"enabled": true,
"serial": {
"pin": "GP3",
"driver": "vendor"
}
},
"processor": "RP2040",
"bootloader": "rp2040",
"layouts": {
"LAYOUT_5x6": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [5, 0], "x": 9, "y": 0},
{"matrix": [5, 1], "x": 10, "y": 0},
{"matrix": [5, 2], "x": 11, "y": 0},
{"matrix": [5, 3], "x": 12, "y": 0},
{"matrix": [5, 4], "x": 13, "y": 0},
{"matrix": [5, 5], "x": 14, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1},
{"matrix": [1, 1], "x": 1, "y": 1},
{"matrix": [1, 2], "x": 2, "y": 1},
{"matrix": [1, 3], "x": 3, "y": 1},
{"matrix": [1, 4], "x": 4, "y": 1},
{"matrix": [1, 5], "x": 5, "y": 1},
{"matrix": [6, 0], "x": 9, "y": 1},
{"matrix": [6, 1], "x": 10, "y": 1},
{"matrix": [6, 2], "x": 11, "y": 1},
{"matrix": [6, 3], "x": 12, "y": 1},
{"matrix": [6, 4], "x": 13, "y": 1},
{"matrix": [6, 5], "x": 14, "y": 1},
{"matrix": [2, 0], "x": 0, "y": 2},
{"matrix": [2, 1], "x": 1, "y": 2},
{"matrix": [2, 2], "x": 2, "y": 2},
{"matrix": [2, 3], "x": 3, "y": 2},
{"matrix": [2, 4], "x": 4, "y": 2},
{"matrix": [2, 5], "x": 5, "y": 2},
{"matrix": [7, 0], "x": 9, "y": 2},
{"matrix": [7, 1], "x": 10, "y": 2},
{"matrix": [7, 2], "x": 11, "y": 2},
{"matrix": [7, 3], "x": 12, "y": 2},
{"matrix": [7, 4], "x": 13, "y": 2},
{"matrix": [7, 5], "x": 14, "y": 2},
{"matrix": [3, 0], "x": 0, "y": 3},
{"matrix": [3, 1], "x": 1, "y": 3},
{"matrix": [3, 2], "x": 2, "y": 3},
{"matrix": [3, 3], "x": 3, "y": 3},
{"matrix": [3, 4], "x": 4, "y": 3},
{"matrix": [3, 5], "x": 5, "y": 3},
{"matrix": [8, 0], "x": 9, "y": 3},
{"matrix": [8, 1], "x": 10, "y": 3},
{"matrix": [8, 2], "x": 11, "y": 3},
{"matrix": [8, 3], "x": 12, "y": 3},
{"matrix": [8, 4], "x": 13, "y": 3},
{"matrix": [8, 5], "x": 14, "y": 3},
{"matrix": [4, 1], "x": 1, "y": 4},
{"matrix": [4, 2], "x": 2, "y": 4},
{"matrix": [4, 3], "x": 3, "y": 4},
{"matrix": [4, 4], "x": 4, "y": 4},
{"matrix": [4, 5], "x": 5, "y": 4},
{"matrix": [9, 0], "x": 9, "y": 4},
{"matrix": [9, 1], "x": 9, "y": 4},
{"matrix": [9, 2], "x": 9, "y": 4},
{"matrix": [9, 3], "x": 10, "y": 4},
{"matrix": [9, 4], "x": 11, "y": 4}
]
}
}
}
keyboards/handwired/dactyl/5x6/keymaps/default/keymap.c
#include QMK_KEYBOARD_H
#define _QWERTY 0
#define _LOWER 1
#define _RAISE 2
#define RAISE MO(_RAISE)
#define LOWER MO(_LOWER)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = LAYOUT_5x6(
KC_ESC , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_BSPC,
KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_BSLS,
KC_LSFT , KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT,
KC_LCTL , KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_DEL ,
KC_LCTL, KC_LALT, KC_LGUI, KC_SPACE, KC_LSFT, KC_ENT , LOWER , RAISE , KC_4 , KC_5
),
[_LOWER] = LAYOUT_5x6(
KC_GRAVE, _______, _______, _______, _______, _______ , _______, _______, _______, _______, KC_MINS, KC_EQUAL,
_______ , _______, _______, _______, _______, _______ , _______, _______, KC_UP, _______, KC_LBRC, KC_RBRC ,
_______ , _______, _______, _______, _______, _______ , _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______ ,
_______ , _______, _______, _______, _______, _______ , _______, _______, _______, _______, _______, _______ ,
_______, _______, _______, _______ , _______, _______, _______, _______, _______, _______
),
[_RAISE] = LAYOUT_5x6(
KC_MUTE , KC_VOLD, KC_VOLU, _______, KC_BRID, KC_BRIU , _______, _______, _______, _______, _______, _______,
_______ , _______, _______, MS_WHLU, _______, _______ , _______, MS_BTN1, MS_UP , MS_BTN2, MS_BTN3, _______,
_______ , _______, MS_WHLL, MS_WHLD, MS_WHLR, _______ , _______, MS_LEFT, MS_DOWN, MS_RGHT, _______, _______,
_______ , _______, _______, _______, _______, _______ , _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______ , _______, _______, _______, _______, _______, _______
),
};

Просто заменяете файлы в соответствующих папках QMK и запускаете команду:

Terminal window
qmk flash -kb handwired/dactyl_manuform/5x6 -km default

VIA/VIAL

VIAL

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

Фича просто взрывная, особенно когда надо поменять разом кучу клавиш или настроить tap-dance4 или что-то вроде этого.

На данный момент это не готово, но в следующий раз обязательно займемся.

Обзор

То, как у меня назначены клавиши, можно посмотреть в секции итоговый конфиг.

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

Эргономика

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

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

Раскладка

В основном я работаю на Mac, поэтому большая часть спец клавиш рассчитана именно под Mac. Так, на большом пальце левой руки у меня (слева направо): CMD, Space и Shift.

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

На правой руке под большой палец в основном идет только перескок на 15 и на 2 слои, и, соответственно, Enter.

По ощущениям, я очень мало задействую слои: так, на первом слое у меня только ` и стрелки, а на втором слое только эмуляция мыши, потому что иногда просто безумно удобно не перескакивать на мышь, а просто и быстро что-то выбрать при помощи курсора, но клавой. Есть ощущение, что что-то вроде Charybdis с трекболом под правую руку должно крайне зайти. И кнопки под правую руку я так нормально ни подо что и не задействовал.

Пока я еще не заюзал никакие приколы с комбо-клавишами или еще чем-то (как это у меня висит на Shift на Volucris - безумно удобно, когда можно включить двойным тапом Caps Lock, а потом так же просто его и вырубить), поэтому на этот счет я ничего сказать не могу, но планирую еще поковырять.

QMK

Сравнить могу исключительно с ZMK, потому что предыдущие две мои сплит клавы именно на ней.

Настройка и эмуляция мыши на QMK по какой-то причине куда приятнее и удобнее, чем на ZMK. Почему-то на ZMK по умолчанию движения мышью не так плавны и нет ускорения, в отличие от QMK.

При всем при этом, сперва решение ZMK держать все в гите, а сборку прошивки реализовывать в GitHub Actions выглядит, мягко говоря, сомнительно. Но начинаешь привыкать к штукам вроде keymap editor, и их прям не хватает в QMK. Подбешивает, что все надо делать руками. Хотя VIA выглядит как полноценное решение проблемы.

Вердикт

Mini Thumb Dactyl - одна из самых замороченных и удобных клавиатур, которыми я когда-либо пользовался. QMK поверх rp2040 камня показывает себя великолепно, просто прошивается, не пришлось тащить и дебажить тонны зависимостей.

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

Берегите себя и своих близких.

Сноски

  1. Если Вам кажется, что я начал говорить на древнешумерском, то Вам, скорее всего, не кажется

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

  3. Для удобства работы с 3д-моделями и GitHub можно воспользоваться моим расширением: Chrome и Firefox

  4. tap-dance - это одна из фичей современных прошивок, вроде QMK или ZMK, чтобы при определенных комбинациях нажатий клавиш делать что-то, что при обычных обстоятельствах не работает на обычных клавиатурах. Например, при двойном нажатии на Shift включается Caps lock и наоборот.

  5. Основной слой я считаю нулевым, дальше идет первый, второй и так далее.