Pull to refresh
2078.23

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

Reading time13 min
Views13K

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

И вот однажды «кошечки» ко мне постучались сами…

Есть у меня друг лепший, Артём Кашканов, известный на Хабре 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:\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» добавил недостающие элементы матрицы, до тех-пор пока не стало равнозначное количество строк и столбцов по контактам.


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


Матрица настроенная

Данная секция («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:\Users\sam\qmk_firmware\robotron_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. Следуя его советам, первым делом была нарисована моя клавиатура в веб-редакторе клавиатур.



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





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



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

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

Лично я не компилировал, бинарник мне дал товарищ Sigprof, ибо так получилось быстрее.

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

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



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



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



Затем, следуя совету 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();
У меня получилось вот так:





Прошу понять и простить – в ширину экрана весь текст не влез, поэтому два скриншота.

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

Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud — в нашем Telegram-канале

Tags:
Hubs:
Total votes 95: ↑95 and ↓0+95
Comments70

Articles

Information

Website
timeweb.cloud
Registered
Founded
Employees
201–500 employees
Location
Россия
Representative
Timeweb Cloud