Очень давно на Хабре мною была прочитана статья о механических клавиатурах, свичах их разновидностях и всём таком. Естественно мне захотелось причаститься к секте кнопкопоклонников и сделать свою также для себя же. Но вместе с тем я не хотел кидаться с места в карьер неизведанных знаний (да и куча других незавершённых проектов давила на совесть) и решил потренироваться сначала «на кошечках». Желание засело в
И вот однажды «кошечки» ко мне постучались сами…
Есть у меня друг лепший, Артём Кашканов, известный на Хабре aka radiolok, и звонит он мне как-то и говорит: «Клавиатуры надо?». Я ему ответил: «Надо!» не услышав второй части сообщения «Только они старые». И привёз он мне осенью 2019 года вот эти две кошечки, ой, клавиатуры. (Иных фотографий с той поры у меня, увы, нет):
По словам Кашканова они были списаны из какого-то НИИ и до списания много лет пролежали на складе. Наводку на них и другой хабар дал товарищ discoordination за что ему отдельная благодарность.
Присмотревшись и разобрав немного, понял, что мне достались клавиатуры Robotron производства ГДР, родом из 1987 года, если верить маркировкам на платах. Производились эти клавиатуры для ПК Robotron 1715 тех лет и шли в комплекте поставки.
❯ Вскрытие и омовение
Итак, после того, как эти клавиатуры попали ко мне в руки, у меня воззудело сделать из них рабочий инструмент для своего компьютера. Поэтому, первым делом, нужно было их разобрать и посмотреть, что же там внутрЭ. Открутив все шлицевые винты нижней крышки, я увидел две платы, плату матрицы и плату процессора, что вы можете увидеть их на фотографиях ниже под спойлером:
Увы, но одна клавиатура было полна кнопками, но без плат. Вторая была без нескольких кнопок, но с платами. Две рабочих клавиатуры не получить при всём желании. И тогда определил и отсортировал все более-менее целые и не помятые части и из двух собрал одну комплектную. Впоследствии вторая клавиатура, точнее её корпус с кнопками, вернулась Кашканову.
После сортировки деталей окончательно разобрал все компоненты и отмыл в ванной под проточной водой. Грязи было не просто много, а очень много.
Чистка до
Чистка после
Сами кнопки были также разобраны и все «капсы» засунуты в мешочек и постираны на 60 градусов в стиральной машинке. Два раза.
Пока кнопки мылись, внимательно изучил платы клавиатуры и механику самих кнопок:
Электроника представлена двумя стеклотекстолитовыми (не гетинакс, а честный текстолит высокого качества!) платами: большую плату матрицы кнопок на которой напаяны два светодиода и разъём, и второй платы с процессором U880 (ГДР-овский клон Zilog Z80) со всей обвязкой в виде кварца, памяти с прошивкой, ОЗУ и прочей мелочью. Как выяснилось позже, обмен информации клавиатуры с ПК осуществлялся по UART с применением оригинального протокола. Но поскольку у меня не входило в планы реверсить протокол со схемой платы и городить конвертер чисто для этой клавиатуры в единичном экземпляре, то я без зазрений совести отдал плату управления обратно Кашканову в гараж.
❯ Анатомия кнопочки
Механизм кнопок напоминает интересный гибрид мембранной клавиатуры и кнопок дешёвого пульта от телевизора, выполненных на очень качественном пластике с применением двух пружин.
Когда нажимаешь на кнопку, то двигаешь саму кнопку до ограничителя преодолевая сопротивление, первой, возвратной пружины, при этом двигается шток с токопроводящей резинкой давит и замыкает собой контактные площадки из меди на самом текстолите.
Но при этом усилие штока с резинкой на площадки постоянно, ибо на неё давит вторая пружинка! Ограничителем кнопки при этом выступает сам корпус кнопки и закреплён на стальной(?) пластине. На фото это видно:
При этом ход штока больше чем ход кнопки, и как бы пользователь не давил на кнопку, то нагрузка давления пальца пользователя на плату не передастся и упругое нажатие резинки будет постоянным не зависимо от усилий пользователя. Сам резиновый токопроводящий колпачок при этом сменный (горячий пламенный привет дешёвым китайским ИК пультам!).
Сами колпачки с надписями сделаны очень трудоёмким, даже по нынешним временам, способом – методом двойного литья. При этом пластик не дешёвый и ощущается очень приятно.
❯ Украшаем
Поскольку корпус оставлял желать лучшего, то задумался о том, как же его привести в божеский вид. Можете сами заценить, как же это было. Мэрзонько.
До покраски
Проведя переговоры с жабой и мужественно приняв инфаркт кошелька решил корпус обновить, отдав в цех покраски кузовных деталей автомобилей. Отдавая попросил нанести в два слоя порошковую краску. Сам корпус белым, рамка с блока клавиш чёрным. Считаю что получилось дёшево и сердито. 2700 руб. (цена мая 2020 года). При этом мастер сделал скидку на треть за оригинальность и саму идею восстановления.
После покраски
Ну разве не красавица, совсем другой коленкор и приятность глазу! Прямо сразу стало выглядеть очень стильно и после того как потрогал нет желания помыть руки после. Только до, дабы не пачкать такую красоту. Что осталось за кадром — между делом освежил все резьбовые соединения и заменил все метизы на новые.
Освежили корпус, разобрались с электроникой, дело стало за малым, это добавить
❯ Микроконтроллер
Пока корпус находился в покраске, решил определиться с микроконтроллером. Изучив документацию к прошивке QMK нашёл для себя что она вполне может работать на платах Bluepill, сиречь на микроконтроллере stm32f103c8
.
Что есть Bluepill – платы-модули аналогичные платам Arduino
, но с МК stm32f103c8
. Имеют всё на борту, чтобы купить, вставить и заработало. Не надо мучиться с питанием, разводкой кварцев, резисторов и прочей минимальной обвязкой. Всё это есть и по размерам не более микросхемы DIP40. Идеально, когда хочется результат побыстрее, или надо что-то отладить.
Предвосхищая вопросы «почему не AtMega32U4
?» отвечаю – я заказал не ту версию Arduino Leonardo
и на ней мне не хватило выводов для матрицы кнопок.
Тем кому очень интересно, приведу фотографию одной области клавиатуры крупным планом, как же выглядит матрица.
Изучив документацию к клавиатуре какую нашёл я узнал, что здесь используется матрица на 13 строк и 8 столбцов (ну или наоборот, кому как удобно), без защитных диодов от короткого замыкания на плате матрицы. То есть суммарно нужен 21 вывод под матрицу кнопок и 4 (3 сигнальных и один общий провод) для 3х светодиодов. После чего спаял все выводы матрицы проводом МГТФ к выводам Bluepill. Паял аккуратно прямо на контакты разъема, ибо не хотел вандалить вероятно рабочую плату с процессором. То куда и как запаял, выписал на отдельный листочек и сохранил, это потом меня очень выручило. При этом важно было только какой контакт Bluepill чем является – строкой или столбцом в матрице. Вызванивать же каждую кнопку выясняя её координату в матрице мне было откровенно влом и оставил это на потом. Запомните этот момент.
ВАЖНО! Почему это важно не перепутать что есть что – во избежание КЗ на ногах МК! Если напутать и указать пину со строкой подключенному к элементу столбца, то 100% вероятность того что при нажатии кнопки пин МК который выдаёт лог. 1 подаст напряжение питания на пин МК выдающий лог. 0, то есть подключен к общему проводу. Что, по сути, будет КЗ плюса и минуса питания по линии пинов МК. В лучшем случаев пин перестанет работать, в худшем – воссоединится с Омниссией.
Саму Bluepill приклеил двусторонним скотчем рядышком с разъёмом.
Забрал корпус из покраски, собрал всё воедино и положил на полочку ибо «Самоизоляция 2020» закончилась. Даже не проверял ничего. Лежало и пылилось с лета 2020г.
❯ Оживляем!
И вот настал январь 2023 года. Момент когда жена сказала: «или доделывай или выкидывай!». Принялся клавиатуру доделывать, дабы работала, а не валялась.
И первым делом в корпусе было сделано отверстие и приделан USB type B. Почему он? Потому что удобен при присоединении «в слепую» и родные провода данного типа по умолчанию длинные. Держак для гнезда скачал с thingiverse.com, само гнездо купил на алиэкспресс. Переходничок спаял руками.
Как гнездо и переходник были установлены внутри:
Согласен, выглядит отвратно, но «и так сойдёт!». А если серьёзно, то надо научиться кернить точно и не спешить при сверлении.
❯ Прошивка QMK и балет на граблях.
Закончив с подготовкой железной части начал думать над программной. Скачал QMK MSYS 2022 последней версии (на момент января 2023г.), установил на диск «С» по умолчанию, QMK же сама подтянула все исходники с гита.
Важно! Тщательно изучите возможность работы QMK с тем или иным микроконтроллером!
Дальше будет глубоко личный эмпирический опыт
После ознакомления с документацией и конфигурациями готовых плат решил делать свою конфигурацию с нуля с оглядкой на существующие проекты для bluepill. Собственно шаблон конфигурации получилось создать в одну команду, задав все настройки. У меня клавиатура названа robotron, на скриншотах название клавиатуры дано для примера. Также это имя клавиатуры является именем папки с файлами конфигурации.
mk new-keyboard
На данном этапе выбираются: имя клавиатуры, кто создал, выбираем раскладку – важный момент который упростит дальнейший маппинг клавиш, и самое главное – выбираем чип. Всё интуитивно понятно. При этом на этапе layout выбрать можно любой пункт.
Если вдруг вы будете повторять за мной и вы ошибетесь на данном этапе, вы всегда сможете удалить папку с файлами неудачной конфигурацию и начать заново.
После чего в папке с созданной конфигурацией интересует по факту только два файла (у вас возможны другие пути):
c:Userssamqmk_firmwarekeyboardsrobotroninfo.json
c:Userssamqmk_firmwarekeyboardsrobotronkeymapsdefaultkeymap.c
В файле «info.json» заполняется секция «matrix_pins», так как записал это отдельно на листочке в далёком 2020г., при запайке контактов матрицы. У меня получилось вот так:
"matrix_pins": {
"cols": ["B1","B0","A8","B4","B5","B6","B7","B8","B9","B12","B13","B14","B15"]
"rows": ["A1", "A0","A2","A3","A4","A5","A6","A7"]
}
Тринадцать столбцов и восемь строк. Главное чтобы строки были строками и столбцы столбцами. О вероятности КЗ писалось выше.
В том же файле, в секцию «layouts» добавил недостающие элементы матрицы, до тех-пор пока не стало равнозначное количество строк и столбцов по контактам.
Матрица изначальная
Матрица настроенная
Данная секция («layouts») при компиляции связывает пины в секции «matrix_pins» с массивом сигналов кнопок в файле keymap.c
.
Что это за сигналы кнопок. Когда мы на клавиатуре нажимаем кнопку, например, «N» то при сканировании матрицы кнопок кнопка замыкает строку со столбцом. Зная координату кнопки в матрице МК по этому адресу отсылает код клавиши в операционную систему компьютера. Отсылается не координата кнопки в матрице (если клавиатура матричная), а именно МК клавиатуры «говорит» ПК что нажата/удерживается/отпущена кнопка «N» или любая другая с соответствующим адресом. Полный список кодов-клавиш вот.
Затем в файле keymap.c сделал вот такую матрицу сигналов кнопок для первичной проверки работы кнопок в матрице и проверки пайки.
Самое главное здесь, опять таки, равенство количества элементов в массиве количеству строк помноженных на количество столбов в секциях «layouts» и «matrix_pins» в файле «info.json». Массив одномерный и я просто набил 104 тестовых элемента. Если же это равенство будет нарушено – проект просто не скомпилируется.
Задал всё минимально необходимое для работы прошивки – какие выводы в микроконтроллере в info.json и матрицу сигналов в keymap.c после чего скомпилировал командой:
qmk compile -kb robotron -km default
получил бинарник c:Userssamqmk_firmwarerobotron_default.bin
и залил его в контроллер программой STM32 ST-LINK Utility программатором ST-LINK (китайский клон).
Залил и не заработало. Вообще. ШТОШ…
❯ Загрузчик и первый успех
И вот тут мне очень помог чат, а конкретно пользователь sigprof (далее все последующие шаги выполнялись с его консультациями, за что ему бесконечная благодарность). Выяснилось, что бинарники прошивки не работают без загрузчика который запускается первым. Эти загрузчики уже есть готовые и ничего придумывать не надо. Скачал бинарник загрузчика и прошил его программатором. Главное для своего МК скачать.
После чего скачал и установил программу QMK Toolbox, специально созданную энтузиастами клавиатуростроения, подключил клавиатуру, увидел, что Toolbox определил загрузчик (жёлтая строка на скриншоте), указал файл прошивки и нажал кнопочку «Flash».
После чего выключил и включил клавиатуру тем самым запустив целевую прошивку. В Toolbox есть встроенный тестер нажатых клавиш (Tools -› KeyTester), что удобно.
Прожал все клавиши своего Роботрона – всё в Toolbox нажимается. Значит, нет ошибок пайки и дорожки платы матрицы целые.
Успех.
Немаловажный момент работы загрузчика – для его включения надо ресетить МК не отключая его от ПК. Можно конечно вывести пин RST на отдельную кнопку, но это не мой путь. Решил поискать готовые решения и ознакомился со списком кодов клавиш (см. выше) и нашёл служебные команды. И просто добавил служебный код клавиши QK_BOOT
на место одной кнопки в файле keymap.c
. Данная команда просто переключает МК на загрузчик. Удобно. Нажал, подождал, загрузил, переткнул шнур, работай.
❯ Феерическая расстановка кнопочек. Распиновка матрицы
И вот тут в полный рост встала фундаментальная и неразрешимая для меня проблема лень, ой (зачёркнуто) — как связать матрицу кнопок с контактами контроллера не перебирая вот это вот всё вручную с прозвонкой?
Например, есть кнопка «Esc» на клавиатуре. В подавляющем случае клавиатур (и в случае Роботрона) она находится сверху слева и если считать справа-налево и сверху-вниз, то её координаты в матрице кнопок будут [0.0]. При напайке я нулевую строку и нулевой столбец платы матрицы напаял на пины А2 и В9 соответственно. Выяснил я это методом «прозвонки» тестером. Но у меня 13 столбцов на 8 строк и весьма неочевидная топология кнопок на плате матрицы. Перезванивать все 104 кнопки тестером вручную? Я конечно электроник, но зря я при этом программист?
В чём трудность подробнее:
Изначальная распиновка матрицы у меня была вот такая («info.json».), запомните её:
"cols": ["B1","B0","A8","B4","B5","B6","B7","B8","B9","B12","B13","B14","B15"],
"rows": ["A1", "A0","A2","A3","A4","A5","A6","A7"]
А теперь необходимо взять и расставить их в правильном порядке, чтобы при нажатии на кнопку «F1» получить собственно сигнал «KC_F1», а не «KC_DOWN», например.
Принялся искать готовые варианты решения задачи.
Как выяснилось, штатных средств в QMK для отладки сложной матрицы кнопок просто нет. Вообще. Если только руками, тестером, с бАмажечкой… (Омниссия, какой стыд). И поэтому воспользовался экспериментальными инструментами вышеупомянутого товарища Sigprof. Следуя его советам, первым делом была нарисована моя клавиатура в веб-редакторе клавиатур.
За пару часов нарисовал свою клавиатуру следуя трём советам:
- надписи (Legend) клавиш делал только в левом верхнем и левом нижнем углах (Left Top Legend, Left Bottom Legend);
- все ряды клавиш должны быть на одной, кратной единице, высоте;
- размер клавиш в высоту не должен быть более единицы.
После чего получил вот такую картинку:
Тут видно что на скриншоте я не следовал советам и уже в готовом варианте всё поправил. Другого скриншота, увы, нет.
С кеймапом в веб-редакторе определился, теперь надо связать кнопки с контактами микроконтроллера. Для этого скачал экспериментальный пинтестер товарища Sigprof, отсюда.
Лично я не компилировал, бинарник мне дал товарищ Sigprof, ибо так получилось быстрее.
Как работать с пинтестером: загрузил бинарник пинтестера в МК, отрывается блокнот. Нажимается кнопка «Esc», в текстовом редакторе печатается текст вида (Ф2бИ9) (это получилось у меня на русской раскладке). Если переключить раскладу на английскую и нажать на кнопку «Esc», то получается уже (A2,B9). Ничего не напоминает? Нажал на кнопку “;” и в блокноте появилась надпись (A2,B8), «1» -(A2,B8), “2” — (A2,A8). То есть прошивка пинтестера печатает пины МК каждой нажатой кнопки нативным текстом. Восхитительно.
Далее переключил раскладку на английскую, перешёл в веб-редактор раскладки и последовательно прожал в каждую клавишу своей клавиатуры Robotron в правом Center Legend, как на скриншоте.
И в итоге получается вот такая симпатичная картинка:
Далее нажал на вкладку «Raw Data» и весь текст в ней скопировал и сохранил в файл robotron.txt в корневой папке пользователя: c:Userssamrobotron.txt
.
Затем, следуя совету Sigprof, я скачал два файла (converter.py
и kle2json.py
) отсюда,
и сохранил их с заменой вот по этим путям, предварительно сделав их бэкапы:
c:Userssamqmk_firmwarelibpythonqmkconverter.py
c:Userssamqmk_firmwarelibpythonqmkclikle2json.py
В консоли QMK выполнил команду:
[sam@sam-note ~]$ qmk kle2json --via -m robotron.txt -f
Ψ Wrote out C:/Users/sam/info.json
Ψ Wrote out C:/Users/sam/via.json
Открываю файл «info.json» и вижу то ради чего затевалось всё вышеописанное:
"cols": ["B9", "B8", "A8", "B1", "B0", "B14", "B15", "B7", "B12", "B13", "B5", "B4", "B6"],
"rows": ["A2", "A6", "A7", "A1", "A3", "A0", "A5", "A4"]
Распиновочка матрицы. Автоматически, да. Сравните с изначальной выше. Почувствуйте разницу. И не руками!
Скопировал новую распиновку в свой «info.json» с заменой и закрыл.
Краткая суть всех выше перечисленных манипуляций: автоматически отлажена распиновка матрицы кнопок. Не руками.
❯ Муторная расстановка кнопочек. Раскладка.
Последний этап самый простой, но самый муторный — вручную расставить все необходимые коды-клавиш по своему предпочтению. Используя кучу пробелов, сверяясь со списком кодов-клавиш сделал текстовую версию клавиатуры смотря на лежащую рядом клавиатуру Robotron с её jcuken раскладкой. С учётом того что конкретно должно происходить и на других клавишах.
Происходит это в файле keymap.c
и заполняется массив [0] = LAYOUT();
У меня получилось вот так:
Прошу понять и простить – в ширину экрана весь текст не влез, поэтому два скриншота.
В тех случаях когда я не знал что должна делать кнопка я ставил «XXXXXXX», что по мануалу означало пустышку.
❯ Йцукен и jcuken
Теперь надо разобраться с раскладками йцукен и jcuken, ибо хочется антуражности и соответствии железу. В этом плане всё просто. QMK поддерживает так называемы «слои» — когда все кнопки или группа кнопок могут иметь более одного код-сигнала. На данном этапе замачиваться не стал и сделал вот так:
Прошу понять и простить – в ширину экрана весь текст не влез поэтому два скриншота.
Просто задал ещё один слой [1] = LAYOUT();
где уже расписал стандартную qwerty
раскладку. Если печатать на слое 1 ней и языке ввода русском, то будет печататься русский язык. Переключить слой на 0 и переключить язык ввода на английский – будет работать jcuken
раскладка.
Смена слоёв происходит по служебному коду «TG(1)», причём этот код-клавиши должен быть одинаков для на всех слоях. Более подробно про слои вы можете почитать тут.
Ну и напоследок для удобства перепрошивки поставил команду QK_BOOT
на место красной кнопки Robotron.
❯ РАБОТАЕТ!
Поправил пины. Написал раскладу. Скомпилировал:
qmk compile -kb robotron -km default
Бинарный файл прошивки залил программатором, ибо прошивка пинтестера не запускала загрузчик. Переткнул. Работает. Видео доказательство:
❯ Выводы
Какой вывод? Есть спасённая с помойки клавиатура Robotron. Помытая, обновлённая, реанимированная и способная работать с современными ПК и ноутбуками. Разбираясь с её программной частью, познакомился c экосистемой QMK, в принципе и сообществом кнопкопоклонников в частности. Получил море удовольствия и опыт, который может пригодится при построении с нуля новой клавиатуры мечты. Тропинка проложена.
Также опыт изложенный в этом хабрапосте, надеюсь, поможет кому-нибудь когда-нибудь также восстановить и заставить работать что-то раритетное.
Хотелось бы данной статьёй оказать некоторое воздействие на сообщество QMK дабы оно включило инструменты отладки матриц неизвестной топологии в стандартную комплектацию QMK.
Но один минус за Roboton имеется – печатать на ней это пытка для пальцев. Только сильный духом (и глухой) техножрец Омниссии способен на ней полноценно работать. Я попытался напечатать этот пост на ней… но не вышло.
❯ Благодарности
.
- Артёму Кашканову (aka radiolok ) за то что привёз клавиатуру и советы;
- Товарищу t.me/discoordination за саму клавиатуру;
- Сергею Власову (aka t.me/sigprof ) за инструмент отладки матрицы и ценные советы;
- Сергею Долину (aka dlinyj ) за то, что однажды сказал мне «дядь, пили пост!» и я начал пилить пост;
- Моей жене Регине.
Автор:
Arcanum7