Роботрон. Как восстановить клавиатуру из 1987г. для чайников

wicifxylaw3e4gs6rlupyxno68q.jpeg


Очень давно на Хабре мною была прочитана статья о механических клавиатурах, свичах их разновидностях и всём таком. Естественно мне захотелось причаститься к секте кнопкопоклонников и сделать свою также для себя же. Но вместе с тем я не хотел кидаться с места в карьер неизведанных знаний (да и куча других незавершённых проектов давила на совесть) и решил потренироваться сначала «на кошечках». Желание засело в мозгу, запрос был сформирован, отослан в ноосферу и осталось только ждать.
И вот однажды «кошечки» ко мне постучались сами…

Есть у меня друг лепший, Артём Кашканов, известный на Хабре aka radiolok, и звонит он мне как-то и говорит: «Клавиатуры надо?». Я ему ответил: «Надо!» не услышав второй части сообщения «Только они старые». И привёз он мне осенью 2019 года вот эти две кошечки, ой, клавиатуры. (Иных фотографий с той поры у меня, увы, нет):

k4ncf_umxtd9vw4ahz8yywhzh1s.jpeg

По словам Кашканова они были списаны из какого-то НИИ и до списания много лет пролежали на складе. Наводку на них и другой хабар дал товарищ discoordination за что ему отдельная благодарность.
Присмотревшись и разобрав немного, понял, что мне достались клавиатуры Robotron производства ГДР, родом из 1987 года, если верить маркировкам на платах. Производились эти клавиатуры для ПК Robotron 1715 тех лет и шли в комплекте поставки.

Вскрытие и омовение


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

_rur9jwkzn87umxp0uylmxivbsq.jpeg

Для любителей процесса вскрытия


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

jno0u8fd77cksdczidtwupkmo5e.jpeg
Чистка до

wzufhydssdlntczex8zlnfdiixo.jpeg
Чистка после

Сами кнопки были также разобраны и все «капсы» засунуты в мешочек и постираны на 60 градусов в стиральной машинке. Два раза.
Пока кнопки мылись, внимательно изучил платы клавиатуры и механику самих кнопок:

-z71xvnifknivm0fsdgswtbld7c.jpeg

Электроника представлена двумя стеклотекстолитовыми (не гетинакс, а честный текстолит высокого качества!) платами: большую плату матрицы кнопок на которой напаяны два светодиода и разъём, и второй платы с процессором U880 (ГДР-овский клон Zilog Z80) со всей обвязкой в виде кварца, памяти с прошивкой, ОЗУ и прочей мелочью. Как выяснилось позже, обмен информации клавиатуры с ПК осуществлялся по UART с применением оригинального протокола. Но поскольку у меня не входило в планы реверсить протокол со схемой платы и городить конвертер чисто для этой клавиатуры в единичном экземпляре, то я без зазрений совести отдал плату управления обратно Кашканову в гараж.

Анатомия кнопочки


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

xywb7kz2emld6wsnrqqsfxfwvpy.jpeg

dk41nkp_mx4njemqdzthteaueks.jpeg

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


Но при этом усилие штока с резинкой на площадки постоянно, ибо на неё давит вторая пружинка! Ограничителем кнопки при этом выступает сам корпус кнопки и закреплён на стальной (?) пластине. На фото это видно:

qjcpoz-rgo1elx_e5zp46y7wszw.jpeg

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

hkpwwksy5arzfezzbyk84ljnj2q.jpeg

cijexyfvea3impzrlfbstfo3478.jpeg

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

3ijupodpkp7ij5d7-1uhsszoovq.jpeg

Украшаем


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

gphdj6ou7ykvs9218yupbwpmaaa.jpeg
До покраски

