Кто не любит звук старой пишущей машинки? Я точно люблю! Вот почему я работаю над превращением своей пишущей машинки Brother AX-25 в терминал Linux.
Аппаратное обеспечение
Клавиатура машинки подключена по матрице 8x11 с помощью кабелей на 8 пинов и на 11 пинов. Когда один из пинов строки соединяется с пином столбца после нажатия клавиши, пишущая машинка обнаруживает это и печатает соответствующий символ.
Матрица клавиатуры пишущей машинки управляется двумя мультиплексорами Arduino Uno. Я использовал мультиплексоры от Amazon, но для этого подойдёт любой цифровой или аналоговый мультиплексор, если он имеет более 11 каналов. Arduino может обмануть пишущую машинку и заставить её думать, что была нажата клавиша. Для этого нужно выбрать канал на каждом мультиплексоре и соединить контакты.
Чтобы подключить Arduino Uno к Raspberry Pi, я построил схему с делителем напряжения. Благодаря этому выходное напряжение 5 В Arduino преобразуется до безопасного уровня Raspberry Pi. Для этого также можно использовать переключатель уровня.
Вот схема:

Программное обеспечение
Вход UART Raspberry Pi включен с помощью raspi-config > Дополнительные параметры > Последовательный порт. Чтобы предотвратить отправку управляющих последовательностей ANSI на Arduino, добавьте export TERM=dumb в конец вашего .bashrc. Я работаю над написанием кода для обработки escape-последовательностей, поэтому в будущем это может не понадобиться.
Как только всё будет настроено, прошейте serial-typewriter.ino на Arduino и включите пишущую машинку!
На видео показана работа машинки и подробно рассказывается о том, как это было сделано. Для тех, кому хочется читать, мы сделали перевод субтитров. Они ниже.
Перевод субтитров:
Хэй, ребята, с вами Artillect!
Перед вами электронная пишущая машинка Brother AX-25, выпущенная в конце 1980-х.
В ней, как и во многих других пишущих машинках, используется механизм ромашкового колеса, разработанный в 1970-х для печати текста. Она также имеет 16-символьный ЖК-дисплей, который позволяет редактировать документы, хранящиеся в его памяти объёмом 8 КБ.
Сейчас, когда вы легко можете получить доступ к текстовым редакторам практически на любом устройстве с экраном, пишущие машинки стали не так полезны. Поэтому я работаю над тем, чтобы превратить мою машинку в компьютер.
Это моя электронная пишущая машинка Brother AX-25. Работа всё ещё в процессе, но я устранил большинство основных проблем.
Моя пишущая машинка подключена к макетной плате с двумя мультиплексорами, управляемыми Arduino Uno. Arduino подключён к Raspberry Pi через последовательный порт, и он также подключён к моему ноутбуку через USB-кабель. Это позволяет мне использовать мою пишущую машинку в качестве терминала Linux.
Во-первых, я похвастаюсь фишками терминала Linux, а позже я поясню, как заставил это работать.
Я подключу Raspberry Pi, чтобы показать вам терминал.
Итак, вот форма запроса логина пишущей машинки.
Поскольку у меня пока нет клавиатуры, подключённой к Arduino, я использую монитор порта Arduino IDE для отправки входных данных с моего ноутбука. Я не знаю, почему неправильно печатается всё, что Arduino отправляет на Raspberry Pi, но команды он получает просто отлично, так что эта проблема меня пока не беспокоит.
Теперь, когда я вошёл в систему, у меня есть доступ к практически полноценному терминалу Linux. Вы можете делать почти все, что захотите. Однако, из-за того, что бумага состоит не из пикселей, здесь нельзя использовать команды терминала, выполняющие вывод строк на весь экран (такие как vim, emacs или nano).
Сейчас я просто создам файл, используя команду touch test.txt.
Я могу посмотреть содержимое текущего каталога с помощью команды ls.
Теперь предположим, я хочу отредактировать test.txt. В обычной ситуации я бы использовал Vim, но я не могу этого сделать. К счастью, Unix изначально разрабатывался для использования на телетайпах, так что я могу использовать команду ed, построчный редактор.
Поэтому я просто набираю ed test.txt, после чего могу войти в режим ввода, нажав “a” и Enter. Я наберу «Hello world!» и нажму Enter.
Чтобы выйти из режима вставки, нажмите точку и Enter. Затем напечатайте “wq” и нажмите Enter, чтобы сохранить и выйти.
Теперь я могу вывести файл в командную строку с помощью команды cat test.txt.
И вот, «Hello world!»
Просто ради интереса позвольте показать вам, что происходит, когда я пытаюсь использовать команду, выполняющую вывод строк на весь экран.
Для примера я попробую “top”.
И да, вы правильно поняли, машинка просто продолжает пытаться печатать и подавать звуковой сигнал.
Поскольку пишущая машинка печатает гораздо медленнее, чем работает связь между Arduino и Raspberry Pi, длинные сообщения просто обрезаются. Это несколько затрудняет печать ASCII-графики, но я могу просто написать код для Arduino и печатать ASCII-графику вручную.
Я не хочу делать картинки намного крупнее этой, пока не получу сменную ленту, но можете посмотреть, как машинка печатает фрагмент ASCII-графики, который я нашёл на asciiart.eu.

