Используем телетайп Consul 254 вместо клавиатуры для Arduino
Из документации:
Электрифицированная пишущая машина Consul 254 предназначена:
а) для ввода алфавитно-цифровой информации в ЭВМ при печатании оператора на клавиатуре машины
б) для вывода алфавитно-цифровой информации в порядке печати на лист или рулон бумаги по сигналам, посылаемым от ЭВМ
в) для применения в устройствах подготовки данных или в других устройствах, параметры которых соответствуют параметрам указанной машины
Сегодня мы займёмся пунктом «а» — будем читать данные с клавиатуры с помощью ЭВМ Arduino Uno.
В семидесятых годах подобные машины были основным интерфейсом для взаимодействия человека с компьютерами. Поэтому первые игры, в частности, были полностью диалоговыми, без аркадных механик или огромных лабиринтов на экране.
Сеанс игры в бейсбол из книги 1973 года »101 компьютерная игра на бейсике»
Хотя Consul 254 и называется «пишущей машиной», сама эта машина ничего писать не умеет — клавиатура никак не соединена с печатающим механизмом. Никакого кабеля типа нуль-модема, чтобы просто печатать, тоже не существует. Поэтому без компьютера тут никак.
Зато если подключить ЭВМ, то можно будет вводить в неё информацию с помощью клавиатуры. С печатью я пока разбираться я не стал, а просто взял символьный ЖК-дисплей, чтобы выводить набираемый текст.
Берём три таких разъёма и втыкаем их в 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. Оставим это на следующий раз.
Ссылки
Репозиторий с кодом для Arduino.
Consul 254. Техническое описание.
101 BASIC Computer Games.