Как стать автором
Обновить
2622.03
Timeweb Cloud
То самое облако

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

Время на прочтение13 мин
Количество просмотров14K

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

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

Есть у меня друг лепший, Артём Кашканов, известный на Хабре 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-канале

Теги:
Хабы:
Всего голосов 95: ↑95 и ↓0+95
Комментарии74

Публикации

Информация

Сайт
timeweb.cloud
Дата регистрации
Дата основания
Численность
201–500 человек
Местоположение
Россия
Представитель
Timeweb Cloud

Истории