Эмулятор + враппер джойстика Sega MegaDrive (к555кп11 + Arduino).

Вот уже более полугода как временами продолжаю наслаждаться сеговскими играми в «настоящем железе» (чему посвящен отдельный материал) – разница с эмуляторами огромная! Идеальная и примитивная (по сегодняшним меркам) графика консольных игр 20-ти с лишним летней давности в эмуляторе смотрится архи-убого. Управление клавиатурой – тоже так себе затея … Хотя можно и реальный джойстик через преобразователь подключить. Реальная же приставка с эвер-драйвом вместо картриджа, дающая качественный сигнал в ТВ-формате (пусть и через карту захвата) – совсем другое дело!..

Но отложим лирику ;-) На практике столкнулся с такой фишкой: в игре Landstalker (доступной сегодня и на русском языке, красота-вообще) - прообразе «диабло-подобных» RPG, а вернее их предшественнике – управление в псевдо-трехмерном (изометрическом) пространстве реализовано несколько что ли «коряво», или вернее до безобразия точно, ровно настолько же неудобоюзабельно. Герой может перемещаться по локации строго в одном из четырех направлений, перемещения «по диагоналям» не предусмотрено. Однако за счет того что, так сказать, «камера» сориентирована «с угла»:

т.е. классический вариант для подобных игр – разработчики не иначе как для усложнения игрового процесса реализовали управление героем «в лоб». Т.е. для перемещения нужно использовать исключительно смешанные (диагональные направления) крестовины джойстика! Причем четко и быстро манипулировать ими в процессе игры! Не меньшая засада заключается в том, что если диагональ прожата нечетко (палец соскочил, джойстик не сработал) – то движение героя будет непредсказуемым, а точнее зависеть от предыдущей его траектории: любое из строгих направлений джойстика может приводить героя к перемещению в различных направлениях (в зависимости от последней правильно прожатой диагонали, например при нажатии кнопки «вверх» герой может начать двигаться как в правый-верхний угол, так и в левый-верхний). Вобщем словами рассказать не так просто, как прочувствовать – а класть джойстик в руках наискось и стараясь всеми силами четко прожимать именно и исключительно диагонали …

Появилась логичная мысль: развернуть «аппаратно» джойстик на 45 градусов по часовой стрелке – чтобы кнопка «вверх» активировала нажатие «вверх-вправо», диагональ «вверх-вправо» - нажатие «вправо», кнопка «вправо» - нажатие «вправо-вниз» и т.д. по часовой стрелке. Казалось бы что может быть проще? – берем ардуину, делаем распайку коннекторов, совсем чуток кода (ведь интерфейс и протокол сега-джойстиков предельно прост) и в путь! «Ан нет». Да, опросить состояние джойстика (особенно трехкнопочного) действительно просто (останавливаться на этом не будем) – а вот «прикинуться» ардуине джойстиком, да так чтобы «железная Cега» (а не другая наша ардуина) нас «поняла» … Потрачено было не мало времени в экспериментах с оптимизациями кода и осмыслении нестабильных результатов работы (думал даже шинный буфер ставить), но ответ и точку в решении дал осциллограф. Реальная Сега очень быстро и на очень короткое время переключает мультиплексор джойстика, засечь прерыванием по изменению состояния входа этот импульс возможно – но в период активности (единицы) этого импульса выставить нужные значения на выходы … да еще чтобы при обратном фронте опять выставить прежний набор – производительности ардуины явно не хватает (учитывая еще и необходимость анализа что выставлять, т.к. прерывание дает информацию только о смене значения; да и два обработчика на фронт и спад импульса тоже не назначишь). Так чтО, в рамках ардуины нет решения эмуляции джойстика для Сеги? Без дополнительных компонентов – видимо нет. Однако схемотехника Сега-джойстика настолько проста – это всего лишь один мультиплексор к555кп11 (аналог 74ls157), что его можно добавить к ардуине: которой в свою очередь остается лишь «нажимать» на кнопки «аппаратно-эмулируемого джойстика» (т.е. управлять мультиплексором). А это допустимо делась с очень медленной, «человеческой» скоростью, ровно как с такой же скоростью и опрашивать реальный джойстик. Мультиплексор же, даже советский, на ура отрабатывает и переключается по коротким импульсам от Сеги. Да, одним мультиплексором мы эмулируем только трехкнопочный джойстик – но для подавляющего большинства игр другого и не требуется, а тем более данный проект затевался всего ради одной игры. Но несомненно оно того стоило!

Результат схемотехнического исполнения с «дырявой» макетки чуть позднее перекочевал на прототипный щит, в результате чего стал выглядеть более цельно и юзабельно ;-)

Не предел технического совершенства конечно, но меня пока устраивает (лениво под такой простой проект колдовать печатку под автономную конструкцию).

Скетч также весьма прост, однако содержит ряд сразу не очевидных алгоритмических решений (возможно, пригодится кому). Функционал таков – по-умолчанию происходит прямая трансляция нажатых клавиш реального джойстика (подключенного к ардуине) через мультиплексор в приставку (кроме клавиш шестикнопочного джойстика x, y, z). Клавиша mode переключает режим трансляции. О включенном режиме «враппера» сигнализирует светодиод на 13-ом порту ардуины. В этом режиме (как описывалось выше) крестовина «как бы поворачивается» на 45 градусов по часовой стрелке – и о чудо! Герой вразумительно и изящно управляется базовыми направлениями джойстика, без всяких диагоналей! На время меню режим враппера можно или отключать, или использовать диагонали – т.к. они в режиме враппера выполняют роль одиночных клавиш ;-)

MiGeRA (апрель 2019)

Заглавная » Радиоэлектроника » Arduino - Высокоуровневая платформа устройств на микроконтроллерах » Эмулятор + враппер джойстика Sega MegaDrive