Схема джойстика денди
В персональных компьютерах в играх для управления в основном используются клавиатура и мышь. Однако, в некоторые игры удобнее играть при помощи джойстика или геймпада, например в автосимуляторы или спортивные - футбол, хоккей и т.д. Для этой цели можно применить джойстики от игровых приставок. Любители компьютерных игр начали подключать привычные и удобные джойстики от игровых видео приставок к своим компьютерам с 1999 г., когда для их обслуживания появился программный пакет DirectPad Pro, бесплатно распространяемый через Интернет. Но нередко случается, что вполне исправный джойстик отказывается работать с компьютером. Предлагается решение этой проблемы, предоставляя к тому же полезную во многих играх возможность увеличить число одновременно подключенных к компьютеру джойстиков.
Джойстики от игровых приставок соединяют с параллельным портом LPT1 или LPT2 компьютера через переходники всего из нескольких малогабаритных диодов. В Интернете несложно найти схемы подключения джойстиков от приставок "Atari", "TurboGrafX-16", "Genesis" ("Sega Mega Drive-ll"), "NES" ("Dendy"), "PlayStation" (в том числе джойстик "DUAL SHOCK"), "SuperNES", "Sega Master System", "Nintendo-64", "Sega Saturn", 'Jaguar", "Virtual Boy". Сами джойстики никакой переделки не требуют и работают, как правило, без внешнего источника питания.
Наиболее распространены в странах СНГ джойстики от "Dendy", "PlayStation" и "Sega Mega Drive". Последние, к сожалению, принципиально несовместимы с некоторыми материнскими платами компьютеров недавней разработки.
Джойстики первых двух типов успешно используют многочисленные любители игр, установившие на своих компьютерах пакет DirectPad Pro.
Но иногда джойстики, нормально взаимодействующие с игровой приставкой, отказываются работать, будучи подключенными к компьютеру. К тому же при подключении к LPT-порту нескольких джойстиков одновременно не удается обойтись без внешнего источника питания.
Основных причин этому — две. Во-первых, недостаточна нагрузочная способность используемых для питания джойстиков линий LPT-порта. Уже под нагрузкой 3. 4 мА уровень лог. 1 (с учетом падения напряжения на диодах переходника) падает ниже необходимого для работы микросхемы джойстика минимума — 3 В. Во-вторых, проявляется свойственный КМОП-микросхемам тиристорный эффект — внезапное резкое увеличение потребляемого тока.
Последнее явление связано с открыванием обычно надежно закрытого "паразитного" тиристора, образованного внутри микросхемы участками полупроводникового кристалла различной проводимости. Оно становится возможным, если напряжение на логическом входе микросхемы превышает напряжение питания, и происходит, как правило, в моменты включения питания или "горячей", без выключения питания, перестыковки разъемов.
Именно такие ситуации возникают при подключении джойстика к LPT по "стандартной" схеме. Напряжение на его логических входах повышено, так как в отличие от вывода питания они соединены с линиями порта непосредственно, без разделительных диодов и не потребляют от них заметного тока. Ситуацию усугубляет обычно имеющийся в цепи питания джойстика и разряженный в момент включения блокировочный конденсатор.
Нужно сказать, что не все КМОП-микросхемы подвержены тиристорному эффекту в одинаковой мере. Он характерен, например, для микросхем КР537РУ10, КР1146ФП2, но редко проявляется в таких распространенных сериях, как К561, КР1561 и многих других, изготовленных с использованием специальных приемов — охранных колец, МОП-транзисторов с вертикальным каналом и окольцовывающим затвором, технологии КНС (кремний на сапфире).
В данной статье мы рассмотрим способы подключения этих джойстиков к персональному компьютеру. Сначала несколько общих рекомендаций.
Как правило, схемы подключений очень простые и содержат небольшое число радиоэлементов. Для подключения джойстиков используется LPT-порт компьютера. Можно также использовать мультикарту, которая устанавливается в ISA разьем расширения на материнской плате. Мультикарта применялась в старых моделях PC и представляет собой плату с контроллерами LPT, COM портов, флоппи диска и т.п. Мультикарт существует несколько разновидностей. Для наших целей необходима мультикарта, в которой есть контроллер и соответственно разъём LPT порта. Кстати, применяя мультикарту, исключается риск в случае ошибки сжечь выходные цепи контроллера LPT порта в материнской плате. А если сгорит мультикарта, то материальный ущерб от этого не будет столь ощутимым.
При подключениях желательно кабель джойстика не разрезать - он может пригодиться еще по своему прямому назначению. Лучше попробовать найти ответную часть разъёма для подключения джойстика к интерфейсу PC. Если ответную часть разъёма найти не удалось, то можно разобрать какой-нибудь разъём (вилку или розетку - в зависимости от того, какой вид разъёма у джойстика) с подходящими по размеру штырьками или гнездами и их использовать для подключения. Разумеется, что в данном случае каждый штырек или гнездо придется подключать к контакту разъёма джойстика отдельно. Во избежании короткого замыкания на каждое гнездо (или штырек) надевается кембрик подходящего диаметра и все это обматывается изоляционной лентой и той же лентой прикрепляется к корпусу разъёма джойстика. Внешне выглядит это не очень красиво, зато надежно - не будет замыканий да и гнезда (или штырьки), подключенные к разъёму джойстика, не будут выскакивать.
При подключении к параллельному порту возникают проблемы с питанием джойстика, потому что сам порт не имеет выхода питания +5 В или другого. Конечно, можно взять напряжение питания с игрового порта или непосредственно с блока питания компьютера. Такое решение вполне возможно, но создает дополнительные проблемы. В данном случае можно поступить проще. Напряжение питания может быть получено со штырька данных порта LPT. Для геймпадов с малым потреблением тока достаточно использовать выпрямленное напряжение со штырька 9. Для джойстиков с относительно большим током потребления используется выпрямленное напряжение сразу с нескольких штырьков данных, например с 3 по 9. Штырьки соединяются с анодами (+) выпрямительных диодов, а диоды, в свою очередь катодами (-) соединяются в одну точку, которая подключается к проводу питания джойстика. В качестве общего провода любой штырек LPT порта с 18 по 25.
В качестве примера рассмотрим подключение джойстика от игровой приставки SONY PlayStation.
Рис.1
Вид разъёма на рисунке показан так, если на него смотреть со стороны штырьков. Имеется возможность подключить одновременно 2 джойстика. В данном случае все идущие ко второму джойстику провода на приведенной схеме дублируются кроме подключенных к DB25-10 и DB25-12. Провод второго джойстика вместо DB25-10 подключается к DB25-13, а вместо провода DB25-12 соответственно DB25-15.
Следует учесть, что при одновременном подключении двух джойстиков параллельный порт уже не сможет обеспечить необходимой мощности в цепи питания, поэтому придется использовать другой источник питания. Как уже говорилось выше, можно использовать напряжени + 5 B непосредственно от блока питания компьютера или воспользоваться любым внешним источником с выходным напряжением 4.5 - 5 В и током 100 - 150 mA. Дополнительный источник питания подключается так: все диоды с контактов DB25-5 - DB25-9 удаляются, а плюс дополнительного источника питания подключается в ту точку, где были соединены катоды диодов. Общий провод дополнительного источника соединяется с DB25-18/19. Схема подключения двух джойстиков приведена ниже.
Рис.2
Показанный на рисунке ещё один источник питания +9 В предназначен для питания встроенных двигателей геймпада Dual Shock (функция вибрации). Если эта возможность джойстика не используется или подключается простой джойстик (не Dual Shock), то этот источник питания не подключается. При необходимости в использовании данной функции следует подключить источник питания напряжением 9 В в соответствии с приведенной схемой.
Сначала я и не думал писать статью на эту тему, но похоже, что это уже часть целого цикла статей на Денди-тематику. И да, на этот раз речь в первую очередь именно про отечественную Денди, а не про оригинальные консоли — Famicom или NES. Просто я делал устройство в подарок одному человеку, который снимает очень интересные видеоролики про Денди, и ориентировался на совместимость именно с этим клоном.
Дело в том, что и для Famicom, и для NES выходили самые разные аксессуары: 3D очки, клавиатуры, роботы, считыватели штрих-кодов, всякие игровые контроллеры и очень многое другое. До нас же дошёл только световой пистолет. Передо мной стояла задача собрать устройство, которое совмещало бы в себе разветвитель на четыре игрока (да, были такие игры) и Arkanoid-контроллер.
Порты ввода-вывода
Прежде всего стоит рассказать, как же работают с джойстиками игровыми контроллерами Famicom, NES и Dendy, и чем же они отличаются в этом плане.
С точки зрения игр порты ввода-вывода представляют из себя два регистра с адресами $4016 и $4017, которые ассоциированы соответственно с двумя портами, куда всё и подключается. Но на стандартных контроллерах для чтения данных используется только один провод — D0, данные с которого соответственно доступны через младший (нулевой) бит в каждом из регистров: $4016.0 и $4017.0. Аналогично используется один провод на запись, его обычно называют STROBE (или LATCH), который сбрасывает счётчик внутри геймпада, и который доступен через запись в $4016.0 (да, для обоих контроллеров он общий).
Проще говоря, чтобы получить состояние кнопок на первом контроллере надо сначала записать 1 в $4016.0, сразу же записать туда же 0, сбросив таким образом счётчик, а потом прочитать $4016 и $4017 восемь раз (для каждой из кнопок), получая данные о кнопках из младшего бита. Но для чего же остальные биты в этих регистрах, куда идут эти линии? Рассмотрим порт контроллера у NES:
Да, на него на самом деле идут D3 и D4! Именно они и доступны через $4016.3, $4016.4 у первого порта и $4017.3, $4017.4 у второго, и именно они используются для нестандартных контроллеров.
Что же касается его японского собрата — Famicom, там нет этих портов, да и сами игровые контроллеры не отсоединяются от консоли, но у него есть порт расширения, который представляет из себя разъём DB-15.
Знакомо выглядит, правда? Да, когда китайцы проектировали нашу Денди (я сомневаюсь, что её проектировали у нас), и им нужно было сделать отсоединяющиеся контроллеры, они решили взять за основу именно порт расширения, ведь в нём есть контакты для второго контроллера, и он на Famicom расположен чуть правее центра. Им тут даже распиновку менять не пришлось. Что же касается первого контроллера, они взяли тот же DB-15, расположили его слева и поменять распиновку так, чтобы можно было подключать первый контроллер. И только его.
Сравните сами передние порты у Famicom и у нашей Денди:
Вот такая вот странная история этих пятнадцатипиновых разъёмов у геймпадов, которые используются в нашей стране.
Но давайте посмотрим, что же выведено на этот порт расширения у Famicom?
Да, на него идут ещё $4016.1 (на ввод), $4017.0-4 (на ввод), $4017.0-2 (на вывод), внешнее прерывание и даже звук! Я был очень приятно удивлён, когда разобрал Денди и увидел, что всё это есть и там:
Правда, не во всех моделях, как выяснилось позже. Но если это есть, значит есть и полная совместимость с аксессуарами для Famicom, и их могут использовать соответствующие японские игры. Но напомню, что Денди — это очень странная смесь NES и Famicom, PAL и NTSC. Пираты выпускали для неё и японские, и американские игры, которые по сути на 100% совместимы, если не брать в рассчёт эти аксессуары и разный формат картриджей.
Итого: в некоторых Денди есть все те же выводы, что и на Фамикоме, которые при этом включают в себя часть выводов доступных на NES. Отсутствует доступ к $4016.3 и $4016.4, но они используются крайне редко. В виде таблички для наглядности:
Принцип работы аксессуаров
Американский разветвитель на четыре игрока для NES называется Four Score представляет из себя простой набор сдвиговых регистров. Т.е. первые восемь чтений из $4016.0 дают данные из первого контроллера, а вторые восемь — из третьего. Аналогично $4017.0 даёт данные о втором и четвёртом контроллерах. Помимо этого при продолжении чтения устройство выдаёт свою сигнатуру, с помощью которой игра определяет, что подключен именно Four Score, а не что-то ещё. Получается, что такое устройство можно собрать из шести сдвиговых регистров (4021 или 74165), и оно будет работать на любой Денди, ведь для него не требуются дополнительные линии данных. Само собой, только с американскими играми, которые выходили для NES.
Японский аналог для Famicom устроен гораздо проще. Третий и четвёртый контроллеры подключаются напрямую в порт расширения и доступны через $4016.1 и $4017.1. Соответственно для такого переходника нам уже нужен полноценный порт расширения у Денди, иначе поиграть вчетвером в японские игры не получится.
Arkanoid-контроллер, как ясно из названия, используется для игры Arkanoid и представляет из себя ручку-крутилку и одну кнопку. Внутри же это аналого-цифровой преобразователь и сдвиговый регистр, который так же последовательно выдаёт положение ручки. Разница между японской и американской версией только в способе подключения. Японская версия игры читает положение ручки и состояние кнопки из $4016.1 и $4017.1, а американская версия из $4016.3 и $4016.4 соответственно. Получается, что для японского Арканоида нужен полноценный порт расширения, а для американского подойдёт любая денди, где работает световой пистолет (он использует те же выводы).
Создание своего аксессуара
Хотя сами по себе вышеперечисленные устройства имеют простую схему и собираются из простейших логических компонентов, для сердца устройства типа «всё в одном» я решил использовать ПЛИС. Тем более мне было высказано пожелание сделать там ещё и простейший переключатель-свитч, а мне хотелось сделать возможность менять местами кнопки A и B. Сначала я выбрал Altera EPM3064ATC100, но вскоре выяснилось, что 64 макроячейки мне не хватит, и выбор пал на EPM3128ATC100, где уже 128 макроячеек.
Если уж на то пошло, я решил совсем не мелочиться и поставить в устройство ещё и какой-то экран, на котором показывались бы текущий режим и меню с настройками, к тому же у меня давно валялся без дела один знакосинтезирующий «16x2» дисплей. Вот для работы с ним уже нужен микроконтроллер, и я выбрал ATMEGA16.
Мне всегда было сложнее всего придать устройству приятный внешний вид. Всё-таки я программист, а не дизайнер, но именно при изготовлении устройства в подарок хотелось сделать его максимально красивым и удобным. Тем более это чуть ли не единственный способ как-то показать другим своё произведение искусства: фотографии и видео — это не то, по готовым схемам и 3D моделькам такие вещи воссоздают единицы, серийное производство наладить тяжело, а вот подарок — самое то.
Итак, требования к внешнему виду были такие: четыре порта для стандартных DB-15 контроллеров от Денди, четыре кнопки для их выбора и настройки, кнопка «режим», кнопка «настройки», удобная ручка для Arkanoid и кнопка для него же, которые должны располагаться достаточно удобно и не мешаться. Помимо этого хотелось сделать, чтобы активные порты подсвечивались светодиодами и как-то интуитивно связывались с соответствующими кнопками, логичнее всего при этом расположить разъёмы в ряд, но эти дурацкие DB-15 слишком огромные для этого. Помимо всего устройство должно удобно лежать в руках, ведь оно само по себе игровой контроллер для Arkanoid. В итоге я пришёл примерно к такому виду:
Кнопки в ряд, порты друг над другом, ручка сбоку, кнопка для Arkanoid сзади слева.
Получается, что места внутри достаточно много. Поэтому ПЛИС с разъёмами под провода и гнёзда я решил вынести на одну плату, а микроконтроллер с экраном и кнопками — на другую. Соединяются они при этом простейшим последовательным интерфейсом.
Плата с ПЛИС (первая версия):
Код для ПЛИС я писал на Verilog. Для каждого режима он получается достаточно простым. В первую очередь для многих из них нам надо считать обращения к каждому из портов, т.е. импульсы на проводе clock:
(простите, хабр не умеет подсвечивать Verilog)
Где strobe_in — это strobe (один на оба порта), а clock1_in и clock2_in — это соответственно clock на каждом из портов. Внутри консоли стоит логика: clock = R/W nand (адрес == $4016/$4017), т.е. на clock логический ноль, когда консоль читает данные по соответствующему адресу.
Режим имитации американского разветвителя на четверых игроков выглядит так:
В режиме японского же разветвителя на четверых нужно просто соединить входы с выходами напрямую:
Самым сложным оказалось сделать возможность менять местами кнопки A и B, ведь считываются они последовательно, т.е. нужно заранее знать значение B, когда консоль запрашивает A, но оно выдаётся как раз только после A. Сначала я думал как-то ускоренно считывать данные с контроллера, используя какой-то внешний тактовый генератор, но в итоге решил просто брать значение от предыдущего считывания. Это даёт задержку, но она абсолютно незаметна. Тем более игры обычно читают состояние кнопок по несколько раз подряд.
Само собой, все эти режимы и настройки надо как-то задавать. Для этого я определил 12-битный регистр control, данные в который записываются через последовательное соединение, с дополнительным битом для проверки чётности:
Соответственно со стороны микроконтроллера код (весьма грязный) выглядит вот так:
В остальном в коде микроконтроллера нет ничего особенного: работа с дисплеем на контроллере HD44780, кнопки, светодиоды, простенькая менюшка и работа с аналого-цифровой преобразователем для определения угла поворота ручки.
Я всё отладил, убедился в работоспособности и уже начал упихивать компоненты в корпус…
Но перед закрытием крышки решил проверить на оригинальном Famicom, ведь с ним устройство тоже будет использоваться. Увы, режимы, где нужно было считать импульсы clock, работали неправильно. С помощью логического анализатора выяснилось, что с линии данных идут наводки на линию clock:
Это помеха длительностью всего в несколько десятков наносекунд всё портит. Я решил посмотреть своим простеньким осциллографом, что же происходит на линии clock у Денди:
А вот что там же у Фамикома:
Видно, что эта линия подтянута к VCC, при чём очень сильно у Денди и весьма слабо у оригинального Фамикома. Я начал экспериментировать с обвеской. Вскоре стало ясно, что на результат лучше смотреть не логическим анализатором, а самой консолью. Пришлось вспоминать ассемблер для 6502 процессора, писать простенькую программу для тестирования и записать её на картридж:
На ней сразу стало всё наглядно видно, а заодно можно было протестировать сразу все режимы, не меняя игры. ROM можно скачать тут.
В итоге проблема была решена подтяжкой линий clock к VCC через резистор в 1кОм, конденсатором между clock и землёй в 22нФ и резисторами на 200 Ом в разрыв всех линий данных. Увы, пришлось травить новую плату (не фотографировал), но зато после этого сразу же всё заработало.
Итоговый вид устройства:
Во времена СССР я мог бы быть хорошим промдизайнером.
И если вас заинтересовала тематика работы разных игровых контроллеров и создания самодельных, мы как раз на эту тему сняли вторую серию нашего шоу «Пока все играют», где многое очень просто и наглядно объясняется для тех, кто совсем не в теме:
Думаю многие из вас помнят те славные времена, когда мы часами рубились в танчики, черепашки ниндзя, батлтодс энд даблдрагон и еще пару десятков других суперских игр на Денди. Это было шикарное время! Большинство игр были чертовски сложные, но даже несмотря на это, неудача за неудачей, мы, все равно, шли к своей цели и начинали игру заново, чтобы уж сегодня-то пройти ее до конца.
Поностальгировав всласть, я решил, что очень хочу поиграть в Dendy и поиграть хочу на ноутбуке, но не на клавиатуре, а на старом добром джойстике.
Ниже я опишу, с какими проблемами я столкнулся и как их решил.
Немного поясню, почему именно так мне захотелось поиграть. Приставка у меня сохранилась и она отлично работает, но осталась всего пара картриджей(остальные раздал друзьям). А играть на клавиатуре в игры денди, ну это как-то совсем не айс.
Встала проблема, как подключить джойстик от Денди к ноутбуку.
Немного погуглив, я понял, что в основном это решается подключением через LPT порт и использованием готовых драйверов, но у меня ноутбук, и мне это не подходит. Тут я вспомнил, что у меня есть плата Arduino Uno и я решил, что пойду своим путем и буду использовать именно ее.
0. Определение распиновки на джойстике
Первая проблема оказалась в том, что коннекторы у джойстиков внутренние, а все описания распиновок найденные в интернете, были для внешних коннекторов.
Найти спецификацию на мою noname денди мне не удалось, поэтому я стал рассматривать внутреннюю плату, чтобы найти там питание и землю, и понять какие из пяти контактов на джойстике с ними соединяются. С этим я справился быстро. Оказалось это два крайних контакта.
К Ардуино, я подсоединил все напрямую, питание — питание 5В, земля — земля, остальные три контакта подсоединил к 2, 3 и 4 цифровому пину.
1. Описание протокола работы джойстика
2. Настройка среды
Если у вас уже все настроено или вас устраивает Arduino IDE, можете перейти к 3 пункту.
Не знаю, как вас, но лично меня официальная Arduino IDE ужасно угнетает, поэтому коротко расскажу, как использовать свою любимую IDE.
Первым делом я скачал исходники Arduino IDE и нашел там код отвечающий за компиляцию и аплоад прошивки. Потратив немного времени я выделил все команды, которые там используются:
В приведенной выше команде, при линковке, используется библиотека libArduino.a, ее можно получить скомпилировав все *.c и *.cpp файлы из папки с хэдэрами и собрав все объектники в один архив. А можно просто запустить Arduino IDE, скомпилировать любой проект и скопировать файл /tmp/build*.tmp/core.a. Это будет абсолютно эквивалентно.
Все эти команды актуальны для Arduino Uno, для других ардуин следует изменить некоторые параметры.
Теперь используя эти команды можно легко настроить свою IDE, на автоматическую компиляцию и загрузку прошивки.
3. Написание кода прошивки
Здесь нужно было лишь определить какие из 2, 3 и 4 пина отвечают за Latch, Clock и Data. Это я решил методом проб и ошибок. Предполагаем, что 4 это Data, и делаем Serial.println(digitalRead(4)), если при нажатии кнопок есть какая-то реакция, значит это оно. Остальные 2 контакта определились, когда уже была написана прошивка, если все работает значит угадали, нет — меняем местами.
4. Написание «драйвера»
Здесь нужно было принять этот самый байт от Arduino и эмулировать нажатия кнопок клавиатуры. Да-да, нажатия на джойстике будут обрабатываться, как нажатия на клавиатуре, хорошо это или плохо.
В качестве языка программирования я выбрал Python. Простой и эффективный, полагаю, он отлично подошел для этой задачи.
Единственная проблема, которая здесь возникла это дребезг контактов джойстика. Я ее решил путем введения временного интервала, наступающего после смены состояния кнопки, в течение которого состояния не изменяется. Хватило 0.05 с.
Для эмуляции нажатия кнопок клавиатуры я использовал утилиту xte, идущую в комплекте Xautomation. Она очень проста в использовании, вот пример: xte 'keydown Left' . За дополнительной инфорацией смотрите man xte.
Для выхода из драйвера я использовал состояние, когда нажата вся крестовина целиком. Этому состоянию соответствует число 0xf0.
5. Ура! Играем!
Все! Осталось лишь настроить эмулятор денди, я выбрал FCEUX.
Указываем в настройках те клавиши, которые указаны в драйвере ииии вспоминаем детство!
Заключение
Как ни крути, но Ардуино это замечательная платформа для подобных экспериментов.
Теперь осталось только собрать все это в виде отдельного устройства.
Что же касается долговечности джойстиков, то мой опыт показательным может быть ЕДВА ЛИ Мне 37 лет и приставка покупалась мной ИЗ НОСТАЛЬГИЧЕСКИХ СООБРАЖЕНИЙ просто, чтобы периодически вспоминать детство. А потому играю я в неё не чаще часа в месяц. При этом у меня еще есть джойстик от PS4, который я подключаю в USB-порт ноутбука и при помощи эмулятора "Messen" утоляю свои ностальгические порывы в тех случаях когда нахожусь вне дома. Поэтому мои джйсики пока в практически идеальном состоянии )
Если бы я реально был великовозрастным геймером, имеющим возможность играть ежедневно, то, вероятно, давно бы уже купил себе СОВРЕМЕННУЮ приставку. Однако у меня нет достаточного количества времени для игр на ней
Читайте также: