Подключение советской клавиатуры Электроника МС 7004 к современному ПК

cwzg2wkukr2sd-9u1kf2c8qpzrk.jpeg


Листая доски объявлений, на глаза попалась отличная клавиатура «Электроника МС 7004». Даже по современным меркам клавиатура выглядит просто потрясающе. У неё есть откидной блок со светодиодами, клавиши механика. И она настолько крутая, что даже сейчас на ней хочется работать. Но, как обычно есть один маленький нюанс: у неё свой интерфейс и электропитание.

Такие клавиатуры встречаются часто, выглядят стильно и, в общем-то, можно получить уникальное устройство ввода, но как же её подключить? Этим вопросом я занялся уже после покупки, потому что клавиатура была крута, и вылилось всё в интересное копание в схемотехнике клавиатуры, протоколах и многом другом.

Историческая справка


В одном из объявлений была дана интересная историческая справка на эту клавиатуру, приведу её, поскольку она достаточно исчерпывающе описывает, что это такое.

Ретро клавиатура МС7004 — это клавиатура, которая является аналогом клавиатуры LK201 производства компании DEC. МС7004 использовалась с рядом советских ЭВМ конца 80-х годов, совместимых с архитектурой PDP-11, например, ДВК-3, ДВК-3М, Квант-4С, Электроника-85, и, вполне возможно, что ещё на кое-каких машинах. Сама клавиатура построена на микроконтроллере, и связь с ЭВМ осуществляется через стандартный последовательный порт. Принцип работы кнопок — ёмкостный. Раскладка клавиатуры — JCUKEN, в отличие от аналога LK201 с раскладкой QWERTY.


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

h16lvnbwn_dfczjt93lspdqhajg.jpeg
Клавиатура «Электроника» МС 7004 (фото любезно предоставлены xlat)

bhhfxhdfas1aop9yps0lurxkupe.jpeg
Оригинальная клавиатура DEC LK201 (фото с сайта)

Про оригинальную клавиатуру LK201, с которой была скопирована клавиатура «Электроника» МС 7004, стоит рассказать более подробно.
Форм-фактор этой клавиатуры определил стандарт клавиатур, которым мы пользуемся и сейчас. Основная область ввода стала стандартом ISO, клавиатура QWERTY с вертикальной клавишей Enter (которой в копии, увы, нет), клавиша Tab находится слева от «Q», а клавиша »<" слева от «Z». Как и у предыдущей модели, которая была прародителем это — клавиатуры для терминала VT102, клавиши управления и клавиша Caps Lock находятся слева от клавиши «A». Клавиши вставки, удаления (insert, del) были перемещены в новую группу клавиш, чтобы справа от клавиши ввод было место.

LK201 также была первой клавиатурой с клавишей Shift, расположенной слева от пробела.
Главной отличительной чертой клавиатуры была компоновка клавиш курсора, в виде перевёрнутой буквы Т. Хотя LK201 не была первой клавиатурой, в которой использовалось такое расположение, она была выбрана после серьёзных исследований удобства использования. Был ли дизайн заново изобретён независимо или скопирован с более ранней клавиатуры, неизвестно.

i8aixmn-rn-tcmlywgpgtpkduym.png
Компоновка перевёрнутой-T, представленная LK201

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

В 1983–1984 годах рабочая группа инженеров IBM, разрабатывавшая IBM Enhanced Keyboard (Model M), использовала макет LK201, включая его фирменный кластер стрелок в виде перевёрнутой буквы T, но переместила его на одну строку вниз.
Поскольку отечественную клавиатуру скопировали весьма точно, то и электрический интерфейс оказался полностью совместим. Поэтому стоит пару слов сказать и о нём.

