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

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

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

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

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

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

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

0a1651f9cad9758e5d11a70f3b248b6b.jpg

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

Сеанс игры в бейсбол из книги 1973 года Сеанс игры в бейсбол из книги 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.

© Habrahabr.ru