Введение
Всем привет.
Давно хотел клавиатуру под себя, но даже в кастомных механиках мне не хватало кастомности. Смены цвета кнопок или звука переключателей было недостаточно. Поэтому я собрал клавиатуру с нуля. Кстати, весь текст набран на ней.
Фантазии и реальность
У меня уже сто лет как изогнутые клавиатуры. Поэтому пальцы давно привыкли к разделению клавиш на два блока левый и правый и к тому, что блоки расположены под небольшим углом друг к другу. Хотелось того же но побольше, т.е. разнести руки ещё дальше и сделать сплит - когда клавиатура состоит из двух независимых половин.
Проводов тоже хотелось минимум. Проводной сплит подразумевает два провода - один от компа и один между половинками. Два что-то многовато, один - уже получше, но всё ещё слишком много. Вот ноль меня полностью устраивает.
Также клавиш хочется поменьше, чтобы клаву можно было с собой таскать. Но с другой стороны сохранить весь функционал.
В общем программа максимум: беспроводной сплит клавиш на 40-50, без светодиодов.
Реальность такова, что беспроводность тянет за собой аккумуляторы и необходимость разбираться с сопряжением и половин между собой и с компом. Я решил пока не ходить далеко в лес и ограничиться проводным монолитом.
Комплектующие
Всё железо покупал на Алиэкспрессе:
В качестве мозга выбрал Raspberry Pi Pico, он доступен по цене и в интернете полно мануалов по сборке на нём клавиатур,
Свичи (переключатели) Gateron полноразмерные коричневые,
Кейкапы (кнопки) чёрные из ABS пластика,
Диоды 1N4148, подробнее о них позже.
Много энтузиазма и немного времени по вечерам.
Лэйаут. Распределение клавиш
Этот этап пережил больше всего итераций и оказался самым трудоёмким. Уже всё собрав и закодив, я несколько раз менял назначения многих клавиш. Тут же опишу уже финальный результат.
Чтобы уменьшить размеры и сохранить функционал умные люди используют слои, когда на одной кнопке висит несколько действий в зависимости от кнопки модификатора. Все мы пользуемся слоями, даже не зная об этом. Зажимая например Shift - буквы становятся большими, а цифры выдают знаки препинания. На ноутбуках кнопка Fn тоже переопределяет некоторые клавиши. Вооружившись этим знанием я начал мержить (объединять) клавиши.
Отделение агнцев от козлищ
Альфы
Все, кто сам является модификатором, должны быть доступны всегда, это Ctrl, Shift, Alt. Сюда же суперважные Esc, Tab, Win, Enter, BackSpace, а также кнопки направлений. Царь всея клавы пробел будет дублироваться и на правой и на левой половине.
Вся латиница и кириллица мне нужны без модификаторов, чтобы не печатать аккордами. По пути узнал, что стенографисты как раз печатают аккордами на 28-ми клавишной клавиатуре, выглядит как магия, но это совсем другая история. В общем, буквы не трогаю и оставляю их на своих местах, чтобы сохранить годами наработанный автоматизм набора текста.
Неприкасаемые
Без сожалений выбрасываю правые Ctrl, Alt, Shift, а также ScrLock, Pause (последний раз пользовался ею под DOS) и CapsLock (гневные сообщения буду писать с зажатым Shift). Это минус 6 кнопок.
Беты
На укороченных и ноутбучных клавиатурах отсутствует Num блок, который похож на калькулятор. Казалось бы первый кандидат на удаление. Но в блендере Num блок переключает вид, что суперудобно и быстро. Казнить нельзя, помилую и помещу их на левую половину в той же конфигурации что и в обычной клавиатуре, ибо привычка. Сюда же поместятся и плюс, минус, ноль, умножить и точка. На левую половину потому что удобно переключать виды левой рукой не отрывая правой от мыши. Минус 15 клавиш.
Второй претендент F1-F12. Тоже бесполезные кнопки, занимающие целый верхний ряд. Однако: закрыть приложение Alt-F4, переименовать F2, обновить окно F5, полноэкранный режим F11. Часто они нужны, придётся тоже сохранить. Они отправятся под правую руку. Это ещё минус 12 кнопок и очистили верхний ряд.
Следом идут цифровые клавиши 1..0 и -+. И они занимают целый ряд. Переселяем их в левую половину аналогично Num блоку. Это ещё минус 12 кнопок и минус один ряд.
Гаммы и омежки
Home, End, PageUp и PageDown удобны для навигации в коде и браузере. Вешаю их на соотв. кнопки направлений: лево, право, верх, вниз с модификатором Fn.
Del чрезвычайно важен (когда-то я отказался от минимаковской клавы ибо там не было Del). Вешаю поверх BackSpace
Insert товарищ редкий, но полезный. Вешаю его на Enter.
PrintScreen прекрасен, перегружаю им левый пробел.
Главная литера кириллицы Ё перегружает Esc.
Итого 48 клавиш. Прекрасный результат, работаем дальше.
Корпус
Корпус можно было бы напечатать на 3D принтере, но хотелось чего-то более душевного. Поэтому он будет сделан из берёзовой фанеры.
Чтобы определиться с положением клавиш и формой корпуса я сделал пару картонных макетов. Начинил их свичами и побегал пальцами. По самому удачному макету сделал модель в блендере, чтобы осмотреть её со всех сторон и убедиться что всё влезает. На этом этапе обнаружилось свободное место в центральной части корпуса слева и справа от контроллера. Я вставил туда ещё две кнопки про запас. Теперь их 50.
Потом я перечертил модель в LibreCad (бесплатный аналог автокада) и отправил чертёж моему хорошему товарищу, который занимается лазерной резкой фанеры.
Как из конструктора склеил нужные детали столярным ПВА. Получилось две части: нижняя коробка и верхняя крышка с отверстиями под свичи. Затем покрывал их акриловым лаком в три слоя. Давал каждому слою сутки просохнуть и зашлифовывал наждачкой зерном 120, 240 и 1000. Акриловый лак нетоксичен и не имеет запаха, поэтому сушить можно в жилом помещении.
Для скрепления половин взял анодированные чёрные болты M4 под внутренний шестигранник. Они отлично подошли к деревянному корпусу и чёрным кейкапам.
От скольжения корпус посадил на силиконовые полоски. Забавно что сделаны они из игрушек, что выдавали в продуктовом магазине.
Монтаж и пайка
Я обошёлся без печатной платы и делал навесной монтаж. Запах канифоли обожаю с детства, а керамический паяльник, флюс и пинцет превращают пайку в эстетическое удовольствие. Провода мне любезно предоставил распущенный интернет кабель.
У контроллера 26 ног, а клавиш 50. Как же их подружить? Оказывается подключаются кнопки матрицей или таблицей, где кнопка - узел или ячейка матрицы, на столбцы подаётся сигнал, а со строк он снимается. У меня 50 кнопок. 48 из них помещаются в матрицу 8x6, ещё две в один столбец. Итого матрица 9x6, а это 9 + 6 = 15 ног из 26 доступных. Ещё потомкам останется.
Есть нюанс: если замкнуть какой-то столбец на строку, а потом замкнуть ещё один на ту же строку, то мы получим замыкание столбцов. А это ложные срабатывания или маскировка одних кнопок другими, что безобразие. Этому городу нужен герой и тут на сцену выходят диоды. Они не дают току течь обратно со строк в столбцы. Лайфхак: ноги у диодов длинные, так что я делал строки просто спаивая диодам ноги.
Сперва я распаял матрицы для обеих половин, а потом уже столбцы и строки паял к любым свободным ногам контроллера. А потом перепаял половину, ибо сперва сделал матрицу 13x4, а её было оч неудобно описывать в коде.
Код
Этот этап меня пугал больше всего. Ведь нужно будет разобраться в строении чипа, как он опрашивает кнопки, как формирует сигнал на комп, каким протоколом оборачивает и проч и проч и проч. Но оказалось, что все эти вопросы давно порешали энтузиасты и делятся своими трудами в открытом доступе.
Самый простой путь оказалось использовать инструмент с сайта http://kmkfw.io/. Он позволяет настраивать клавиатуру просто меняя текст в блокноте. Никакой сторонний софт ставить не надо. Сам управляющий скрипт написан на пайтоне.
Здесь есть пошаговая инструкция http://kmkfw.io/docs/Getting_Started. На русском она звучит примерно так:
С оф сайта Raspberry скачай CircuitPython вот здесь https://circuitpython.org/board/raspberry_pi_pico/
Удерживая кнопку Boot на плате PiPico подключи usb кабель. Устройство определится как флешка.
Скопируй скачанный .UF2 файл на эту "флешку"
Отключи usb кабель и подсоедини обратно через пару минут. Он обнаружится как CURCUITPY.
Скачай последнюю версию KMK с гитхаба https://github.com/KMKfw/kmk_firmware/archive/refs/heads/master.zip
Из архива скопируй папку KMK и boot.py в корень "флешки".
Также в корне создай или скопируй из примера файл code.py, сюда и нужно будет писать свой код.
На этом сайте есть подробная документация по KMK инструменту. Там есть и про сплиты и беспроводное подключение и трекбол и куча всего интересного. Полезно будет всё хотя бы пробежать глазами. Мне нужны были только страницы про слои и таблица с кодами клавиш.
По программе: нужно указать кол-во столбцов и строк матрицы клавиш (На этом этапе я перепаял половину клавиш, чтобы они удобнее умещались в таблицу). А потом массивом перечислить коды кнопок http://kmkfw.io/docs/keycodes/. Очень важно не забывать сдабривать массивы запятыми после каждого элемента, и после последнего тоже, или почитать как в пайтоне описываются массивы.
Финальный код файла Code.py
print("Starting")
import board
from kmk.kmk_keyboard import KMKKeyboard
from kmk.keys import KC
from kmk.scanners import DiodeOrientation
from kmk.modules.layers import Layers
keyboard = KMKKeyboard()
# Layers
keyboard.modules.append(Layers())
FN = KC.MO(1)
FS = KC.MO(2)
keyboard.col_pins = (
board.GP0, board.GP1, board.GP2, board.GP3, board.GP4, board.GP5,)
keyboard.row_pins = (
board.GP10, board.GP11, board.GP12, board.GP13, # Left Side
board.GP21, board.GP20, board.GP19, board.GP18,) # Right Side
keyboard.diode_orientation = DiodeOrientation.COL2ROW
keyboard.keymap = [
# Base layer
[
# Left Side
KC.ESC, KC.Q, KC.W, KC.E, KC.R, KC.T,
KC.TAB, KC.A, KC.S, KC.D, KC.F, KC.G,
KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B,
KC.LCTL, KC.LWIN, FS, KC.LALT, FN, KC.SPC,
# Right Side
KC.Y, KC.U, KC.I, KC.O, KC.P, KC.BSPACE,
KC.H, KC.J, KC.K, KC.L, KC.SCLN, KC.QUOT,
KC.N, KC.M, KC.COMMA, KC.DOT, KC.UP, KC.ENT,
KC.SPC, FN, KC.SLSH, KC.LEFT, KC.DOWN, KC.RIGHT,
],
# FN layer
[
# Left Side
KC.GRAVE, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5,
KC.TRNS, KC.N4, KC.N5, KC.N6, KC.MINS, KC.EQUAL,
KC.TRNS, KC.N7, KC.N8, KC.N9, KC.N0, KC.NO,
KC.TRNS, KC.TRNS, KC.TRNS, KC.LALT, KC.TRNS, KC.NUMLOCK,
# Right Side
KC.NO, KC.NO, KC.NO, KC.NO, KC.NO, KC.DEL,
KC.NO, KC.NO, KC.MINUS, KC.EQUAL, KC.LBRC, KC.RBRC,
KC.NO, KC.NO, KC.NO, KC.NO, KC.PGUP, KC.INS,
KC.PSCR, KC.TRNS, KC.BSLASH, KC.HOME, KC.PGDN, KC.END,
],
# FS Layer
[
# Left Side Only for F1-F9
KC.TRNS, KC.F7, KC.F8, KC.F9, KC.F10, KC.F11,
KC.TRNS, KC.F4, KC.F5, KC.F6, KC.F12, KC.F13,
KC.TRNS, KC.F1, KC.F2, KC.F3, KC.F14, KC.F15,
]
]
if __name__ == '__main__':
keyboard.go()
Чрезвычайно удобно сделан процесс настройки. Просто открываешь файл в любом текстовом редакторе, меняешь коды и сохраняешь и оно уже работает. Никакой компиляции, никакого таскания файлов, никакого дополнительного оборудования и софта, сказка!
Я обклеил кнопки бумажным скотчем и писал на нём символы клавиш, садился работать. Если что-то не устраивало, тут же менял значения в блокноте, замазкой правил на скотче и писал новые, и работал дальше. И так, пока кнопки не заняли свои места. Потом скотч снял и белым перманентным маркером нанёс символы на кнопки.
Лайфхак. Удобно использовать экранную клавиатуру windows, потому что во время переопределения кнопок часть из них может оказаться неопределённой и с клавиатуры не получится их ввести. Чтобы её включить нужно правой кнопкой кликнуть по панели задач и поставить галку напротив "Показать кнопку сенсорной клавиатуры".
Клавиатура готова!
Смета
Паяльные инструменты, лак с кистью, наждачка всех мастей и прочее из закромов я в смету не включал. Свичи куплены семь лет назад, поэтому цена неадекватна сегодняшней. Цены в рублях
Raspberry Pi Pico | 300 |
Свичи 50 шт | 800 |
Кейкапы 50шт | 1000 |
Диоды 1N4148 100шт | 65 |
Резка корпуса | 700 |
Болты M8 10шт | 300 |
Белый маркер | 100 |
Софт Blender, LibreCAD, блокнот | бесплатный |
Удовольствие от сборки | бесценно |
Итого | 3300 |
Заключение
Клавиатура получилась компактной и функциональной. Правда необходимо ещё привыкнуть к новому положению некоторых клавиш. В биосе она тоже работает, однако не выводит комп из сна.
Собирать её было интересно и весело. Не ожидал что так много людей этим занимается и полно готовых инструментов, что сильно снижает порог вхождения. Порадовало что не надо кодить на низком уровне, не надо рассчитывать резисторы, транзисторы и прочую схемотехнику, только пайка проводов и диодов.
В основном остаётся творческая работа: решить какой формы будет клавиатура, выбрать на свой вкус свичи и кейкапы и решить где какие кнопки расположить.
В будущем хотелось бы всё-таки собрать беспроводной сплит на низкопрофильных красных свичах, ибо коричневые всё ж шумноваты. Возможно впилить в него трекбол или джойстик или трекпад, чтобы не тянуться к мыши. Конечно если силы энтузиазма хватит превозмочь гравитацию и встать с дивана.
Спасибо за внимание, всем хорошего настроения!