Arduino вместо джойстика Сеги: ковыряния #1
Взялся за вторую половину (из трёх-четырёх) задачи с подключением джойстиков. Теперь мне нужно имитировать с помощью Ардуины обычный Сеговский джойстик, в трёхкнопочном и шестикнопочном режимах.
В качестве исходного джойстика у меня тоже Сеговский, и мне нужно, чтобы он работал как при прямом подключении, но только через трансляцию интерфейсов на Ардуине.
Для начала соорудил стенд: тот же маленький телевизор, стародельная Сега Pro 16, Flash-картридж с парой тестовых программ, показывающих состояние джойстиков.
Изначально я делал разъём-переходник DB9 для подключения приставки к Ардуине макетными проводами, но это оказалось неудобно: проводки слишком короткие.
Был найден другой выход: у меня есть два рабочих новодельных джойстика. Отрезал от одного провод и припаял его конец к фрагменту цанговой панельки, а её через макетные провода соединяю с Ардуиной. Таким образом удалось расположиться более удобно. Джойстик я потом починю обратно, когда закончу.
Далее началась сложная часть, программная. Попытка реализовать задуманное через digitalRead и digitalWrite провалилась. Дело в том, что на Сеге используется мультиплексирование управляющих линий, их состояние зависит от сигнала выборки. Нужно выставлять состояние всех шести линий сразу же по изменению этого сигнала. Переделал на прямую работу с портами, скорости хватило, эмуляция трёхкнопочного режима заработала стабильно.
С шестикнопочным режимом всё значительно сложнее. В железе он реализуется просто, а вот в программной имитации совсем нет. Режим реализован так: если код дёрнет линию выборки несколько раз за короткое время, в очередной раз джойстик выдаёт коды дополнительных кнопок вместо обычных. Если же код делает это редко или медленно, джойстик работает как трёхкнопочный.
До кучи есть ещё режим аппаратной совместимости с трёхкнопочным джойстиком внутри шестикнопочного: при включении питания нужно удерживать загадочную кнопку MODE, и тогда он будет работать как обычный с тремя кнопками. Это нужно для совместимости с некоторыми играми.
Изрядно повозившись, я смог заставить работать свой имитатор джойстика и в шестикнопочном режиме тоже. Но есть проблемы, причин которых я пока не понимаю. Первая: Ардуина часто перезагружается, питание от консоли не помогает. Возможно дело в прямой работе с портами. Вторая: в MK3 джойстик работает в меню, но не на экране выбора персонажа. Вероятно там какие-то другие тайминги.
Начало положено, но путь к полному решению пока непонятен. Разбираюсь дальше.
sgd
arduino
sega
джойстики
Санёк Сушка | Саня, Тащи!
По итогу удалось решить проблему с перезагрузкой Ардуинки? Или ответ будет в следующем выпуске? На счет шестикнопочного режима - может на экране выбора персонажей он какой то другой паттерн опроса?
shiru8bit
Санёк Сушка | Саня, Тащи!, удалось понять причину перезагрузок, но полностью победить пока нет. Решение понятно. А вот с опросом пока медленно зверею. Да, там другой паттерн опроса, и он в разных играх разный, в том и дело.