Используем телетайп Consul 254 вместо клавиатуры для Arduino

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Из документации:

Электрифицированная пишущая машина Consul 254 предназначена:

а) для ввода алфавитно-цифровой информации в ЭВМ при печатании оператора на клавиатуре машины

б) для вывода алфавитно-цифровой информации в порядке печати на лист или рулон бумаги по сигналам, посылаемым от ЭВМ

в) для применения в устройствах подготовки данных или в других устройствах, параметры которых соответствуют параметрам указанной машины

Сегодня мы займёмся пунктом "а" - будем читать данные с клавиатуры с помощью ЭВМ Arduino Uno.

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

Сеанс игры в бейсбол из книги 1973 года "101 компьютерная игра на бейсике"
Сеанс игры в бейсбол из книги 1973 года "101 компьютерная игра на бейсике"

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

Зато если подключить ЭВМ, то можно будет вводить в неё информацию с помощью клавиатуры. С печатью я пока разбираться я не стал, а просто взял символьный ЖК-дисплей, чтобы выводить набираемый текст.

Берём три таких разъёма и втыкаем их в Arduino. 
В каждом разъёме 26 контактов, помеченных буквами от A до Z
Берём три таких разъёма и втыкаем их в Arduino. В каждом разъёме 26 контактов, помеченных буквами от A до Z

Разъёмы для подключения к ЭВМ имеют нумерацию (внезапно) I, IV, V. По соединяющимся буквам I V или по их интерпретации в качестве римских чисел можно было бы предположить, что I слева, V справа, а IV посередине, но это не так. К счастью, эти номера выгравированы снизу корпуса.

Телетайп, вид снизу. Скан документации
Телетайп, вид снизу. Скан документации

Клавиши машины подключены к шифратору, выдающему восьмибитный код. При нажатии на кнопку, внутри машины щёлкают релюшки, и на выходе шифратора можно увидеть код этой клавиши. Чтобы узнать, что пора считывать выходной символ, есть ещё пара контактов.

Выход с шифратора клавиатуры
Выход с шифратора клавиатуры

Интересующие нас выходные контакты шифратора (который чехословаки перевели как комбинатор) обозначены буквами от C до K. В документации приведена таблица сканкодов, с помощью которой мы и переведём их в ASCII. Сканкод формируется выходами DEFGHIKJ (именно в таком порядке!), на которые попадает напряжение с выхода (или входа?) C. То есть, если подключить C к питанию, то с соответствующих выходов D-J можно будет это питание "прочитать". Или то же самое можно проделать с "землёй".

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

Схема того, что получилось
Схема того, что получилось

Для обозначения того, что символ пора читать, машина с помощью реле замыкает цепь AB. Контакт B в нашей схеме соединён с "землёй". Поэтому A тоже притягивается к "земле" при переключении реле. Для борьбы с дребезгом контактов к этой линии подключен конденсатор - множественных срабатываний не будет.

Временная диаграмма сигналов на выходе с клавиатуры
Временная диаграмма сигналов на выходе с клавиатуры

Из временной диаграммы следует, что на выходе шифратора данные появляются как раз перед тем, как замыкаются контакты AB (что вполне логично). Поэтому в цепях C-D..K бороться с дребезгом не нужно.

Чтобы дождаться прихода символа, программа мониторит напряжение на 12 цифровом входе, подключенном к A. Можно было бы направить сигнал с A на вход контроллера прерываний, чтобы сэкономить электричество, но для демонстрационных целей это ни к чему.

Код считывания нажатий клавиш и вывода на экран
void loop() {
    if (!digitalRead(12)) {
      unsigned int v = 0;
      for (int i = 2 ; i <= 9 ; ++i)
        v = (v << 1) + digitalRead(i);
      if (v == LOWREG) {
        reg = false;
      } else if (v == HIGHREG) {
        reg = true;
      } else {
        if (reg) {
          v = v ^ 3;
        }
        lcd.write(table[v]);
        if (x == 16) {
          lcd.scrollDisplayLeft();
        } else {
          ++x;
        }
      }
      delay(50);
    }
}

Полученные коды клавиш декодируются в символы с помощью захардкоженной таблицы и выводятся на ЖК-дисплей. После этого процессор ждёт 50 мс, потому что в документации сказано, что чаще читать нельзя. Заодно и линия AB разомкнётся за это время.

Раскладка клавиатуры
Раскладка клавиатуры

На каждой клавише нарисовано по 2 символа - один для верхнего регистра, другой для нижнего. Русские буквы дисплей сам по себе показывать не умеет, а добавлять их мне было лень. Если что, для этого есть отдельная библиотека. Поэтому текст для демонстрации я набираю по-английски. Но чтобы набирать латиницу, нельзя просто переключить язык. Некоторые из нужных символов находятся в нижнем регистре, а некоторые в верхнем (те, которые совпадают по начертанию с кириллицей).

Клавиши переключения регистра (НР, ВР) на клавиатуре, вопреки ожиданиям, не меняют состояния машины, а просто посылают соответствующий сканкод наружу, в ЭВМ. Компьютер большой, ему видней.

Пришлось реализовывать переключение регистра в программе. Сканкоды для разных регистров одной клавиши отличаются инвертированными последними двумя битами. Поэтому чтобы найти код верхнего символа, зная нижний (и наоборот), надо всего лишь выполнить с ним "xor 3".

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

Итак, печатать оператор может, а что же с выводом на бумагу? Это немного сложнее. Для поступающих от ЭВМ данных дешифратора нет. Нужно напрямую управлять входами матрицы, составленной из электромагнитных реле. То есть, добыть питание 12 вольт и 20 выводов, которые будут включать эти реле через разъём I. Оставим это на следующий раз.

Ссылки

  1. Репозиторий с кодом для Arduino.

  2. Consul 254. Техническое описание.

  3. 101 BASIC Computer Games.

Источник: https://habr.com/ru/post/687964/


Интересные статьи

Интересные статьи

Любите ли вы I²C так же, как люблю я? Поистине, гениальное изобретение - можно подключить до 64 устройств всего по двум проводам (не считая питания). Сегодня статья - туториал для новичков. Сегодня мы...
Найти идеальный баланс между ценой и качеством пытаются дизайнеры и разработчики любого производителя. Но часто случается, что излишняя оптимизация или «гениальный» дизайн выливаются в кучу проблем дл...
Для рассмотрения подключения использовалась матрица TC15-11.Описание конструкции: Читать далее
Данная статья мотивирована необходимостью построить более общую картину, что такое жизнь (и какой она может быть) по отношению к остальным явлениям во Вселенной.(Является...
VR-гарнитуры, конечно, делают жизнь интереснее: некоторый контент с ними воспринимается куда интереснее. Даже ролики с Youtube, становясь чуть объемнее, буквально переносят тебя в твой персональн...