Приветствую всех!
Этот шедевр советской компьютерной промышленности знаком любому интересующемуся компьютерной историей. А некоторые из тех, кому довелось с ним работать, называли его не иначе как «крысой». И вот спустя много десятилетий после его выпуска я задумался: а что, если подключить этот девайс к обычному компьютеру? Именно этим мы сегодня и займёмся.
Итак, в сегодняшней статье поговорим про мышь от советского персонального компьютера ЕС1841. Узнаем, как заставить её работать и так ли она сурова, как можно подумать. Традиционно будет много интересного.
❯ Суть такова
Вдохновившись постом товарища Arcanum7 про клавиатуру от Robotron 1715 и другим постом от dlinyj про терминальную клаву МС7004 от ДВК, я вспомнил про ещё одно не менее легендарное устройство ввода той эпохи — мышь от ЕС ПЭВМ. Вообще, девайс достаточно известный, много где упоминавшийся и куда только не подключавшийся. Но вот к обычному компу его ещё не подключали (или я просто не нашёл такого). Самое время восполнить этот пробел.
❯ Немного про сами ПЭВМ
Как и другие машины «Единой системы», ЕС1841 очень круто выглядит и отличается такой же суровостью. Компьютер сильно отличается от привычных нам ПК — вместо материнки тут кросс-плата, в которую втыкаются модули (они же типовые элементы замены), вместо шлейфов — жгуты проводов, кулеры работают от 220 вольт.
Характеристики по меркам ретрокомпьютеров внушают уважение: процессор К1810ВМ86 (отечественный функциональный аналог Intel 8086), возможность установки до полутора мегабайт памяти, CGA-видеоадаптер.
Увы, ввиду не слишком высокой надёжности и большого количества дорогих радиодеталей внутри, выжило раритетных ЭВМ совсем немного. От этого рабочие экземпляры очень ценятся среди любителей.
❯ Обзор оборудования
А вот и мышь. Саму ПЭВМ уже не достать, а вот крысу — запросто. Она оснащена тремя кнопками, причём все нажимаются как-то по-разному. Скорее всего, это особенность конкретного экземпляра, новая мышь таких косяков иметь не должна.
С обратной стороны та самая легендарная маркировка «Манипулятор графической информации», крепёжные винты корпуса, а также цельнометаллический шарик. Вместо привычных фторопластовых ножек тут три маленьких шарика, выполняющих роль шаровых опор, благодаря которым мышь по сути не скользит, а катается, что очень облегчает перемещение.
Разъём. Он тут очень редкий, ответную часть к нему найти не удалось. Но с ним мы разберёмся чуть позже. К нему подходит кабель, представляющий собой жгут проводов в трубке из ПВХ.
Маркировка на разъёме.
Шарик снят. Видны три ролика — два рабочих и один вспомогательный, прижимающий шарик к двум другим. Во всех мышах, что я видел, шарик и ролики были немного ржавыми, эта — не исключение. Ролики внутри корпуса сидят на маленьких шарикоподшипниках, которые в моей мыши даже умудрились дожить до наших дней. Впрочем, вскрывать её я не буду — стало жалко отковыривать всё ещё сохранившуюся пломбу, благо хранилась мышь в хороших условиях и обслуживания не требует.
Шарики. Справа наш, слева для сравнения лежит от обычной COM-мыши. В нашей он больше и тяжелее. Некоторые считают, что этот шарик от подшипника, но это не так, он тут фрезерованный (следы обработки видны при детальном осмотре) специально для этой мыши.
❯ Контрольное взвешивание
В интернете полно всякой ерунды про то, что эта мышь весит чуть ли не килограмм и может использоваться как предмет самообороны. Точных данных об её массе сходу не нашёл, так что самое время выяснить всё самому, а заодно и провести сравнение, навсегда закрыв все неточности.
Итак, кладём подопытный экземпляр на весы. Масса мыши без кабеля — всего 186 граммов. Ни о каких килограммах речи даже не идёт.
Целиком она весит тоже не так уж и много. Кабель достаточно мягкий и гибкий, хотя и более толстый, чем у импортных собратьев.
А вот для сравнения популярная в первой половине девяностых мышь GM-6, по форм-фактору похожая на эту.
И, напоследок, типичная COM-мышь из поздних девяностых.
Масса шарика отдельно — 67 граммов, считай, треть от всего манипулятора.
Как можно видеть, грызун несколько тяжелее своих собратьев, но не настолько, насколько может показаться. Иные современные игровые мыши (особенно те, куда вставляются специальные дополнительные грузики) запросто могут быть ещё массивнее и тяжелее. Да и размер у неё тоже вполне «мышиный», без существенных отклонений. Так что увы, но все подобные рассказы про её свойства — не более чем красивая байка.
❯ Внутренности
Как я уже говорил, разбирать мышь я не стал. Так что будем довольствоваться фото с просторов.
Внутри неё две платы — с кнопками и с оптопарами. Из микросхем только триггер Шмитта К561ТЛ1, служащий для формирования правильных фронтов сигналов от фотодатчиков роликов.
Плата отдельно (фото отсюда). Отчётливо видны суровые отечественные ИК-светодиоды и фотодиоды. Также справа внизу заметны те самые шарикоподшипники.
❯ Bus mouse и всё об этом
Теперь очередь интерфейса. Сразу приведу распиновку разъёма мыши:
Нумерация контактов на картинке отвратительного качества, поэтому продублирую её у себя:
Как видно, мышь не подключается ни по COM, ни по PS/2, ни по какому-то иному стандартному интерфейсу. С некоторой натяжкой её и вовсе можно назвать аналоговой (хотя, конечно, это не так, выходы у неё таки цифровые).
Она принадлежит к семейству так называемых «шинных мышей», они же Bus mouse (не путать с Apple Desktop Bus). Внутри такой мыши нет ничего кроме кнопок и датчиков, взаимодействием с компьютером же занимается специальный контроллер (как нетрудно догадаться, его-то мы и будем сейчас разрабатывать). Именно это мы и могли видеть в нашей мышке. Так что самое время попробовать её подключить и узнать, работает ли она вообще.
❯ Разъём
Как я уже говорил, ответную часть к её штекеру достать довольно таки тяжело. Но выход всё-таки есть.
Для этого нам понадобится копеечная деталь — разъём PBD-12, который надо подвергнуть нескольким нехитрым модификациям.
С той стороны, где у мыши находится ключ, выдёргиваем один контакт и делаем в этом месте пропил для ключа (с осторожностью, первый разъём в ходе этих манипуляций у меня треснул). Дальше немного дорабатываем напильником — разъём, рассчитанный на дюймовую систему вместо метрической, в это прокрустово ложе лезет с трудом. Модифицированный экземпляр прекрасно насаживается и обеспечивает рабочий контакт, что нам и было нужно. Видел, кто-то просто разобрал этот разъём на мышке, выкинул внутренности и вставил туда вилку IDC типа BH-10, но это не наш путь.
❯ Про подключение
Чтобы заставить мышь работать с современным компьютером, нужен МК с поддержкой USB HID.
У меня уже давно лежала плата Digispark на чипе ATTiny85 (давным-давно экспериментировал с Bad USB), которую хотелось использовать в каком-нибудь проекте. Одна проблема: выводов у неё маловато. Но этот нюанс я предполагал исправить при помощи чипа 74HC165, понадеявшись, что шариковая мышь работает достаточно медленно и скорости опроса этого регистра будет достаточно.
Для тестов даже собрал на макетной плате схему с разъёмом и этим регистром. Но, как показали опыты, надежды не оправдались, работало оно так себе. Поэтому эту плату отложим до лучших времён, а для мыши придумаем что-то более надёжное.
❯ Что же выберем?
Следующим кандидатом стала банальная плата Arduino Pro Micro. Взял я её исключительно из-за пятивольтовых уровней и более-менее стабильной реализацией библиотеки HID (таковая в более дешёвой Raspberry Pico проверялась мною при создании контроллера машиниста для тренажёра и показала себя довольно таки не очень). Подключаем мышь к плате, заливаем тестовый скетч, катаем грызуна по столу и убеждаемся, что при вращении шарика какие-то импульсы действительно идут. Отлично, оно работает.
❯ Координаты
Теперь разберёмся, как работать с этими данными. С точки зрения схемотехники мышь — просто два энкодера, при вращении выдающих по два сдвинутых по фазе прямоугольных сигнала. Так что идём на просторы, берём первый попавшийся скетч для работы с энкодером и допиливаем его под свои нужды:
Тестовый скетч
#define Xa 5
#define Xb 6
#define Ya 7
#define Yb 8
bool XmotionDetected = false, YmotionDetected = false;
int counterX = 0, counterY = 0;
bool CW_X, CW_Y;
void setup() {
// put your setup code here, to run once:
pinMode(Xa, INPUT);
pinMode(Xb, INPUT);
pinMode(Ya, INPUT);
pinMode(Yb, INPUT);
Serial.begin(115200);
}
void loop() {
// put your main code here, to run repeatedly:
updateCounters();
}
void updateCounters()
{
if (!digitalRead(Xa) && !digitalRead(Xb) && XmotionDetected ) //in a detent and just arrived
{
if (CW_X)
{
counterX++;
}
else
{
counterX--;
}
XmotionDetected = false;
Serial.print("X: ");
Serial.print(counterX);
Serial.print(" Y: ");
Serial.println(counterY);
}
if (!digitalRead(Xa) && digitalRead(Xb) && !XmotionDetected ) // just started CW
{
CW_X = true;
XmotionDetected = true;
}
if (digitalRead(Xa) && !digitalRead(Xb) && !XmotionDetected ) //just started CCW
{
CW_X = false;
XmotionDetected = true;
}
if (!digitalRead(Ya) && !digitalRead(Yb) && YmotionDetected ) //in a detent and just arrived
{
if (CW_Y)
{
counterY--;
}
else
{
counterY++;
}
YmotionDetected = false;
Serial.print("X: ");
Serial.print(counterX);
Serial.print(" Y: ");
Serial.println(counterY);
}
if (!digitalRead(Ya) && digitalRead(Yb) && !YmotionDetected ) // just started CW
{
CW_Y = true;
YmotionDetected = true;
}
if (digitalRead(Ya) && !digitalRead(Yb) && !YmotionDetected ) //just started CCW
{
CW_Y = false;
YmotionDetected = true;
}
}
Загружаем его, и теперь при движении мыши в последовательный порт отправляется примерно следующее:
Отлично, работает именно так, как я и думал.
❯ Управление мышью
Теперь, убедившись, что всё работает, добавляем работу с HID, получая вот такой скетч:
#include "Mouse.h"
#define LBUTTON 2
#define MBUTTON 3
#define RBUTTON 4
#define Xa 5
#define Xb 6
#define Ya 7
#define Yb 8
#define X_STEP 7
#define Y_STEP 7
bool XmotionDetected = false, YmotionDetected = false;
int counterX = 0, counterY = 0;
int dirX = 0, dirY = 0;
bool CW_X, CW_Y;
void setup() {
// put your setup code here, to run once:
pinMode(LBUTTON, INPUT_PULLUP);
pinMode(MBUTTON, INPUT_PULLUP);
pinMode(RBUTTON, INPUT_PULLUP);
pinMode(Xa, INPUT);
pinMode(Xb, INPUT);
pinMode(Ya, INPUT);
pinMode(Yb, INPUT);
Mouse.begin();
}
void loop() {
// put your main code here, to run repeatedly:
updateCounters();
if (dirX || dirY) {
Mouse.move(dirX * X_STEP, dirY * Y_STEP, 0);
dirX = 0;
dirY = 0;
}
updateButtons();
}
void updateCounters()
{
if (!digitalRead(Xa) && !digitalRead(Xb) && XmotionDetected ) //in a detent and just arrived
{
if (CW_X)
{
dirX = 1;
counterX++;
}
else //CCW
{
dirX = -1;
counterX--;
}
XmotionDetected = false;
}
if (!digitalRead(Xa) && digitalRead(Xb) && !XmotionDetected ) // just started CW
{
CW_X = true;
XmotionDetected = true;
}
if (digitalRead(Xa) && !digitalRead(Xb) && !XmotionDetected ) //just started CCW
{
CW_X = false;
XmotionDetected = true;
}
if (!digitalRead(Ya) && !digitalRead(Yb) && YmotionDetected ) //in a detent and just arrived
{
if (CW_Y)
{
dirY = 1;
counterY--;
}
else //CCW
{
dirY = -1;
counterY++;
}
YmotionDetected = false;
}
if (!digitalRead(Ya) && digitalRead(Yb) && !YmotionDetected ) // just started CW
{
CW_Y = true;
YmotionDetected = true;
}
if (digitalRead(Ya) && !digitalRead(Yb) && !YmotionDetected ) //just started CCW
{
CW_Y = false;
YmotionDetected = true;
}
}
void updateButtons() {
if(!digitalRead(LBUTTON)) {
if (!Mouse.isPressed(MOUSE_LEFT)) {
Mouse.press(MOUSE_LEFT);
}
}
else {
if (Mouse.isPressed(MOUSE_LEFT)) {
Mouse.release(MOUSE_LEFT);
}
}
if(!digitalRead(RBUTTON)) {
if (!Mouse.isPressed(MOUSE_RIGHT)) {
Mouse.press(MOUSE_RIGHT);
}
}
else {
if (Mouse.isPressed(MOUSE_RIGHT)) {
Mouse.release(MOUSE_RIGHT);
}
}
if(!digitalRead(MBUTTON)) {
if (!Mouse.isPressed(MOUSE_MIDDLE)) {
Mouse.press(MOUSE_MIDDLE);
}
}
else {
if (Mouse.isPressed(MOUSE_MIDDLE)) {
Mouse.release(MOUSE_MIDDLE);
}
}
}
Прост он настолько, насколько это возможно: при сдвиге мыши в нужном направлении курсор на компе двигается на заданное число пикселей.
Заливаем скетч и пробуем. Невероятно! Работает с первого раза!
❯ Что же в итоге?
Как оказалось, подключить мышь оказалось проще простого — запустил я её буквально за час, двадцать минут из которого я паял разъём и зачищал МГТФ. Работает она также беспроблемно.
Конечно, тут могла бы быть фраза про то, что с тех пор я подключил эту мышь к компу и использую её как основную… но ничего подобного не будет. Главной проблемой её оказалось очень низкое разрешение, из-за которого приходится либо сильно задирать расстояние одного шага, отчего курсор при движении начинает пропускать пиксели, либо мириться с тем, что указатель едет плавно, но очень медленно, как будто увязая. Всё же эпоха шариковых мышей с их довольно таки неточными энкодерами безвозвратно ушла.
Но вот что было действительно приятным в этой штуке, так это шариковые опоры. Благодаря ним мышь очень плавно и с приятным звуком катается по столу и никогда не перестанет заедать.
Такие дела.
Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud — в нашем Telegram-канале ↩