- PVSM.RU - https://www.pvsm.ru -

В начале февраля в Steam был фестиваль печатания. Среди множества игр, проверяющих умение работы с клавиатурой, нашлась одна, которая предлагает уникальный опыт морского боя по телеграфу: индексы клеток вводятся азбукой Морзе.
Игра совместима с мышкой, клавиатурой и джойстиком. Я посчитал, что это не достаточно аутентично, и собрал свой контроллер с телеграфным ключом и дверным звонком. Получившееся устройство подходит не только для одной игры, но и для обучения азбуке Морзе и для набора сообщений в любые поля ввода в ОС.
MORSE [1] — это стратегия, которая предлагает морские сражения в реальном времени с использованием азбуки Морзе. Игровое поле разделено на клетки, а переход к строке и столбцу происходит телеграфированием соответствующей цифры или буквы. Выстрел по клетке производится отдельной кнопкой, а с недавнего обновления — еще и последовательностью -...-, что позволяет играть полностью на телеграфном ключе.
Игра не требует особых навыков или оборудования. Шпаргалка с алфавитом по умолчанию включена, в настройках можно назначить любую клавишу в качестве телеграфного ключа.
У игры есть бесплатная демо-версия [2], в которой можно ознакомиться с первыми уровнями и составить собственные впечатления.
Эта игра — один из нескольких тестов, которые придется пройти контроллеру. Но сначала его нужно собрать.
Классический телеграфный ключ — это переключатель в виде подпружиненного коромысла с двумя контактами. Дальний контакт (6’) в нормальном состоянии замкнут, что эквивалентно режиму приема на аппаратуре. При нажатии на рукоятку ближайший контакт (6) замыкается и в эфир отправляется сигнал, продолжительность которого регулируется продолжительностью нажатия на ключ. При отпускании ключ возвращается в нормальное состояние.
Классический механический вертикальный ключ — это не единственное устройство для передачи «морзянки». Существуют горизонтальные полуавтоматические и автоматические ключи.
В полуавтоматических смещение коромысла влево отправляет тире, а при смещении вправо запускается маятниковый механизм, который генерирует последовательность точек, пока контакт замкнут. Автоматические ключи используют аналогичный механизм не только для точек, но и для тире.
Классический телеграфный ключ можно получить несколькими способами.
Купить. На маркетплейсах есть современные и самодельные ключи. На «барахолке» можно найти более классические варианты.
Напечатать на 3D-принтере. Есть несколько моделей от ключа [4] до телеграфной системы [5]. Есть вариант на основе столовой ложки [6].
Сделать из подручных материалов. У пользователя с ником OH6DC есть подборка телеграфных ключей [7]: на бананах [8], плойке [9] и даже на телепузике [10].
Я выбрал самый простой вариант: купил на барахолке за 1 200 рублей ключ Пг2.175.000. Похоже, что этот ключ не вынимали из коробки со времен производства — в 1991 году. На нижней стороне устройства видны три контакта, к которым можно подключиться. Ключ требует небольшого, но ощутимого усилия для нажатия, а при замыкании слышится приятный металлический стук.
Берем эту прекрасную коробочку и добавляем обвязку для работы с компьютером.