Как это сделано
Теперь, когда я показал вам, на что она способна, расскажу, как это было сделано.
Много лет назад у меня была идея взять пишущую машинку и превратить её в компьютер. Изначально я решил, что хочу заменить механизм машинки с экраном, но в процессе решил сохранить его и использовать в качестве основного способа отображения текста.
Пишущая машинка подключается к клавиатуре с помощью этих двух гибких разъёмов. У одного 8 пинов, у другого 11. Эти пины соединены матрицей 8x11, и вы можете проследить, куда идут дорожки от каждой клавиши, чтобы понять, какой паре пинов они соответствуют.
Когда вы нажимаете клавишу, она соединяет эту пару пинов, и пишущая машинка понимает, что эти два пина соединены.
Вместо того, чтобы отслеживать дорожки для каждой клавиши на клавиатуре, я решил последовательно соединить каждую пару пинов и подписать, какая клавиша, по мнению машинки, была нажата, таким образом я смог определить матрицу клавиатуры.
Я присвоил каждой клавише код от 0 до 87, чтобы упростить программирование в дальнейшем. Когда я получил таблицу, которая показывает, какой клавише соответствует каждая пара пинов, я подключил два мультиплексора, по одному на каждый разъём.
Сигнальные пины мультиплексоров подключены, поэтому мы можем соединить пару пинов, просто выбрав канал на каждом мультиплексоре.
Arduino подключён к Raspberry Pi через делитель напряжения, что позволяет преобразовать выходные 5 Вольт Arduino до 3,3 Вольта, чтобы предотвратить повреждение Raspberry Pi.
На видео вы можете увидеть схему того, что я сделал.
Как только я построил схему и составил матрицу клавиатуры, я смог начать программировать Arduino.
Мой код есть на github, если хотите рассмотреть его получше, вот ссылка. Нужно его немного почистить, но он работает.

