На пути к идеальной клавиатуре
- среда, 8 января 2020 г. в 00:25:40
Я программист и, как вы догадываетесь, некоторое время провожу за набором кода. Это занятие обычно заключается в переносе мысли из пространства между дужками очков в пространство за монитором. Пока нейроинтерфейсы редки, легаси требования делают печать достаточно сложной, в ней участвуют мозг, глаза, руки, клавиатура, компьютер и монитор. Хотелось бы смотреть только на монитор, а не переводить взгляд на клавиатуру. При этом попадать по нужной клавише, быстрее печатать и меньше опечатываться, меньше двигать запястьем и пальцами.
Ответ — эргономическая клавиатура. Под катом процесс рождения двух. Уберите детей подальше от экранов, есть сцены технопорно.
Программируя, печатаешь код и на скорость не жалуешься, это не узкое место. Больше времени уходит на подумать. Что раздражает, так это опечатки — когда их исправляешь, мысль теряется. И разглядывание кнопок вместо экрана не способствует её возвращению.
Вроде бы, умею печатать вслепую, но хочется подсмотреть, где клавиши. И это отвлекает. Вроде бы, печатаю всеми десятью пальцами. Но сейчас Y и B нажал левой рукой, затем правой. А сейчас какой жать? И это тоже отвлекает. К тому же, наблюдательные заметили, что обычно печатают девятью пальцами: пробел большой и жмут на него одним большим пальцем. Даже если чередуют, то пользы/информации от такого большого пальца мало.
Не только я один пришёл к выводу, что у обычных клавиатур есть проблемы и стали их решать.
Начал с таких дополнительных условий:
Первым делом положил пальцы на лист бумаги и отметил кончики. Сделал то же самое на пластилине. Дорисовал карандашом кнопки и промерил расстояния. Перенёс рисунок в векторный редактор, там подровнял и распечатал. Повторил процедуру несколько раз другими способами, которые пришли в голову. Заказал свитчи и колпачки, и пока они шли, стал переносить в CAD. Попробовал несколько программ и понял, что они хороши, да не очень — нужно таскать всё мышкой. Как оказалось, скриптом легче. От CAD мне нужно только визуализировать скрипт, промерять расстояния и генерировать gcode (векторный 3D путь, по которому будет летать конец фрезы ЧПУ станка). Очень понравилась идеология ImplicitCAD, но в части gcode он сыроват. Да и другие CAD сложно заставить генерировать gcode, который не будет долго летать по одному и тому же месту несколько раз.
Кратко расскажу, как gcode превращается в движения фрезы. Фреза вставляется в цангу фрезера, который размещён на портале, а он каретками перемещается по нашему родному трёхмерному декартовому пространству. Каретки движутся вращением винтов. Винты вращаются шаговыми двигателями. Шаговый двигатель поворачивается, притягиваясь своими полюсами к катушкам, по которым бежит ток в одном направлении и отталкиваясь от катушек с током в другом направлении. Ток большой, мелкая микросхема не справится с его управлением. Этим занимается драйвер шагового двигателя, который на вход каждый момент времени принимает 2 бита STEP (нужно ли сделать шаг) и DIR (влево или вправо) на слабом токе, а на выходе даёт большой ток нужного направления в обмотках двигателя. Для трёх двигателей получается нужно 6 бит 30 000 раз в секунду вынь да положь в жёстком реальном времени. Не успеешь, выйдет рассинхрон, и вместо задуманной траектории фреза пойдёт в лес, то есть в дерево не там, где надо. Для настольного компьютера управление в жёстком реальном времени — это реальная проблема. Но не из-за недостатка процессорной мощи, а скорее от её избытка, утилизацией которой занимается операционная система, переключаясь 1000 раз в секунду между задачами. Когда переключится, точно неизвестно, как шедулер захочет. Поэтому генерацией STEP/DIR сигнала занимается микроконтроллер на Ардуинке под управлением прошивки grbl, а на вход получает тот самый gcode. Но тут другая проблема: gcode'а могут быть мегабайты, а памяти на Ардуине считанные килобайты. Приходится кормить её мелкими порциями по USB, как съест кусок, дать новый. Хорошо то, что кормить уже нужно не в жёстком реальном времени, а в мягком, и обычный ноутбук с bCNC прекрасно с этим справляется.
Немного о том, как заготовка превращается в изделие. К металлическому столу станка болтами прикручивается деревянный жертвенный стол, потому что его не жалко. К нему крепится заготовка. Материал вынимается сначала концевой фрезой большого диаметра, затем в углах и на чистовую фрезой малого диаметра. Но контурам пробегаю фаску угловой фрезой или закруглённой фасонной. Гладкие криволинейные поверхности делаются сферической фрезой. После каждой смены фрезы нужно выставлять начало координат по высоте. Начало каждого прохода очень ответственный момент. Нужно уменьшить скорость и внимательно наблюдать за фрезой. Если она начала что-то портить или повела себя необычным образом, нужно срочно останавливать процесс, пока заготовка или фреза необратимо не пострадали. Например, фреза может уйти глубже, вырвать заготовку, не вращаться, дымиться, давать пыль вместо стружки, летать по другой траектории, быть не того диаметра или профиля. Затем заготовка переворачивается и таким же способом обрабатывается со второй стороны. Всего инструмент меняется с десяток раз. Самый ответственный момент в конце обработки, когда почти готовое изделие держится на тонких поддержках и его легко вырвать. Придётся начинать всё заново, так как обратно крепко и точно не приклеить и не доделать. Процесс фрезеровки очень напоминает отладку на проде, когда ошибки чинятся на лету и их цена велика.
Первый отладочный прототип корпуса делал из сосны потому, что знал, что испорчу. Второй уже делал из бука. Есть пара мелких ошибок: не поднял фрезу после замены и она летела чуть испортив заготовку, и при установке начальной высоты проткнул фрезой заготовку. Корпус фрезеровал день. Потом полдня доработки напильником.
Следующий этап — пайка навесным монтажом. Я раньше думал, что не умею паять. А оказалось это паяльник не умеет паять. Паяльная станция с регулировкой температуры творит чудеса и паяет сама. Нужно только держать жало в нужном месте, мазать флюсом, да подносить припой. Задача присоединить кнопки к микросхеме. Но кнопок 44, а управляемых пинов у Pro Micro только 18. В то же время у проводника два конца — куда ток входит и откуда выходит. Одни пусть будут рядами, а другие колонками, в сумме не больше 18. Этими концами можно управлять отдельно. Напряжение подаётся на весь ряд и считывается по очереди с каждой колонки. Нажатая кнопка его пропустит и мы его прочтём, не нажатая не пропустит. И число их комбинаций находится через умножение, то есть максимум наша Pro Micro может обслужить 9 9=81 кнопок. Нужно 44 кнопки. Можно 11 4, но мне больше подходит 6 колонок 8 рядов (4 слева и 4 справа). Схема нехитрая, опять привет Декарту, на этот раз в 2D. Хитрость появляется тогда, когда 3 кнопки нажмутся одновременно. Ток начнёт гулять от рядов к колонкам и обратно и покажется, что четвёртая кнопка, которая составляет квадрат с тремя нажатыми, тоже нажата. Чтобы ток шёл от рядов к колонкам, но не обратно, добавляются диоды. В качестве шины для ряда используется проводник самого диода, а для столбцов нужен изолированный провод, чтобы не было замыкания с рядами. Самая сложная часть это прикрепить ряды и колонки к Pro Micro, так как места мало.
На кнопки поставил купленные сферические колпачки, но они мне не понравились — острой гранью резали пальцы. Несколько дней рисовал и за день выпилил свои. Ножку сделал круглой 5.5 мм. Боялся, что она отломается, но держатся они крепко.
Настал черёд прошивки. Свою с нуля писать долго, поэтому взял QMK. Чтобы её сконфигурировать, нужно указать сколько в клавиатуре рядов и колонок, к каким пинам они подключены, как повёрнуты диоды (от рядов к колонкам или наоборот), как электрические ряды (8 штук) и колонки (6 штук) отображаются на ряды (4 штук) и колонки (14 штук) раскладки, а также саму раскладку. Процесс настройки раскладки может продолжаться вечно, я начал с QWERTY. Уместился в 3 слоя. Слои редко можно встретить в обычный клавиатурах. Чаще всего слоями Fn ряд совмещают с медиаклавишами на ноутбучных клавиатурах. Но когда клавиш только 44, без слоёв не обойтись. Кроме слоёв есть и другие способы присвоить разное значение одной и той же кнопке.
Под Linux чтобы залить прошивку, нужно отключить один сервис и собрать проект, указав свою конфигурацию.
sudo systemctl disable ModemManager.service
sudo make gor:default:avrdude
Сборка остановится на ожидании перезагрузки микроконтроллера и в первый раз нужно замкнуть пин RST на землю. В дальнейшем удобно вынести кнопку перезагрузки в раскладку.
Всё первая версия моей клавиатуры готова. При использовании многое понравилось.
Не обошлось без недостатков.
Недостатки не позволили с комфортом пользоваться клавиатурой по назначению. В то же время, своей массой и монолитностью она замечательно смотрится в интерьере, как оленьи рога или другой трофей охотника. Спустя полгода решил сделать новую версию клавиатуры с новыми требованиями.
Чтобы понять что мне нужно, отбракованные пластиковые колпачки прикрепил к пластилину и начал пробовать варианты размещений. Обнаружил, что мне удобнее держать пальцы не над его столбцом, а сбоку. Тогда по столбцу палец двигается по дуге почти не сгибаясь. Одновременно с этим, запястье лежит под углом и не нужно поворачивать левую и правую половину. Единственное, что остаётся, это сдвинуть столбцы по высоте. Также заметил, что 19мм шаг между клавишами оставляет между пальцами много места. А при повороте кисти пальцам становится ещё свободнее. Поэтому решим попробовать ужать шаг.
Паять тонким проволочным припоем с нанесённым на него флюсом 70 кнопок оказалось даже легче, чем 44, нанося флюс вручную. А вот соединять ряды и столбцы к Pro Micro оказалось значительно сложнее из-за плотной компоновки.
Текущая раскладка QWERTY, до Colemak и прочих ещё не дорос.
Эксплуатация опять выявила некоторые недостатки.
Но достоинства перевешивают.
Теперь клавиатурой можно пользоваться, чем и собираюсь заняться.