Проведя переговоры с жабой и мужественно приняв инфаркт кошелька решил корпус обновить, отдав в цех покраски кузовных деталей автомобилей. Отдавая попросил нанести в два слоя порошковую краску. Сам корпус белым, рамка с блока клавиш чёрным. Считаю что получилось дёшево и сердито. 2700 руб. (цена мая 2020 года). При этом мастер сделал скидку на треть за оригинальность и саму идею восстановления.

q8lz1zwnsekqxth06ms2boc-ma4.jpeg
После покраски

Ну разве не красавица, совсем другой коленкор и приятность глазу! Прямо сразу стало выглядеть очень стильно и после того как потрогал нет желания помыть руки после. Только до, дабы не пачкать такую красоту. Что осталось за кадром — между делом освежил все резьбовые соединения и заменил все метизы на новые.
Освежили корпус, разобрались с электроникой, дело стало за малым, это добавить мозг — микроконтроллер.

Микроконтроллер


Пока корпус находился в покраске, решил определиться с микроконтроллером. Изучив документацию к прошивке QMK нашёл для себя что она вполне может работать на платах Bluepill, сиречь на микроконтроллере stm32f103c8.

Что есть Bluepill — платы-модули аналогичные платам Arduino, но с МК stm32f103c8. Имеют всё на борту, чтобы купить, вставить и заработало. Не надо мучиться с питанием, разводкой кварцев, резисторов и прочей минимальной обвязкой. Всё это есть и по размерам не более микросхемы DIP40. Идеально, когда хочется результат побыстрее, или надо что-то отладить.
Предвосхищая вопросы «почему не AtMega32U4?» отвечаю — я заказал не ту версию Arduino Leonardo и на ней мне не хватило выводов для матрицы кнопок.

hxntka54g7ihecx7m0qwmc29amk.jpeg

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

Просто фотки матрицы


Изучив документацию к клавиатуре какую нашёл я узнал, что здесь используется матрица на 13 строк и 8 столбцов (ну или наоборот, кому как удобно), без защитных диодов от короткого замыкания на плате матрицы. То есть суммарно нужен 21 вывод под матрицу кнопок и 4 (3 сигнальных и один общий провод) для 3х светодиодов. После чего спаял все выводы матрицы проводом МГТФ к выводам Bluepill. Паял аккуратно прямо на контакты разъема, ибо не хотел вандалить вероятно рабочую плату с процессором. То куда и как запаял, выписал на отдельный листочек и сохранил, это потом меня очень выручило. При этом важно было только какой контакт Bluepill чем является — строкой или столбцом в матрице. Вызванивать же каждую кнопку выясняя её координату в матрице мне было откровенно влом и оставил это на потом. Запомните этот момент.

ВАЖНО! Почему это важно не перепутать что есть что — во избежание КЗ на ногах МК! Если напутать и указать пину со строкой подключенному к элементу столбца, то 100% вероятность того что при нажатии кнопки пин МК который выдаёт лог. 1 подаст напряжение питания на пин МК выдающий лог. 0, то есть подключен к общему проводу. Что, по сути, будет КЗ плюса и минуса питания по линии пинов МК. В лучшем случаев пин перестанет работать, в худшем — воссоединится с Омниссией.


Саму Bluepill приклеил двусторонним скотчем рядышком с разъёмом.

2wjszqu-uvt3peyoasiweginrgo.jpeg

_clwdwi9yrdzdsbqenwiic0x23m.jpeg

Забрал корпус из покраски, собрал всё воедино и положил на полочку ибо «Самоизоляция 2020» закончилась. Даже не проверял ничего. Лежало и пылилось с лета 2020 г.

Оживляем!


И вот настал январь 2023 года. Момент когда жена сказала: «или доделывай или выкидывай!». Принялся клавиатуру доделывать, дабы работала, а не валялась.

И первым делом в корпусе было сделано отверстие и приделан USB type B. Почему он? Потому что удобен при присоединении «в слепую» и родные провода данного типа по умолчанию длинные. Держак для гнезда скачал с thingiverse.com, само гнездо купил на алиэкспресс. Переходничок спаял руками.

