Этот шедевр советской компьютерной промышленности знаком любому интересующемуся компьютерной историей. А некоторые из тех, кому довелось с ним работать, называли его не иначе как «крысой». И вот спустя много десятилетий после его выпуска я задумался: а что, если подключить этот девайс к обычному компьютеру? Именно этим мы сегодня и займёмся.
Итак, в сегодняшней статье поговорим про мышь от советского персонального компьютера ЕС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-канале ↩
Читайте также:
Комментарии (32)
Arcanum7
22.11.2024 08:42Приятно вдохновлять, оказывается.
А можно шариковые опоры как-нибудь более подробно показать?
aytugan
22.11.2024 08:42Я почему-то ожидал камеру на штативе с коробочкой с Raspberry PI, которая распознаёт изменение положения мыши и эмулирует современную мышь по USB :)
YMA
22.11.2024 08:42Она принадлежит к семейству так называемых «шинных мышей», они же Bus mouse
Автобусная мышь же ;)
(в-портовая мышь, периодическая мышь, автобусная мышь, Полицейский Участок/2 мышь, без поводка мышь, гениталий на гусеничном ходу и т.п.)
Последнее меня в свое время вообще под стол отправило, и если что, пользовался таким манипулятором, они вроде до сих пор продаются..
MaFrance351 Автор
22.11.2024 08:42Да, причём они довольно недешёвые.
Кстати, тут как раз есть пост про них (того же автора, что и про клаву):
Skigh
22.11.2024 08:42Западные специалисты тоже
занимаются такой фигнёйпроявляют интерес к советской электронике.
acc0unt
22.11.2024 08:42Ох чёрт, опередил!
У меня лежит мышь от ЕС-1845 - то есть такая же, но в военном исполнении. С брутальным металлическим корпусом. Хотел про неё статью написать, но не успел.
Корпус и разъём у неё другой, но электрически она такая же в точности.
MaFrance351 Автор
22.11.2024 08:42Хах. Эта мышь у меня лежала с лета ещё. Раздобыл, потыкал, безуспешно попробовал подрубить к компу и забил. А сейчас вот расчищаю старые черновики, вот и её черёд пришёл.
Хотел про неё статью написать, но не успел.
Есть простор в том, чтобы подумать, как реализовать ускорение и торможение курсора. У меня там в скетче захардкожен коэффициент, который определяет, сколько пикселей будет проходить курсор за один шаг энкодера. И вот есть желание сделать это значение динамическим: если мышь движется медленно, то это значение будет, скажем, 2. А если ведут быстрее, то делаем, например, 10. Я пробовал это реализовать, но что-то не вышло. Если попробовать это сделать, то в теории удобство от работы с данной железкой на современных разрешениях экранов будет сильно выше.
acc0unt
22.11.2024 08:42Это так-то называется "ускорение мыши", и в винде реализовано программно.
Геймеры его часто отключают, или ставят альтернативный софт с кастомными кривыми ускорения, потому что для гейминга стандартная имплементация не очень.
MaFrance351 Автор
22.11.2024 08:42В общем, надо посмотреть в сторону чего-то подобного. Хотя это всё равно костыль, соглашусь.
createaddressforsigning
22.11.2024 08:42Всё же эпоха шариковых мышей с их довольно таки неточными энкодерами безвозвратно ушла.
не совсем - мышцы и мозг помнят что более стабильно-механического и предугадываемого в движении курсора не возникло
MaFrance351 Автор
22.11.2024 08:42А сейчас сидите на трекболе? Ведь шариковых уже не делают...
createaddressforsigning
22.11.2024 08:42трэкбол это скролинг - с usb-шарика сразу на мультитач ещё до всяких айфонов в ноyтбуках был и моментно трэкпоинт что в центре клавы тк на них более предсказуемые траектории курсора
MaFrance351 Автор
22.11.2024 08:42Трекпоинты нравятся. Но я на стационарном ПК, там такое редкость.
createaddressforsigning
22.11.2024 08:42на многих клавах даже не дорогих были и тачи
MaFrance351 Автор
22.11.2024 08:42Большинство таких с маленьким "ноутбучным" ходом клавиш, увы.
seyko2
22.11.2024 08:42Сохранение провода - как бы не очень. Продолжение по идее должно заключаться в замене МК на Esp с Акк. Гулять - так по полной.
dlinyj
Очень круто. Когда-то валялась такая мышь, даже в ЖЖ писал о ней. Но так и не дошли руки её подключить. Если будет возможность, буду признателен за видео работы, чтобы осознать недостатки. Респектую за статью.
MaFrance351 Автор
Вечером выложу тогда.
MaFrance351 Автор
Видно, как за счёт шариковых опор при подталкивании она катается. И как дрыгается курсор при перемещении. Можно, конечно, попробовать какие-то штуки с ускорением (тянешь медленнее - едет попиксельно, быстрее - с каким-то коэффициентом), но я пытался - сходу вышло не особо.
dlinyj
Прям интригующе попробовать :)
MaFrance351 Автор
На самом деле интересные ощущения. Но низкая скорость и отсутствие колёсика мешают...
dlinyj
Колёсико можно эмулировать, тут не проблема. Чутка код поправить. А вот что делать со скоростью - не ясно.
MaFrance351 Автор
Чуть ниже в другом комментарии ответил. Если отталкиваться от скорости передвижения (чтобы рывок мыши приводил к такому же резкому скачку курсора), то может помочь.
dlinyj
Kickdown только для мыши
MaFrance351 Автор
Хорошее сравнение.