Когда я листал доски объявлений, на глаза попалась отличная клавиатура «Электроника МС 7004». Даже по современным меркам клавиатура выглядит просто потрясающе. У неё есть откидной блок со светодиодами, клавиши механика. И она настолько крутая, что даже сейчас на ней хочется работать. Но, как обычно есть один маленький нюанс: у неё свой интерфейс и электропитание.
Такие клавиатуры встречаются часто, выглядят стильно и, в общем-то, можно получить уникальное устройство ввода, но как же её подключить? Этим вопросом я занялся уже после покупки, потому что клавиатура была крута, и вылилось всё в интересное копание в схемотехнике клавиатуры, протоколах и многом другом.
❯ Историческая справка
В одном из объявлений была дана интересная историческая справка на эту клавиатуру, приведу её, поскольку она достаточно исчерпывающе описывает, что это такое.
Ретро клавиатура МС7004 — это клавиатура, которая является аналогом клавиатуры LK201 производства компании DEC. МС7004 использовалась с рядом советских ЭВМ конца 80-х годов, совместимых с архитектурой PDP-11, например, ДВК-3, ДВК-3М, Квант-4С, Электроника-85, и, вполне возможно, что ещё на кое-каких машинах. Сама клавиатура построена на микроконтроллере, и связь с ЭВМ осуществляется через стандартный последовательный порт. Принцип работы кнопок — ёмкостный. Раскладка клавиатуры — JCUKEN, в отличие от аналога LK201 с раскладкой QWERTY.
Это очень интересный момент, что клавиатура использовалась не только с определёнными ЭВМ, но и применялась для различных типов. И ещё то, что она совместима с иностранной клавиатурой LK201, и, забегая вперёд, скажу, что совместима достаточно хорошо.
Стоит даже их сравнить между собой, чтобы понять, что копировали их очень близко.
Клавиатура «Электроника» МС 7004 (фото любезно предоставлены xlat)
Оригинальная клавиатура DEC LK201 (фото с сайта)
Про оригинальную клавиатуру LK201, с которой была скопирована клавиатура «Электроника» МС 7004, стоит рассказать более подробно.
Форм-фактор этой клавиатуры определил стандарт клавиатур, которым мы пользуемся и сейчас. Основная область ввода стала стандартом ISO, клавиатура QWERTY с вертикальной клавишей Enter (которой в копии, увы, нет), клавиша Tab находится слева от «Q», а клавиша "<" слева от «Z». Как и у предыдущей модели, которая была прародителем это — клавиатуры для терминала VT102, клавиши управления и клавиша Caps Lock находятся слева от клавиши «A». Клавиши вставки, удаления (insert, del) были перемещены в новую группу клавиш, чтобы справа от клавиши ввод было место.
LK201 также была первой клавиатурой с клавишей Shift, расположенной слева от пробела.
Главной отличительной чертой клавиатуры была компоновка клавиш курсора, в виде перевёрнутой буквы Т. Хотя LK201 не была первой клавиатурой, в которой использовалось такое расположение, она была выбрана после серьёзных исследований удобства использования. Был ли дизайн заново изобретён независимо или скопирован с более ранней клавиатуры, неизвестно.
Компоновка перевёрнутой-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
После ознакомления со всеми историческими материалами, и осознанием того, что мне предстоит, было принято решение купить эту клавиатуру. На данный момент достаточно легко, пока ещё, можно найти эти клавиатуры в продаже. И ценник на них более чем адекватен, особенно для такой удивительной модели.
Поэтому спустя пару недель приехала мне такая красавица, с откидной крышкой, под которой видны светодиоды.
Обратите внимание, что раскладка английской клавиатуры фонетическая JCUK, как и на всех отечественных компьютерах, и это ужасно…
Для того чтобы просто включить клавиатуру (подать питание), пришлось рыть кучу документации. Нашёл неплохой сайт по ДВК, где приведены два типа паспорта (см. раздел «Клавиатура МС 7004»). В паспорте самое ценное — это схема и коды клавиш. Как ни странно, далее английская документация оказалась более полной. Итак, схема подключения.
Схема разъёма клавиатуры
У этой модели клавиатуры съёмный провод, можно подключиться непосредственно к плате, либо к стандартному 5-контактному разъёму типа DIN. Выбрал второй вариант, и для этого набросал распиновку разъёма для подключения. Обязательно при таких операциях перепроверяйте, где находится питание, особенно если оно 12 В!
Распиновка разъёма
Попутно с подключением сделал неполный разбор для чистки. Хотел разобрать полностью, но побоялся, что сломаю крепления пластика, который от возраста стал хрупким. Поэтому полностью клавиатуру мне разобрать не удалось.
Первый успешный запуск клавиатуры
На фотографии видно, что я уже перехватываю нажатия клавиш, с помощью осциллографа. Клавиатура потребляет достаточно большой ток 0,3 А, при 12 В — это уже 3,6 Вт! Что, как по мне, для обычной клавиатуры многовато.
Теперь момент истины — подключить её к компьютеру. Как уже говорил выше, интерфейс у клавиатуры RS-423 (то есть сигналы имеют уровень ± 5 вольт относительно земли). Но решил рискнуть и подключил через шнурок USB-COM, настроил терминалку на 4800 8N1 и, всё заработало!
Оно живое!
Помните, я говорил, что клавиатура имеет фонетическую раскладку? Самое удивительное, что слизали всё подчистую, и коды клавиш точно соответствуют кодам клавиш по физическому расположению у оригинальной клавиатуры LK201.
Коды клавиш LK201, которые точно соответствуют кодам клавиш МС 7004
Вот это поворот! Значит, не нужно будет переучиваться, осталось сделать железку конвертер. И казалась задачей простой и быстрой.
❯ Тщетная попытка сделать конвертер
Есть два пути для подключения подобной клавиатуры: подключить её к COM-порту и написать свой драйвер и сделать преобразователь в USB-HID. Первый вариант прост, но плох тем, что клавиатура будет привязана к конкретной машине, а второй более сложен, но более универсален.
Решил реализовывать второй вариант, питание брать от USB, повышать его, а в качестве USB-HID использовать модуль Arduino Leonardo.
Взял остатки старых своих проектов, которые вы даже когда-то видели в моей статье "С чего начинается устройство". Там как раз есть подходящий корпус, DIN-разъём и макетная плата.
Остатки старых проектов
Одной из задач было получать питание 12 В, и сделать преобразователь RS-423. Последнее можно реализовать на max232. В результате у меня получилась такая платка, с max232 и повышающим преобразователем от USB.
Но радость была недолгой, при подключении клавиатуры тока порта не хватало, и всё просаживалось в ноль. Поэтому такая схема питания оказалась неработоспособной. Затем, с большим трудом добытая дефицитная 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-логике. Затем заменить прошивку в ПЗУ. Схемы клавиатуры можно найти в паспортах на сайте.
В журнале «Радио» за ноябрь 1991 года было техническое описание такой переделки.
И там даётся текстовое описание, что нужно сделать с клавиатурой. Единственное, что может вызвать проблемы – это набор кода вручную, а также найти программатор и УФ стиратель, чтобы стереть и прошить ПЗУ. Подробнее, как это сделать, можно прочитать в моей статье "Что с памятью моею стало".
Любопытно взглянуть, какое же расположение клавиш получится после такой переделки, и там тоже оно приведено.
Раскладка после переделки из журнала «Радио»
Как видно, остаётся достаточно много свободных клавиш, которым можно добавить нужный функционал, например, добавить клавишу Win, скан-коды которой, соответственно, 0x5B
левой и 0x5C
– правой.
Но, если вам этот путь кажется сложным, есть другой вариант – это заменить микроконтроллер КМ1816ВЕ48 на Arduino Leonardo и уже ей заниматься сканированием клавиш. Схему питания тоже придётся переделывать, но на выходе уже получим USB-HID. Но, в любом случае мы потеряем в аутентичности.
❯ Выводы
Проковырявшись месяц с этим проектом, посидев за кодом, так и не пришёл к элегантному решению подключения клавиатуры к ПК. Вроде бы всё и так ясно, но вот чтобы было красиво, так и не придумал. В результате проект был заброшен на шкаф, а впоследствии всё оборудование было распродано, включая саму клавиатуру.
Клавиатура, без сомнения, очень красивая, украсила стол любого программиста, но увы, слишком уж много мороки было с ней. Нужно, иногда бывает оценить свои силы и отказаться от тупиковых проектов, даже если они выглядят достаточно круто.
❯ Полезные ссылки
Историческая справка о клавиатуре DEC LK201.
Фотосессия клавиатур «Электроника МС 7004» от xlat.
Сайт по ДВК.
LK201 Keyboard Interface.
«Радио» за ноябрь 1991 года
Моя статья о том как работать с ПЗУ.
Примеры кода первый и второй (обязательно посмотрите всю репу, кто будет писать самостоятельно).
P.S. Если вам интересно моё творчество, вы можете следить за мной ещё в телеграмме.
Автор: Сергей