cb1pnf3xji-y5cusa9j3wsqpt6o.jpeg

Как гнездо и переходник были установлены внутри:

-2zqlbwnn0yx-ezllbjzxae1she.jpeg

Согласен, выглядит отвратно, но «и так сойдёт!». А если серьёзно, то надо научиться кернить точно и не спешить при сверлении.

Прошивка QMK и балет на граблях.


Закончив с подготовкой железной части начал думать над программной. Скачал QMK MSYS 2022 последней версии (на момент января 2023 г.), установил на диск «С» по умолчанию, QMK же сама подтянула все исходники с гита.

Важно! Тщательно изучите возможность работы QMK с тем или иным микроконтроллером!

Дальше будет глубоко личный эмпирический опыт


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

mk new-keyboard 


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

создаём новый профиль


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

c:\Users\sam\qmk_firmware\keyboards\robotron\info.json
c:\Users\sam\qmk_firmware\keyboards\robotron\keymaps\default\keymap.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» добавил недостающие элементы матрицы, до тех-пор пока не стало равнозначное количество строк и столбцов по контактам.

qu8s_hwaheu6eepiyld5uuvzj30.png
Матрица изначальная

i_4vhevtkjr5e2lkypqcf1hl7vg.png
Матрица настроенная

Данная секция («layouts») при компиляции связывает пины в секции «matrix_pins» с массивом сигналов кнопок в файле keymap.c.

Что это за сигналы кнопок. Когда мы на клавиатуре нажимаем кнопку, например, «N» то при сканировании матрицы кнопок кнопка замыкает строку со столбцом. Зная координату кнопки в матрице МК по этому адресу отсылает код клавиши в операционную систему компьютера. Отсылается не координата кнопки в матрице (если клавиатура матричная), а именно МК клавиатуры «говорит» ПК что нажата/удерживается/отпущена кнопка «N» или любая другая с соответствующим адресом. Полный список кодов-клавиш вот.
Затем в файле keymap.c сделал вот такую матрицу сигналов кнопок для первичной проверки работы кнопок в матрице и проверки пайки.

waxmwhhhf7ygidicl-ywu6cld8o.png

Самое главное здесь, опять таки, равенство количества элементов в массиве количеству строк помноженных на количество столбов в секциях «layouts» и «matrix_pins» в файле «info.json». Массив одномерный и я просто набил 104 тестовых элемента. Если же это равенство будет нарушено — проект просто не скомпилируется.

Задал всё минимально необходимое для работы прошивки — какие выводы в микроконтроллере в info.json и матрицу сигналов в keymap.c после чего скомпилировал командой:

qmk compile -kb robotron -km default


получил бинарник c:\Users\sam\qmk_firmware\robotron_default.bin и залил его в контроллер программой STM32 ST-LINK Utility программатором ST-LINK (китайский клон).
Залил и не заработало. Вообще. ШТОШ

Загрузчик и первый успех


И вот тут мне очень помог чат, а конкретно пользователь sigprof (далее все последующие шаги выполнялись с его консультациями, за что ему бесконечная благодарность). Выяснилось, что бинарники прошивки не работают без загрузчика который запускается первым. Эти загрузчики уже есть готовые и ничего придумывать не надо. Скачал бинарник загрузчика и прошил его программатором. Главное для своего МК скачать.

После чего скачал и установил программу QMK Toolbox, специально созданную энтузиастами клавиатуростроения, подключил клавиатуру, увидел, что Toolbox определил загрузчик (жёлтая строка на скриншоте), указал файл прошивки и нажал кнопочку «Flash».

q0a14anxdf5whecpkonnpokty1i.png

После чего выключил и включил клавиатуру тем самым запустив целевую прошивку. В Toolbox есть встроенный тестер нажатых клавиш (Tools -› KeyTester), что удобно.

zd8jhjukwngzo2wje-o-2fncli4.png

