
В начале февраля Steam провел тематический фестиваль, посвященный играм о скоростной печати. Среди множества проектов, проверяющих ловкость пальцев, мое внимание привлекла необычная интерпретация морского боя. В этой игре координаты для атаки передаются посредством телеграфа, а ввод осуществляется с помощью азбуки Морзе.
Несмотря на поддержку стандартных средств ввода — мыши, клавиатуры и геймпада — я решил, что для полного погружения этого недостаточно. В итоге я сконструировал кастомный контроллер, объединив классический телеграфный ключ с обычным дверным звонком. Созданный гаджет оказался универсальным: он подходит не только для геймплея, но и для обучения коду Морзе, а также для набора сообщений в любых системных приложениях.
О проекте MORSE

MORSE представляет собой стратегию в реальном времени, где исход морских баталий зависит от вашего владения телеграфом. Игровое пространство разбито на сектора, навигация по которым требует передачи конкретных буквенно-цифровых комбинаций. Атака цели производится нажатием отдельной клавиши, а после недавнего патча — отправкой последовательности -…-, что позволяет полностью перейти на использование телеграфного ключа.
Порог вхождения минимален: в игре предусмотрена встроенная шпаргалка, а настройки позволяют назначить функцию ключа на любую кнопку.
Для тех, кто хочет опробовать механику лично, доступна бесплатная демо-версия, охватывающая вводные миссии.
Данная игра стала основным испытательным полигоном для моего устройства, но прежде его нужно было воплотить в «железе».
Анатомия телеграфного ключа

Традиционный ключ — это механический переключатель с подпружиненным коромыслом. В состоянии покоя замкнут тыловой контакт (6’), что соответствует режиму приема. При воздействии на рычаг замыкается фронтальный контакт (6), инициируя передачу сигнала. Длительность импульса напрямую зависит от времени удержания клавиши оператором.
Стоит отметить, что вертикальный ключ — лишь один из видов инструментов связи. Существуют также горизонтальные модели: полуавтоматические и полностью автоматические.
В полуавтоматах отклонение рычага в одну сторону формирует тире, а в другую — активирует маятник, генерирующий серию точек. Автоматические же ключи используют электронику для формирования обоих типов сигналов.
Приобрести или изготовить такой инструмент можно несколькими путями.
-
Покупка готового изделия. Современные реплики доступны на популярных маркетплейсах, а винтажные образцы — на специализированных аукционах и рынках.
-
Аддитивное производство. Существует множество STL-моделей: от минималистичных решений до полноценных систем. Есть даже ироничные проекты на базе ложек.
-
DIY из подручных материалов. Энтузиаст OH6DC собрал целую коллекцию курьезных ключей: от механизмов на бананах до устройств, встроенных в мягкие игрушки.

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

Прокачивайте навыки в Minecraft и получайте реальные преимущества
Заработанные бонусы можно конвертировать в ресурсы для ваших IT-проектов: от хостинга сайтов до развертывания сложных ботов в облаке.
Присоединиться к приключению →
Инженерная часть: Arduino и бытовые компоненты

Конструкция ключа требует жесткой фиксации на поверхности, иначе при работе он будет просто опрокидываться.
Следите за обновлениями в моем Telegram-канале — там я делюсь закулисьем разработки, публикую технические инсайты и разбавляю контент тематическим юмором.
Для создания устойчивой базы я использовал то, что нашлось под рукой:
-
Бамбуковая разделочная доска. Идеальный по размеру (22×16 см) и весу фундамент. Несмотря на боевые шрамы от кухонного прошлого, она отлично справилась с ролью шасси.
-
Дверной звонок. Бюджетное решение за пару сотен рублей в качестве дополнительной функциональной кнопки.
-
Arduino Leonardo. Ключевой элемент системы на чипе ATmega32u4, способный эмулировать устройства ввода (HID).
-
Монтажные провода. Несколько перемычек для соединения электрических цепей.

Электроника собрана по простейшей схеме: кнопки подключены к цифровым пинам и «земле». Использование режима INPUT_PULLUP избавило от необходимости впаивать лишние резисторы.
Итоговая стоимость проекта составила около 3000 рублей, львиная доля которых пришлась на сам телеграфный ключ и микроконтроллер.
Зафиксировав все детали на доске, я приступил к написанию кода.
Разработка ПО
Базовая логика
Благодаря ATmega32u4 компьютер воспринимает Arduino как стандартную клавиатуру. Простейший алгоритм транслирует физическое замыкание контактов в нажатие заданной клавиши (например, пробела).
#include
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 (lastState == HIGH && now == LOW) { // нажатие
Keyboard.press(keyButton);
}
if (lastState == LOW && now == HIGH) { // отпускание
Keyboard.release(keyButton);
}
lastState = now;
}
Такой подход функционален, но имеет изъян — дребезг контактов. Микроскопические повторные срабатывания при нажатии могут привести к появлению лишних «точек», что критично при работе с морзянкой.
Оптимизированное решение
Финальная версия прошивки стала гораздо надежнее:
-
Реализована обработка сигналов как с ключа, так и со вспомогательной кнопки звонка.
-
Внедрена программная фильтрация (антидребезг) с задержкой в 10 мс.
-
Добавлен режим передачи сырых данных через последовательный порт для продвинутой отладки.
Детально изучить полный исходный код можно в моем репозитории на GitHub.
Играть с таким контроллером — сплошное удовольствие. Даже при невысокой скорости «печати» уровень погружения несравним с обычной клавиатурой.
Интеграция в рабочую среду
Следующим логичным шагом стало превращение контроллера в полноценный инструмент для ввода текста в любых приложениях — от мессенджеров до текстовых редакторов.

Декодирование базируется на пяти фундаментальных временных пропорциях:
-
Базовая единица времени — длительность точки.
-
Тире эквивалентно трем точкам.
-
Интервал между элементами одного символа — одна точка.
-
Пауза между буквами — три точки.
-
Пробел между словами — семь точек.
Для корректной работы декодера критически важен параметр WPM (слов в минуту). По стандартам PARIS и CODEX рассчитывается длительность одного импульса. Например, при скорости 20 WPM точка длится ровно 60 мс.

Я разработал на .NET приложение-декодер, которое анализирует данные из COM-порта и эмулирует нажатия клавиш. Программа учитывает погрешности ручного ввода, допуская отклонения в длительности сигналов.
Для взаимодействия с ОС используется механизм `SendKeys`. Важно помнить: эмулируется именно физическое нажатие. Если в системе активна кириллица, то латинская «Q» превратится в «Й». Это решается программной проверкой раскладки или прямой передачей текстовых строк.
Что почитать и где попрактиковаться
Если тема телеграфии вас зацепила, рекомендую следующие ресурсы:
MORSE — отличный тренажер для отработки навыков в динамичной игровой среде. В Steam-сообществе можно найти множество других вариантов самодельных контроллеров.
MorseMaster — интерактивный образовательный ресурс с постепенным усложнением материала.
Для тех, кто интересуется историческим аспектом и техническим устройством телеграфных сетей, советую ознакомиться с материалом моего коллеги.
Все исходники текущего проекта опубликованы в открытом доступе на GitHub.


