Корзина пуста
Переходник для джойстиков SEGA / DENDY
- Автор: Александр
- Просмотров: 5606
Как то при разговоре с другом, речь зашла о "ретро" консолях и играх того времени. Хорошие были времена, наполненные яркими эмоциями и впечатлениями. Оказалось, что и у меня и у моего друга, от самих приставок не осталось ничего кроме джойстиков. Ну а что еще кроме самого джойстика нужно, чтобы окунуться в настольгические ощущения? И тут мы задумались как же можно подключить их - к компьютеру...
Роль телевизора и игровой приставки, хорошо выполнит компьютер с эмулятором нужной консоли на борту. А вот аутентичные тактильные ощущения не сможет заменить ни клавиатура ни тем более мышь.
Для начала, было выяснено что джойстики Dendy бывают 2 видов:
1) с широким 15-pin
2) с узким 9-pin
разъемами...
Как оказалось, разница кроется только в самом используемом разъеме. Количество проводов и протокол передачи данных при этом одинаковы.
К тому же разъем джойстиков Sega и Dendy 9-pin физически одинаковы, и представляют из себя - обычный разъем COM порта компьютера. можно реализовать опрос обоих типов джойстиков на одном разъеме - что сделает устройство более универсальным.
Некоторые редкие игры того времени поддерживали одновременную игру 4 игроков. К приставке подключался дополнительный переходник в который и вставлялись 2 дополнительных джойстика.
Немного поискав в интернете, были найдены алгоритмы работы джойстиков и принципы работы переходника. В качестве самого устройства связывающего компьютер и джойстики решил использовать микроконтроллер AVR с аппаратным USB на борту. Atmega AT90USB162 .
С интерфейсом USB мне работать еще не приходилось, тем интереснее казалась задача. Я привык писать код для контроллеров AVR в программе CodeVisionAVR. Примеры найденный в интернете в основном были написаны в среде WinAVR или AtmelStudio с использованием библиотеки V-USB или LibUSB. были так же и скетчи для arduino с использованием библиотеки от adafruit. Использовать готовые решения можно, но это не интересно. К тому же примеров работы с USB в привычной среде CodeVisionAVR крайне мало. Но как оказалось, в ней уже есть встроенные средства для работы с USB. Генератор первоначального кода сгенерировал инициализацию контроллера и подключил все необходимые библиотеки. За что мне и нравится эта среда программирования!
Дальше уже пришлось разбираться с дескрипторами интерфейса USB. По мере изучения этого материала - было выпито не мало кружек кофе.
В итоге был составлен дескриптор соответствующий требуемым условиям. Изначально решил эмулировать каждый джойстик - как отдельное устройство. Поэтому в дескрипторе применил "нумерование" устройств. 2 dendy + 2 sega/dendy
Прототип был собран и протестирован. В последствии развел и заказал из Китая печатную плату.
Устройство приобрело законченный вид. Ну а я в полной мере насладился ретро играми.
Спустя некоторое время, выяснилось, что при подключении переходника к компьютеру с Linux на борту, джойстики начинают работать не адекватно.
Если в системе Windows каждый джойстик определялся как отдельное HID устройство:

То в Linux, переходник определяется как одно "объединенное" устройство:


Количество кнопок в котором, равно сумме кнопок всех джойстиков. Именно кнопок! Все "крестовины" джойстиков при этом - объединяются в одну. Т.е. сигнал с крестовины любого джойстика - один и тот же. Это не позволяет играть вдвоем. По какой то причине - "стики" в Linux распознаются как один единственный манипулятор.
Очевидно, что крестовины джойстиков (стики) необходимо эмулировать как кнопки а не как "стики" к тому же по факту - это и есть кнопки.
Стики же - используются на более продвинутых игровых устройствах и выдают диапазон значений, соответствующий углу отклонения стика в одной из плоскостей.
Добавив в дескрипторе устройств по 4 дополнительные кнопки и немного подправив код, столкнулся с еще одной проблемой. Опять же в windows определилось все корректно- у каждого из игровых устройств добавилось по 4 кнопки. В Linux переходник вообще перестал определяться как "игровое" устройство. Опытным путем пришел к тому, что если суммарное количество кнопок превышает 32 шт. то система Linux перестает видеть устройство. Полагаю что это связанно именно с "нумерованием" устройств в дескрипторе. Т.к. эмуляция одного единственного джойстика ( одного устройства HID ) позволило присвоить джойстику, даже 64 кнопки ( в системе Linux ). Система Windows при этом видит всего 32 кнопки. С чем это связано - пока для меня не понятно.
Но как то выходить из ситуации необходимо. Чтобы уложиться в лимит 32 кнопок, решил пойти на компромисс. Для 15-pin разьемов Dendy- решил оставить все как есть... а для джойстиков Sega / Dendy 9-pin крестовины джойстиков- эмулировать как дополнительные кнопки. Тем самым в сумме кнопок получается как раз ровно 32.
При таком подходе удалось решить возникшую проблему.
Ниже, фото готового устройства.