Прожал все клавиши своего Роботрона — всё в 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. Следуя его советам, первым делом была нарисована моя клавиатура в веб-редакторе клавиатур.

ly1irjqexhekz-ux9whspentvhy.png

За пару часов нарисовал свою клавиатуру следуя трём советам:

  1. надписи (Legend) клавиш делал только в левом верхнем и левом нижнем углах (Left Top Legend, Left Bottom Legend);
  2. все ряды клавиш должны быть на одной, кратной единице, высоте;
  3. размер клавиш в высоту не должен быть более единицы.


09inxtguknlkmq8hgddp9kb1gog.png

kby_xccohew-bwulc5mpifxyjls.png

После чего получил вот такую картинку:

gfnzaghsiqlirf_xttjsogtwzng.jpeg

Тут видно что на скриншоте я не следовал советам и уже в готовом варианте всё поправил. Другого скриншота, увы, нет.

С кеймапом в веб-редакторе определился, теперь надо связать кнопки с контактами микроконтроллера. Для этого скачал экспериментальный пинтестер товарища Sigprof, отсюда.

Лично я не компилировал, бинарник мне дал товарищ Sigprof, ибо так получилось быстрее.
Как работать с пинтестером: загрузил бинарник пинтестера в МК, отрывается блокнот. Нажимается кнопка «Esc», в текстовом редакторе печатается текст вида (Ф2 бИ9) (это получилось у меня на русской раскладке). Если переключить раскладу на английскую и нажать на кнопку «Esc», то получается уже (A2, B9). Ничего не напоминает? Нажал на кнопку »;» и в блокноте появилась надпись (A2, B8),»1» -(A2, B8),»2» — (A2, A8). То есть прошивка пинтестера печатает пины МК каждой нажатой кнопки нативным текстом. Восхитительно.

Далее переключил раскладку на английскую, перешёл в веб-редактор раскладки и последовательно прожал в каждую клавишу своей клавиатуры Robotron в правом Center Legend, как на скриншоте.

mpctwei-pnllwxygdlme7nuooug.png

И в итоге получается вот такая симпатичная картинка:

fqtu41ogb2g9v5zlcompbtqml30.png

Далее нажал на вкладку «Raw Data» и весь текст в ней скопировал и сохранил в файл robotron.txt в корневой папке пользователя: c:\Users\sam\robotron.txt.

8wik849hbncupripo-dxy407mgu.png

Затем, следуя совету Sigprof, я скачал два файла (converter.py и kle2json.py) отсюда,
и сохранил их с заменой вот по этим путям, предварительно сделав их бэкапы:

c:\Users\sam\qmk_firmware\lib\python\qmk\converter.py
c:\Users\sam\qmk_firmware\lib\python\qmk\cli\kle2json.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();
У меня получилось вот так:

fs9yy3d5ucsklenp04ns2da9zdo.png

y0otk4qlb2fvskz8lmkh0mcialw.png

Прошу понять и простить — в ширину экрана весь текст не влез, поэтому два скриншота.
В тех случаях когда я не знал что должна делать кнопка я ставил «XXXXXXX», что по мануалу означало пустышку.

Йцукен и jcuken


Теперь надо разобраться с раскладками йцукен и jcuken, ибо хочется антуражности и соответствии железу. В этом плане всё просто. QMK поддерживает так называемы «слои» — когда все кнопки или группа кнопок могут иметь более одного код-сигнала. На данном этапе замачиваться не стал и сделал вот так:

q3_xgfkrf19l4o5pwye_djgxdlw.png

vbzdx7f1fxlep7qhso4rpohqqly.png

Прошу понять и простить — в ширину экрана весь текст не влез поэтому два скриншота.
Просто задал ещё один слой [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) за то, что однажды сказал мне «дядь, пили пост!» и я начал пилить пост;
  • Моей жене Регине.

p-u9l27ynelxi92bcmdxhu76ma8.png

© Habrahabr.ru