DIY клавиатура из фанеры

в 19:05, , рубрики: pi pico, Raspberry Pi, raspberrypi, кастом, клавиатура, клавиатура из дерева
Клавиатура из фанеры

Клавиатура из фанеры

Введение

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

Фантазии и реальность

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

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

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

В общем программа максимум: беспроводной сплит клавиш на 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.

Макет для сплита на картоне

Макет для сплита на картоне
Макет для монолита на картоне. В центре конnроллер Rasperry PiPico

Макет для монолита на картоне. В центре конnроллер Rasperry PiPico
Макет в блендере

Макет в блендере

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

Выкройка в LibreCAD для лазерной резки

Выкройка в 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. На русском она звучит примерно так:

  1. С оф сайта Raspberry скачай CircuitPython вот здесь https://circuitpython.org/board/raspberry_pi_pico/

  2. Удерживая кнопку Boot на плате PiPico подключи usb кабель. Устройство определится как флешка.

  3. Скопируй скачанный .UF2 файл на эту "флешку"

  4. Отключи usb кабель и подсоедини обратно через пару минут. Он обнаружится как CURCUITPY.

  5. Скачай последнюю версию KMK с гитхаба https://github.com/KMKfw/kmk_firmware/archive/refs/heads/master.zip

  6. Из архива скопируй папку KMK и boot.py в корень "флешки".

  7. Также в корне создай или скопируй из примера файл 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

Заключение

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

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

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

Сравнение со старой клавиатурой

Сравнение со старой клавиатурой
Немного близких ракурсов

Немного близких ракурсов
Клавиатура с торца как слоёный пирог

Клавиатура с торца как слоёный пирог

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

Спасибо за внимание, всем хорошего настроения!

Автор:
drogman

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js