Здесь есть пара массивов, которые делают управление мультиплексорами проще, и один большой массив, который я использую для преобразования символов ASCII в коды клавиш пишущей машинки.
Я использую библиотеку softwareserial, чтобы добавить второй последовательный порт в Arduino и чтобы настроить оба последовательных порта и все пины для управления мультиплексорами.
В цикле Arduino ожидает ввода с Raspberry Pi и моего ноутбука. Когда он получает что-то от Raspberry Pi, он печатает это и отправляет на мой ноутбук. Когда он получает что-то с моего ноутбука, то отправляет это на Raspberry Pi.
Остальная часть кода — просто набор вспомогательных функций, которые сделали написание предыдущих разделов намного легче.
Сейчас тут небольшой бардак, но я собираюсь почистить код и превратить его в рабочую библиотеку, которую можно использовать и на других пишущих машинках.
Мне очень понравилось работать над этим проектом. Я неспешно устраняю все косяки и надеюсь со временем превратить машинку в полноценный компьютер. Следующим шагом будет подключение клавиатуры к Arduino, поэтому для управления мне не потребуется другой компьютер.
Спасибо за внимание!
Что ещё интересного есть в блоге Cloud4Y
→ Как открыть сейф с помощью ручки
→ Сделайте Linux похожим на Windows 95
→ Как распечатать цветной механический телевизор на 3D-принтере
→ WD-40: средство, которое может почти всё
→ Взлёт и падение игрового чипа 6502
Подписывайтесь на наш Telegram-канал, чтобы не пропустить очередную статью. Пишем только по делу. А ещё напоминаем про второй сезон нашего сериала ITить-колотить. Его можно посмотреть на YouTube и ВКонтакте.
Комментарии (17)
ivegner
09.08.2022 18:20+4Но раз вы перевели субтитры, то, возможно, имеет смысл добавить их в видео? Иначе ваш перевод просто не выполняет своей функции.
Cheater
09.08.2022 19:25+1Я присвоил каждой клавише код от 0 до 87
=$;*%#!# почему люди так любят велосипеды и NIH?? Из всех библиотек, нумерующих клавиши, только одна известная мне (Xlib) использует общепринятый стандарт нумерации ASCII символов - ISO/IEC 8859-1. Остальные нумеруют кто во что горазд, не отстаёт даже Линус Торвальдс.
vassabi
09.08.2022 20:15+3а по-моему - так и должно быть. Это же железячные коды, а не логические символы.
А когда надо чтобы на входе были ASCII символы, то ставится функция-преобразователь - из ASCII символа в коды кнопок устройств, и наступает счастье - внутренние значения железа отвязаны от внешней логики и могут меняться\апгрейдиться независимо.
PS: меня гораздо сильнее удивляет - почему автор использовал и ардуину и малину (для этой задачи хватило бы одной любой из них), но наверно этот колхоз был из разряда ленивого железячника "комп умеет работать с малиной, машинку я уже завел от ардуины, проще подружить малину и ардуину"...
nafikovr
10.08.2022 09:58Не путайте кодировку символов и скан-коды клавиш. Одному скан-коду в разных случаях соответствуют разные символы.
nikhotmsk
09.08.2022 20:49+2Вот, вот. У людей мысли сходятся.
А я зачем-то делаю хакатон, на котором одно из заданий в точности повторяет это, только у меня аппарат Twen T-180.
hssergey
09.08.2022 21:04+18Я эту машинку превращал в принтер еще в конце 90х. Никакой ардуины тогда у меня не было. А было сделано следующее:
Как подключиться к печатной машинке, которая хоть и электронная, но
никакого внешнего интерфейса не предусмотрено? Было принято решение
попробовать сымитировать нажатия клавиш.После разборки печатной машинки и выдирания шлейфа от клавиатуры
выяснилось, что клавиатура представляет собой матрицу кнопок. Процессор
машинки периодически подает «1» на столбцы и при нажатой кнопке эта
единица появляется на соответствующей строке. И еще порадовало, что
сигналы там были с обычными TTL-уровнями. Таким образом стало понятно,
как можно превратить машинку в принтер:)Был изготовлен шлейф, в котором столбцы и строки были заведены на
выходные и входные линии микросхемы ВВ55 Радио 86 РК. И родилась ассемблерная
процедура печати одного символа: в цикле опрашиваем порт, и в тот
момент, как только появляется нужный бит на столбце, выставляем нужный
бит на строке, и как только бит на столбце пропадаем, снимаем его со
строки. При отладке выяснилось, что в машинке реализована защита от
дребезга, и процессор машинки распознает нажатие клавиши только если
сигнал на строке повторяется не менее чем за 3 цикла опроса.После написания работающей процедуры «нажатия клавиши» оставалось только
составить таблицу соответствия строк и столбцов ASCII-кодам, и можно
было уже вовсю печатать :) Дальше оставалось только выдавать символы не
слишком быстро, чтобы механика машинки успевала отработать, да ставиться
на паузу и ждать ожидания любой клавиши, когда заканчивалась страница.Быстродействия даже Радио86 РК вполне хватало на программную эмуляцию клавиатуры машинки.
Описанная схема подключения практически без изменений использовалась и
когда у меня появился 486 комп — там машинка была подключена по LPT. И
при помощи такой нехитрой схемы было отпечатано множество рефератов и
курсовых :)
DaneSoul
09.08.2022 21:16+4А нет варианта сделать так, чтобы в качестве клавиатуры использовалась оная от самой пишущей машинки, но на вывод бы шло не напрямую с нее, а то, что внешние мозги от малины подавали? То есть чтобы пишущая машинка служила и клавиатурой и принтером, но на мозгах от малинки, где бы крутился Linux?
Tzimie
09.08.2022 23:08А я подключил ПК 01 Львiв к телетайпу "Риони" с помощью одного силового транзистора. И генерил старт стопные последовательности
CrashLogger
Были времена, когда люди действительно так работали) Печатная машинка Консул использовалась в роли терминала.
singeorange
Таки они ПИШУЩИЕ.
Chillingwilli
Скоро вернёмся