Клавиатура LK201 питается от 12 В, которые поступают от компьютера. Клавиатура и компьютер, к которому она подключена, общаются через относительно стандартный последовательный интерфейс.

  • Двунаправленное асинхронное последовательное соединение: 4800 бод, 8N1.
  • Уровни последовательного интерфейса соответствуют стандарту EIA RS-423 (т.е. колебания сигналов ± 5 вольт).
  • Потребляемая мощность: 4,2 Вт Макс. 350 мА при 11,8 В ± 6%.
  • Здесь следует особенно остановиться на интерфейсе RS-423, его отличие от интерфейса RS-232 в амплитуде передаваемого сигнала. У RS-423 — это от минус 5 до +5 В, а у RS-232 от минус 15 до +15 В. Таким образом, в целом можно подключать клавиатуру и к интерфейсу RS-232 с некоторыми оговорками.


Специально подробно остановился на этих моментах, потому что они полезны будут и для подключения клавиатуры МС7004.

«Электроника» МС 7004


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

Поэтому спустя пару недель приехала мне такая красавица, с откидной крышкой, под которой видны светодиоды.

ugi0tqxsnh9sbcxeqdlpqa1adh0.jpeg

qv0p8lua6-kkvhijxedoy9s8di4.jpeg

Обратите внимание, что раскладка английской клавиатуры фонетическая JCUK, как и на всех отечественных компьютерах, и это ужасно…
Для того чтобы просто включить клавиатуру (подать питание), пришлось рыть кучу документации. Нашёл неплохой сайт по ДВК, где приведены два типа паспорта (см. раздел «Клавиатура МС 7004»). В паспорте самое ценное — это схема и коды клавиш. Как ни странно, далее английская документация оказалась более полной. Итак, схема подключения.

dtg9zaluiafyzphcnxql0ncov4w.png
Схема разъёма клавиатуры

У этой модели клавиатуры съёмный провод, можно подключиться непосредственно к плате, либо к стандартному 5-контактному разъёму типа DIN. Выбрал второй вариант, и для этого набросал распиновку разъёма для подключения. Обязательно при таких операциях перепроверяйте, где находится питание, особенно если оно 12 В!

2-rjevaijkim8b6qntkoeaxx380.jpeg
Распиновка разъёма

Попутно с подключением сделал неполный разбор для чистки. Хотел разобрать полностью, но побоялся, что сломаю крепления пластика, который от возраста стал хрупким. Поэтому полностью клавиатуру мне разобрать не удалось.

lh8freofxxcc8mdnnwp3gbxak2w.jpeg
Первый успешный запуск клавиатуры

На фотографии видно, что я уже перехватываю нажатия клавиш, с помощью осциллографа. Клавиатура потребляет достаточно большой ток 0,3 А, при 12 В — это уже 3,6 Вт! Что, как по мне, для обычной клавиатуры многовато.

Теперь момент истины — подключить её к компьютеру. Как уже говорил выше, интерфейс у клавиатуры RS-423 (то есть сигналы имеют уровень ± 5 вольт относительно земли). Но решил рискнуть и подключил через шнурок USB-COM, настроил терминалку на 4800 8N1 и, всё заработало!

audwsk2ijawht-wpt7rhqgokg24.jpeg
Оно живое!

Помните, я говорил, что клавиатура имеет фонетическую раскладку? Самое удивительное, что слизали всё подчистую, и коды клавиш точно соответствуют кодам клавиш по физическому расположению у оригинальной клавиатуры LK201.

s6stemfkiiqpo0t9cs0vkyeyotc.jpeg
Коды клавиш LK201, которые точно соответствуют кодам клавиш МС 7004

Вот это поворот! Значит, не нужно будет переучиваться, осталось сделать железку конвертер. И казалась задачей простой и быстрой.

Тщетная попытка сделать конвертер


Есть два пути для подключения подобной клавиатуры: подключить её к COM-порту и написать свой драйвер и сделать преобразователь в USB-HID. Первый вариант прост, но плох тем, что клавиатура будет привязана к конкретной машине, а второй более сложен, но более универсален.