Играйте в Minecraft и получайте бонусы в панели управления
Потратить бонусы можно, например, на развертывание облачного сервера для своего сайта, приложения или Telegram-бота.
У ключа есть очевидное требование: он должен быть прикручен к какой-нибудь устойчивой поверхности. Для этого в корпусе есть четыре отверстия. Нажатие на рукоятку незакрепленного ключа приводит к отрыву ключа от стола.
Подписывайтесь на мой Telegram‑канал [13] — там можно увидеть заметки по статьям, над которыми работаю, публикую небольшие познавательные посты, а по пятницам традиционно выкладываю мемы.
Так как я планирую портативный контроллер для компьютера, то расширяю свои ресурсы подручными средствами.
Деревянная разделочная доска 22x16 см. Материал: бамбук. В моем случае она бесплатна, потому что она служила на кухне, но уже была существенно повреждена (но не сломлена) перепадами температуры в посудомойке. Примерная текущая стоимость — 500 рублей за одну новую доску.
Простой дверной звонок. 200 рублей.
Arduino Leonardo. Из моих старых запасов. Текущая цена — от 500 до 4 000 рублей в зависимости от магазина и оригинальности платы. В целом подходит любая плата на базе ATmega32u4.
Несколько перемычек вида «папа-папа». Перемычки разрезаются, зачищаются и прикручиваются к контактам звонка и ключа.
Подключение Arduino к дверному звонку и ключу элементарно. Подключаем цифровые выходы, в моем случае 2 и 4, и землю к кнопкам. Механизм внутренней подтяжки (INPUT_PULLUP) [14] позволяет не использовать внешние резисторы, чем максимально упрощает схему. А простую схему можно собрать навесным монтажом.
Суммарная стоимость всех компонентов будущего контроллера — около трех тысяч рублей. Хотя цена максимально зависит от телеграфного ключа и микроконтроллера.
Надежно прикручиваем элементы на бывшую разделочную доску и можем переходить к программированию.
Ранее я отмечал, что нужен микроконтроллер на базе ATmega32u4. Дело в том, что эти микроконтроллеры умеют в эмуляцию USB HID, то есть могут «прикидываться» настоящей клавиатурой.
Реализуем наивный алгоритм, который при замыкании ключа нажимает клавишу, а при размыкании — отпускает.
#include <Keyboard.h>
const int keyPin = 2;
const char keyButton = ' ';
bool lastState = HIGH;
void setup() {
pinMode(keyPin , INPUT_PULLUP);
Keyboard.begin();
}
void loop() {
bool now = digitalRead(keyPin);
if (keyPin == HIGH && now == LOW) { // нажали
Keyboard.press(keyButton);
}
if (keyPin == LOW && now == HIGH) { // отпустили
Keyboard.release(keyButton);
}
lastState = now;
}
В общем случае программа работает и может быть легко расширена для поддержки второй кнопки — дверного звонка. Однако программа не идеальна: при телеграфировании иногда возникает дребезг контактов, из-за чего игра распознает «лишнюю» точку. А кнопки «Backspace», как известно, в телеграфных системах нет.
После модификации программа стала более объемной, но и вместе с тем более функциональной.
Поддерживается как телеграфный ключ, так и кнопка.
Предусмотрен антидребезг: сигнал считается стабильным, если сохраняется как минимум 10 мс. Это значение вынесено в константы и может быть изменено перед прошивкой.
Добавлен «сырой» режим, в котором микроконтроллер отправляет изменение состояния переключателей по COM-порту. Это опциональный режим.
Исходный код прошивки слишком большой, чтобы выносить его в статью, поэтому его можно посмотреть на GitHub [15].
Я, конечно, новичок и «печатаю» медленно, но играть на телеграфном ключе интереснее, чем на клавиатуре. А опыт — дело наживное.
А если вы хотите с помощью азбуки Морзе не только играть в игры, но и вводить текст в программы, будь то Telegram, Google Docs и прочее, то давайте продолжим.
Алфавит в коде Морзе и правила кодирования помещаются на лист А5. Должно быть просто декодировать сигнал, поступающий с контроллера, и программно нажимать кнопки клавиатуры, соответствующие коду, верно?
Для декодирования Морзе нужно следовать пяти правилам.
Длина точки берется за единицу времени.
Тире занимает три точки.
Длина тишины между сигналами одной буквы — одна точка.
Длина тишины между буквами — три точки.
Длина тишины между словами — семь точек.
Длина точки не регламентирована, новички могут передавать сообщение медленно, профессионалы — быстро. До тех пор, пока выполняются перечисленные пять правил — сообщение будет декодировано. Более того, в передачах есть специальные сокращения, Q-коды, обозначающие «Передавайте медленнее» (QRS) и «Передавайте быстрее» (QRQ).
Так как я хочу написать декодер, который будет понимать меня только на заданной скорости, а не в «любом случае», то необходимо, собственно, определить скорость телеграфирования — Words Per Minute (WPM).
Стандартными словами для измерения скорости считаются слова PARIS (длина передачи — 50 точек) и CODEX (60 точек). Несложно подсчитать, что при скорости 1 слово в минуту на передачу одной точки уходит от 1 000 до 1 200 миллисекунд. Эти константы позволяют высчитывать длину точки при разных скоростях передачи. Например, при WPM 20 длина точки 60 мс, а при WPM 35 — 35 мс.
За пару вечеров я набросал программу на .NET, которая распознает коды, показывает распознанные точки и тире в окне, а также позволяет видеть длительность сигнала и паузы между сигналами.
Программа считывает команды из COM-порта, которые отправляет контроллер. Формат сообщения текстовый, сообщения разделяются переносом строки, данные в сообщении — пробелом.
EVT — «заголовок» сообщения нажатия кнопки.
BTN или KEY — указывает к кнопке или к ключу относится сообщение.
0 или 1 — обозначает новое состояние переключателя. 0 — разомкнутно.
Временная метка в миллисекундах. Внутреннее время контроллера позволяет более точно вычислить длительность передаваемого сигнала.
Превращение данных в точки и тире происходит с небольшой погрешностью. Длина точки может колебаться от 0.5 до 2.0 точек, а длина тире — от 2.1 и больше. Аналогично производится расчет для принадлежности символа к текущей букве или к следующей.
Для эмуляции нажатия клавиш используется .NET класс SendKeys и метод SendWait в частности. Особенность этого подхода в том, что это именно «нажатие» клавиш. Если набрать код латинского символа «Q», а в операционной системе будет выбрана русская раскладка, то в поле ввода появится символ «Й». Более того, пользователи QWERTZ-раскладок тоже увидят нестыковку: символ «Y» будет напечатан как «Z».
Приложение на уровне ОС может корректно обрабатывать эти ситуации, переключать раскладки и, при необходимости, отправлять текст в приложения без перехвата фокуса.
Если вы впечатлились и хотите изучить код Морзе, то для этого есть несколько разных решений.
Игра MORSE [1], с которой началась эта статья. Возможно, игра — не лучшее решение именно для изучения, но определенно хорошее место для закрепления полученных навыков в стрессовой среде. Поддерживает мышь, клавиатуру, джойстик. Только английский алфавит. В сообществе Steam есть тема, посвященная DIY-контроллерам для игры [17].
Сервис MorseMaster [18]. Онлайн-сервис, предлагающий уроки с прогрессирующей сложностью. Поддерживает мышь и клавиатуру. Только английский алфавит.
Если вам кажется, что я уделил мало текста истории и устройству телеграфных линий, то можете обратиться к статье [3] моего коллеги по блогу.
Полный исходный код проекта из статьи доступен на GitHub [19].
Автор: Firemoon
Источник [20]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/igry/445692
Ссылки в тексте:
[1] MORSE: https://store.steampowered.com/app/1976860/MORSE/
[2] демо-версия: https://store.steampowered.com/app/1976900/MORSE_Demo/
[3] Источник: https://habr.com/ru/companies/selectel/articles/923208/
[4] ключа: https://www.thingiverse.com/thing:4207626
[5] телеграфной системы: https://www.thingiverse.com/thing:3469814
[6] основе столовой ложки: https://ympt.co.uk/teaspoontx.html
[7] подборка телеграфных ключей: https://sites.google.com/site/oh6dccw/strangecwkeys
[8] бананах: https://sites.google.com/site/oh6dccw/dual-banana-cw-paddle
[9] плойке: https://sites.google.com/site/oh6dccw/straight-ener-key
[10] телепузике: https://sites.google.com/site/oh6dccw/teletubbygraph-key
[11] хостинга: https://www.reg.ru/?rlink=reflink-717
[12] Подключиться к игре →: https://promo.selectel.ru/minecraft/?utm_source=habr.com&utm_medium=referral&utm_campaign=minecraft_article_battleship_240226_banner_i092_03_ord
[13] на мой Telegram‑канал: https://t.me/+VzpLr5pam-MxODEy
[14] Механизм внутренней подтяжки (INPUT_PULLUP): https://alexgyver.ru/lessons/gpio-in/#6-toc-title
[15] на GitHub: https://github.com/Firemoon777/morse-driver/blob/master/telegraph/telegraph.ino
[16] Источник: https://ru.wikipedia.org/wiki/%D0%90%D0%B7%D0%B1%D1%83%D0%BA%D0%B0_%D0%9C%D0%BE%D1%80%D0%B7%D0%B5
[17] посвященная DIY-контроллерам для игры: https://steamcommunity.com/app/1976860/discussions/0/689741058327776126/
[18] MorseMaster: https://morsemaster.org/home
[19] на GitHub: https://github.com/Firemoon777/morse-driver
[20] Источник: https://habr.com/ru/companies/selectel/articles/1002490/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1002490
Нажмите здесь для печати.