Роль телевизора и игровой приставки, хорошо выполнит компьютер с эмулятором нужной консоли на борту. А вот аутентичные тактильные ощущения не сможет заменить ни клавиатура ни тем более мышь.
Для начала, было выяснено что джойстики Dendy бывают 2 видов:
1) с широким 15-pin
2) с узким 9-pin
разъемами...
Как оказалось, разница кроется только в самом используемом разъеме. Количество проводов и протокол передачи данных при этом одинаковы.
К тому же разъем джойстиков Sega и Dendy 9-pin физически одинаковы, и представляют из себя - обычный разъем COM порта компьютера. можно реализовать опрос обоих типов джойстиков на одном разъеме - что сделает устройство более универсальным.
Некоторые редкие игры того времени поддерживали одновременную игру 4 игроков. К приставке подключался дополнительный переходник в который и вставлялись 2 дополнительных джойстика.
Немного поискав в интернете, были найдены алгоритмы работы джойстиков и принципы работы переходника. В качестве самого устройства связывающего компьютер и джойстики решил использовать микроконтроллер AVR с аппаратным USB на борту. Atmega AT90USB162 .
С интерфейсом USB мне работать еще не приходилось, тем интереснее казалась задача. Я привык писать код для контроллеров AVR в программе CodeVisionAVR. Примеры найденный в интернете в основном были написаны в среде WinAVR или AtmelStudio с использованием библиотеки V-USB или LibUSB. были так же и скетчи для arduino с использованием библиотеки от adafruit. Использовать готовые решения можно, но это не интересно. К тому же примеров работы с USB в привычной среде CodeVisionAVR крайне мало. Но как оказалось, в ней уже есть встроенные средства для работы с USB. Генератор первоначального кода сгенерировал инициализацию контроллера и подключил все необходимые библиотеки. За что мне и нравится эта среда программирования!
Дальше уже пришлось разбираться с дескрипторами интерфейса USB. По мере изучения этого материала - было выпито не мало кружек кофе.
В итоге был составлен дескриптор соответствующий требуемым условиям. Изначально решил эмулировать каждый джойстик - как отдельное устройство. Поэтому в дескрипторе применил "нумерование" устройств. 2 dendy + 2 sega/dendy
Прототип был собран и протестирован. В последствии развел и заказал из Китая печатную плату.
Устройство приобрело законченный вид. Ну а я в полной мере насладился ретро играми.
Спустя некоторое время, выяснилось, что при подключении переходника к компьютеру с Linux на борту, джойстики начинают работать не адекватно.
Если в системе Windows каждый джойстик определялся как отдельное HID устройство:



Количество кнопок в котором, равно сумме кнопок всех джойстиков. Именно кнопок! Все "крестовины" джойстиков при этом - объединяются в одну. Т.е. сигнал с крестовины любого джойстика - один и тот же. Это не позволяет играть вдвоем. По какой то причине - "стики" в Linux распознаются как один единственный манипулятор.
Очевидно, что крестовины джойстиков (стики) необходимо эмулировать как кнопки а не как "стики" к тому же по факту - это и есть кнопки.
Стики же - используются на более продвинутых игровых устройствах и выдают диапазон значений, соответствующий углу отклонения стика в одной из плоскостей.
Добавив в дескрипторе устройств по 4 дополнительные кнопки и немного подправив код, столкнулся с еще одной проблемой. Опять же в windows определилось все корректно- у каждого из игровых устройств добавилось по 4 кнопки. В Linux переходник вообще перестал определяться как "игровое" устройство. Опытным путем пришел к тому, что если суммарное количество кнопок превышает 32 шт. то система Linux перестает видеть устройство. Полагаю что это связанно именно с "нумерованием" устройств в дескрипторе. Т.к. эмуляция одного единственного джойстика ( одного устройства HID ) позволило присвоить джойстику, даже 64 кнопки ( в системе Linux ). Система Windows при этом видит всего 32 кнопки. С чем это связано - пока для меня не понятно.
Но как то выходить из ситуации необходимо. Чтобы уложиться в лимит 32 кнопок, решил пойти на компромисс. Для 15-pin разьемов Dendy- решил оставить все как есть... а для джойстиков Sega / Dendy 9-pin крестовины джойстиков- эмулировать как дополнительные кнопки. Тем самым в сумме кнопок получается как раз ровно 32.
При таком подходе удалось решить возникшую проблему.
Ниже, фото готового устройства.