Решил реализовывать второй вариант, питание брать от USB, повышать его, а в качестве USB-HID использовать модуль Arduino Leonardo.

Взял остатки старых своих проектов, которые вы даже когда-то видели в моей статье «С чего начинается устройство». Там как раз есть подходящий корпус, DIN-разъём и макетная плата.

fqev_9diofkwdbycbrap-gy2rsu.jpeg
Остатки старых проектов

Одной из задач было получать питание 12 В, и сделать преобразователь RS-423. Последнее можно реализовать на max232. В результате у меня получилась такая платка, с max232 и повышающим преобразователем от USB.

jovuvzu5jfhe6jytfgeb79zlnu0.jpeg

Но радость была недолгой, при подключении клавиатуры тока порта не хватало, и всё просаживалось в ноль. Поэтому такая схема питания оказалась неработоспособной. Затем, с большим трудом добытая дефицитная max232 отказалась работать с интерфейсом RS-423, и не переваривала такой тип напряжения (хотя оно находится в стандартах RS-232). Короче, на этом моё вдохновение закончилось. Повоевал несколько дней, и вечные трудности сильно подрезали вдохновение.

Необходимо было городить внешний источник питания, делать отдельный корпус для подключения клавиатуры. И как-то это выглядело уж слишком убого, клавиатура подключается к преобразователю с блоком питания, чтобы подключаться к ПК. Поэтому руки опустились. Но есть ли пути решения?

Несколько слов о создание ПО для клавиатуры


На самом деле, информации по клавиатуре LK201 достаточно, как и примеров кода, чтобы сделать нормальный преобразователь, не влезая в схемотехнику. Есть прекрасный сайт LK201 Keyboard Interface, где приводятся примеры дефайнов для клавиш, и описание интерфейса работы.

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

/*
 *	Commands to the keyboard processor
 */

#define	LK_PARAM		0x80	/* start/end parameter list */

#define	LK_CMD_RESUME		0x8b
#define	LK_CMD_INHIBIT		0xb9
#define	LK_CMD_LEDS_ON		0x13	/* 1 param: led bitmask */
#define	LK_CMD_LEDS_OFF		0x11	/* 1 param: led bitmask */
#define	LK_CMD_DIS_KEYCLK	0x99
#define	LK_CMD_ENB_KEYCLK	0x1b	/* 1 param: volume */
#define	LK_CMD_DIS_CTLCLK	0xb9
#define	LK_CMD_ENB_CTLCLK	0xbb
#define	LK_CMD_SOUND_CLK	0x9f
#define	LK_CMD_DIS_BELL		0xa1
#define	LK_CMD_ENB_BELL		0x23	/* 1 param: volume */
#define	LK_CMD_BELL		0xa7
#define	LK_CMD_TMP_NORPT	0xc1
#define	LK_CMD_ENB_RPT		0xe3
#define	LK_CMD_DIS_RPT		0xe1
#define	LK_CMD_RPT_TO_DOWN	0xd9
#define	LK_CMD_REQ_ID		0xab
#define	LK_CMD_POWER_UP		0xfd
#define	LK_CMD_TEST_MODE	0xcb
#define	LK_CMD_SET_DEFAULTS	0xd3

Другой пример — это ремап кодов клавиатуры для преобразования к нормальным сканкодам k201-remap.c. И там же в папке выше тоже полезные коды. Пример табличного ремапа:

unsigned char scancodeRemap[256] = {
/* ----- 								*/
/*  0 */ 0,		0,		0,		0,
....

/* 84 */ 0,		0,		0,		0,
/* ----- 				FIND/INSERT	INSERT/HOME	*/
/* 88 */ 0,		0,		0x23,		0x24,
/* ----- REMOVE/PG UP	SELECT/DELETE	PREVIOUS/END	NEXT/PG DN	*/
/* 8c */ 0x25,		0x38,		0x39,		0x3a,
/* ----- 				KP 0				*/
/* 90 */ 0,		0,		0x6b,		0,
/* ----- KP .		KP ENTER	KP 1		KP 2		*/
/* 94 */ 0x6c,		0x65,		0x62,		0x63,
/* ----- KP 3		KP 4		KP 5		KP 6		*/
/* 98 */ 0x64,		0x4e,		0x4f,		0x50,
/* ----- KP ,/KP +	KP 7		KP 8		KP 9		*/
/* 9c */ 0x51,		0x3b,		0x3c,		0x3d,
/* ----- KP -		KP F1/NUM LCK	KP F2/KP /	KP F3/KP *	*/
/* a0 */ 0x3e,		0x26,		0x27,		0x28,
/* ----- KP F4/KP -					LEFT		*/
/* a4 */ 0x29,		0,		0,		0x5f,
/* ----- RIGHT		DOWN		UP		SHIFT Rt	*/
/* a8 */ 0x61,		0x60, 		0x4d,		0x5e,
/* ----- ALT		COMP Rt/CTRL Rt	SHIFT		CONTROL		*/
/* ac */ 0,		0,		0x52,		0x3f,
...

В общем, преобразователь можно сделать и велосипед изобретать с нуля не требуется. Нужно просто найти время, чтобы переработать всю информацию.

Другой путь — аппаратная доработка


Есть более варварский способ — это переделка клавиатуры аппаратно. Есть «аутентичный» способ переделки — это сделать из клавиатуры, классическую DIN-клавиатуру. Нужно будет выкинуть часть преобразователя из 12-ти вольтового питания в 5 вольт, и преобразователь интерфейса RS-423, чтобы всё соответствовало TTL-логике. Затем заменить прошивку в ПЗУ. Схемы клавиатуры можно найти в паспортах на сайте.

zxrzrca5nk9sdzyqmbdsepfalpm.png

В журнале «Радио» за ноябрь 1991 года было техническое описание такой переделки.

qkyvwmkboqprggqyitjnnfqghp8.jpeg

И там даётся текстовое описание, что нужно сделать с клавиатурой. Единственное, что может вызвать проблемы — это набор кода вручную, а также найти программатор и УФ стиратель, чтобы стереть и прошить ПЗУ. Подробнее, как это сделать, можно прочитать в моей статье «Что с памятью моею стало».

hwbtkronxmthlabdbbk-wfji9cq.png

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

uubzttousxaxl4fmvm6pq7msjcs.png
Раскладка после переделки из журнала «Радио»

Как видно, остаётся достаточно много свободных клавиш, которым можно добавить нужный функционал, например, добавить клавишу Win, скан-коды которой, соответственно, 0x5B левой и 0x5C — правой.

Но, если вам этот путь кажется сложным, есть другой вариант — это заменить микроконтроллер КМ1816ВЕ48 на Arduino Leonardo и уже ей заниматься сканированием клавиш. Схему питания тоже придётся переделывать, но на выходе уже получим USB-HID. Но, в любом случае мы потеряем в аутентичности.

Выводы


Проковырявшись месяц с этим проектом, посидев за кодом, так и не пришёл к элегантному решению подключения клавиатуры к ПК. Вроде бы всё и так ясно, но вот чтобы было красиво, так и не придумал. В результате проект был заброшен на шкаф, а впоследствии всё оборудование было распродано, включая саму клавиатуру.

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

Полезные ссылки


Историческая справка о клавиатуре DEC LK201.
Фотосессия клавиатур «Электроника МС 7004» от xlat.
Сайт по ДВК.
LK201 Keyboard Interface.
«Радио» за ноябрь 1991 года
Моя статья о том как работать с ПЗУ.
Примеры кода первый и второй (обязательно посмотрите всю репу, кто будет писать самостоятельно).

P.S. Если вам интересно моё творчество, вы можете следить за мной ещё в телеграмме.

p-u9l27ynelxi92bcmdxhu76ma8.png

© Habrahabr.ru