- Делаем сеговский джойстик с USB
- Пульт от «Dendy» в любительских конструкциях
- Что внутри джойстика?
- Устройство дешифратора и его работа
- Интерфейс SPI
- «Turbo A» и «Turbo B»
- UPD: Благо, которое дарит нам «Turbo»
- Интерфейс SNES, NES
- Подключение приборов к дешифратору
- Конструкция устройства
- Подключаем джойстики от Dendy к PC через Arduino
- 0. Определение распиновки на джойстике
- 1. Описание протокола работы джойстика
- 2. Настройка среды
- 3. Написание кода прошивки
- 4. Написание «драйвера»
- 5. Ура! Играем!
- Заключение
Делаем сеговский джойстик с USB
Для того, чтобы собрать такой джойстик, нам понадобиться сам джойстик от Sega MegaDrive-2 и USB клавиатура.
1. Покупаем клавиатуру и джойстик
Клавиатуру я взял самую дешевую, которую нашел, так как от нее нам понадобиться только контроллер с USB проводом:
2. Разбираем клавиатуру и джойстик
3. Нам нужно выбрать кнопки на клавиатуре, которые мы будем использовать
Определяем по дорожкам, какие контакты на контроллере нужно замыкать для каждой из кнопок.
Подробно описывать не буду, так как платы клавиатур отличаются распиновкой контактов.
[W], [A], [S], [D] — Вверх, Влево, Вниз, Вправо;
[J,] [K], [L], [U], [I], [O] — A, B, C, X, Y, Z;
[E] — Start;
[F5] — Mode (буду использовать для быстрого сохранения).
4. Отпаиваем провод от джойстика
5. Припаиваем к контроллеру провода
6. Обрезаем ненужные дорожки на плате джойстика и просверливаем отверстия, чтобы припаять провода от контроллера
7. Припаиваем контроллер
8. Всю полученную конструкцию запихиваем в корпус джойстика
9. Подключаем
Устанавливаем эмулятор сеги, например, GENS и указываем в настройках клавиши.
10. Играем
Проверив джойстик на компьютере, я подключил его к планшету. На него я установил эмулятор GENPlusDroid. На планшете играть оказалось даже удобнее.
В итоге получился универсальный джойстик за небольшие деньги, который работает как на PC, так и на планшете.
Удобно взять собой в дорогу и играть в пути с друзьями. Для этих целей я таким же образом собрал второй джойстик (просто выбрав другие кнопки клавиатуры).
Источник
Пульт от «Dendy» в любительских конструкциях
Часто радиолюбители сталкиваются с проблемой оформления выносного пульта управления устройством. Если число кнопок на нем велико, то для сокращения числа проводов в соединительном кабеле пульт оснащают шифратором команд нажатых кнопок, а устройство дешифратором. В этой ситуации может выручить старый джойстик, от некогда популярных игровых приставок «Dendy». Задача радиолюбителя сильно упрощается, так как джойстик имеет неплохой дизайн и оснащен готовым шифратором команд нажатия кнопок.
Что внутри джойстика?
Примерная схема шифратора, применяемого в джойстиках «Dendy» приведена на рис. 6, в конце статьи. Сведения об интерфейсе между джойстиком и игровой приставкой, вариант схемы джойстика, а также варианты схем дешифраторов можно найти на страницах журнала «Радио». [л] Информация о нажатых кнопках джойстика передается в последовательном формате с использованием тактирующего сигнала «Clock» от управляемого устройства. Для синхронизации с ним джойстик имеет вход «Latch», на который подается короткий импульс с высоким логическим уровнем в начале каждого цикла получения данных от джойстика.
Устройство дешифратора и его работа
Предлагаемое устройство, электрическая принципиальная схема которого изображена рис. 1, является дешифратором, преобразующим сигналы джойстика в дискретные логические уровни, соответствующие нажатым кнопкам.
Его основа — микросхема 74HC595N (DD3), представляющая собой 8-разрядный регистр сдвига с последовательным вводом и последовательным и параллельным выводом информации. Параллельный вывод информации осуществляется через буферный регистр с выходами, которые имеют три состояния. Информационный сигнал подают на вход SER (вывод 14), сигнал записи — на вход SCK (вывод 11), а сигнал вывода («защелкивания») — на вход RSK (вывод 12). Этот регистр принимает байт, несущий в себе информацию о нажатых кнопках, последовательно, и выдает на выходы Q0 — Q7 в параллельном виде. Таким образом, состояние каждого отдельного выхода, выходного регистра микросхемы, будет соответствовать сопоставленной ему кнопке на джойстике. Соответствие выводов регистра и кнопок джойстика показано в представленной ниже таблице.
На микросхеме DD2 собран формирователь синхроимпульса «Latch», необходимый для фиксирования состояния кнопок на джойстике и вывода старшего бита данных из джойстика на выход «Data». Происходит это, по положительному фронту импульса. По отрицательному фронту этого импульса, начинается цикл считывания байта данных. Этот момент обозначен как «цикл опроса джойстика» (смотрим рис. 2). Следующие по порядку биты, будут выдаваться на выход «Data» с появлением положительного фронта тактового импульса, на входе «Clock» джойстика. Также, синхроимпульс «Latch» подается на вход RSK регистра сдвига, это необходимо для «защелкивания» принятого байта в выходном регистре и выводе его на выходы Q0 — Q7 в параллельном виде. «Защелкивание» принятого байта происходит по положительному фронту импульса. Этот момент времени обозначен как «цикл обновления информации на выходе регистра 74НС595» (смотрим рис. 2). С приходом каждого синхроимпульса, информация на выходе регистра будет обновлена.
На микросхеме DD1 собран генератор тактовых импульсов. Частота которого равна 100 килогерц. Тактовые импульсы подаются на вход «Clock» джойстика и на вход SCK приемного регистра 74НС595. Данные о состоянии кнопок джойстика выдаются на выход «Data» по порядку, начиная со старшего бита — D7, D6… D0. Происходит это по положительному фронту тактового импульса на входе «Clock» джойстика. Считываемые с выхода «Data» биты, подаются на вход SER регистр 74НС595. Запись принятого бита в регистр происходит также по положительному фронту импульсов этого генератора.
— чувак! У тебя момент обновления бита информации на выходе «Data» совмещен с моментом чтения установленного бита на выходе «Data»!
— да… это точно. Но джойстик довольно «тормозной», и обновление бита, после прихода положительного фронта тактового импульса, происходит спустя 120 nC. Пока джойстик раздумывает, шустрый 74НС595 успевает записать предыдущее значение c выхода «Data», за 20 nC.
— эээ, «Кулибин»! За время действия импульса «Latch» у тебя в выходной регистр 74НС595 пишется мусор — подряд два бита D7!
— да, признаюсь — халтура. Но после окончания цикла записи всего байта, лишние биты «вывалятся» из регистра в никуда, и никак не повлияют на точность принятой информации.
Интерфейс SPI
И еще один момент… Многие, посмотрев на картинку (Рис. 2) увидели схожесть с таймингом коммуникационного интерфейса SPI. Да да да… за некоторыми отличиями, это он и есть! Надо подменить названия сигналов: «Latch» на CS или SS, сигнал «Clock» на CSLK или CLK, сигнал «Data» на MISO, SDO или SO (кому как больше нравится). Джойстик можно опрашивать встроенным в МК периферийным модулем SPI. Для этого надо отсылать на устройство байт, неважно какой, например FF.
Правда если кому-то этот байт может пригодиться, его можно загружать нужной информацией. Например, для регистра со светодиодами. Или же не загружать, а пересылать принятую информацию от джойстика еще кому-то. То есть, пин MOSI можно использовать.
Принятый байт будет содержать информацию о нажатых кнопках. Нажатой кнопке будет соответствовать бит равный нулю, а не нажатой единице. Если на джойстике не нажата ни одна кнопка, то будет принят байт FF, если умудрится зажать все кнопки сразу, то принятый байт будет содержать 00. SPI интерфейс необходимо настроить для работы в режиме ведущего (Master), ну это-то и так понятно… а режим синхронизации настроить CPOL=1, CPHA=0 (Mode 2). При таком раскладе, данные с выхода «Data» (MISO для МК) будут считываться микроконтроллером по отрицательному перепаду тактового сигнала CSLK, поданного на вход «Clock» джойстика. А обновление бита информации на выходе «Data» джойстика и на входе MISO микроконтроллера, будет происходить по положительному фронту тактового импульса. Таким же способом джойстик можно подключить к плате «Arduino».
«Turbo A» и «Turbo B»
Ранние модели джойстиков содержали 8 кнопок, более поздние десять. Добавилось две кнопки «Turbo A» и «Turbo B». Но на протоколе обмена данными, это никак не отразилось — он остался прежним. Добавленные турбо кнопки эквивалентны кнопкам «А» и «В» с той лишь разницей, что при нажатии на кнопку «Turbo A» будет нажиматься кнопка «А», только со скоростью 12 с половиной раз в секунду. Это справедливо и для кнопок «Turbo B» и «В». Генератор турбо нажатий добавили в сам джойстик (см. рис.6, выделен красным). При нажатии на турбо кнопки на выходах Q6 и Q7 регистра DD3 будут присутствовать импульсы с периодом 80 мС и скважностью равной двум.
Встречаются джойстики с еще большим количеством кнопок, а также и с меньшим. Нажатие дополнительных кнопок на таких джойстиках эквивалентно нажатию сразу двух кнопок на старых моделях. При подключении к дешифратору контрольных светодиодов, разобраться с работой кнопок «супер джойстиков» будет не сложно. (По-моему это были джойстики от «Sega Mega Drive»)
UPD: По поводу SNES.
В комментариях к статье было справедливо замечено:
В тексте речь идёт про генератор турбо нажатий, а к нему идёт картинка с джойстиками, где такого генератора нет. Ниже написано «Нажатие дополнительных кнопок на таких джойстиках эквивалентно нажатию сразу двух кнопок на старых моделях», но это тоже несправедливо по отношению к SNES.
UPD: Благо, которое дарит нам «Turbo»
Наверно кто-то, прочитав про импульсы на выходе дешифратора при нажатии кнопок «Turbo A» и «Turbo B» расстроился:
– Эээ… так кнопки «Turbo» использовать нельзя, как обидно, две кнопки потеряны.
– Нет! Совсем они и не потеряны.
Давайте представим что вам, при управлении каким-либо устройством, необходимо осуществлять приращение какого-либо параметра в сторону увеличения или уменьшения оного. Если при этом требуется высокая дискретность установки величины, то можно устать тискать кнопки «плюс» и «минус», пусть это будут кнопки «А» и «В». Тут-то как раз и пригодятся турбо кнопки. При использовании джойстика совместно с микроконтроллером вы будете избавлены от написания лишнего куска программного кода, потому как вам уже не надо будет втискивать расширенный интерфейсный функционал в две кнопки. Он уже расширен до четырех, и снабжен логикой работы.
Интерфейс SNES, NES
Подключение приборов к дешифратору
Сигналы на выходе дешифратора соответствуют уровням TTL. Нажатой на пульте кнопке соответствует — высокий уровень, низкий — не нажатой. Если подключаемое к дешифратору устройство согласуется по уровням TTL, то дополнительных мер по согласованию не требуется.
Если на выходе дешифратора необходимы инверсные состояния сигналов (кнопка нажата — ноль, кнопка не нажата — единица) то, элемент DD1.4 (Рис. 1) необходимо исключить из схемы.
В тех случаях, когда приборами, подключенными к дешифратору, нельзя управлять логическими уровнями или требуется гальваническая развязка по питанию, следует применить реле или оптопару рис. 4 а, б.
Если для управления, чем-либо требуются сигналы управления статического типа (кнопку нажал, чета там включились, нажал еще раз, выключилось), устройство необходимо дополнить триггером. Применив одну микросхему К155ТМ2 (смотрим рис. 4 в), кнопки «Start» и «Select» можно превратить в переключатели. Возможно, тут проявится эффект дребезга контактов (если подавление не реализовано в самом джойстике). В этом случае необходимо уменьшить частоту тактового генератора, например до 100 герц. При этом джойстик будет опрашиваться 10 раз в секунду, и проблема дребезга будет решена.
Конструкция устройства
Литература:
Ремонт джойстика «Денди»
С. Голубев г. Омск
Журнал «Радио» №6 1996 г.
PS.
Если кому понадобится — вот плата. (в картинке спрятан архив)
Для любителей кино, у меня нашелся какой-то видео отчет — мол, схема на мази…
Источник
Подключаем джойстики от Dendy к PC через Arduino
Думаю многие из вас помнят те славные времена, когда мы часами рубились в танчики, черепашки ниндзя, батлтодс энд даблдрагон и еще пару десятков других суперских игр на Денди. Это было шикарное время! Большинство игр были чертовски сложные, но даже несмотря на это, неудача за неудачей, мы, все равно, шли к своей цели и начинали игру заново, чтобы уж сегодня-то пройти ее до конца.
Поностальгировав всласть, я решил, что очень хочу поиграть в Dendy и поиграть хочу на ноутбуке, но не на клавиатуре, а на старом добром джойстике.
Ниже я опишу, с какими проблемами я столкнулся и как их решил.
Немного поясню, почему именно так мне захотелось поиграть. Приставка у меня сохранилась и она отлично работает, но осталась всего пара картриджей(остальные раздал друзьям). А играть на клавиатуре в игры денди, ну это как-то совсем не айс.
Встала проблема, как подключить джойстик от Денди к ноутбуку.
Немного погуглив, я понял, что в основном это решается подключением через LPT порт и использованием готовых драйверов, но у меня ноутбук, и мне это не подходит. Тут я вспомнил, что у меня есть плата Arduino Uno и я решил, что пойду своим путем и буду использовать именно ее.
0. Определение распиновки на джойстике
Первая проблема оказалась в том, что коннекторы у джойстиков внутренние, а все описания распиновок найденные в интернете, были для внешних коннекторов.
Найти спецификацию на мою noname денди мне не удалось, поэтому я стал рассматривать внутреннюю плату, чтобы найти там питание и землю, и понять какие из пяти контактов на джойстике с ними соединяются. С этим я справился быстро. Оказалось это два крайних контакта.
К Ардуино, я подсоединил все напрямую, питание — питание 5В, земля — земля, остальные три контакта подсоединил к 2, 3 и 4 цифровому пину.
1. Описание протокола работы джойстика
Оказалось не так-то просто найти эту информацию. Лишь несколько сообщений на паре форумов. Лично мне помогла эта запись: code.google.com/p/avrtoys/wiki/joystick, а именно этот код: avrtoys.googlecode.com/svn/trunk/joystick/main.c. А вот ссылка на упомянутую в этой записи заметку в журнале Радио: ftp.radio.ru/pub/arhiv/1996/06-96/46-6-1996.gif. Из всего этого я сделал вывод, что нужно подать сигнал на Latch, а потом 8 раз подавать сигнал на Clock и каждый раз считывать значение с Data, в котором после каждого Clock-а будет содержаться информация о следующей кнопке джойстика.
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 контакта определились, когда уже была написана прошивка, если все работает значит угадали, нет — меняем местами.
В результате я получил 1 байт содержащий в себе информацию о всех 8-ми кнопках джойстика, о каждой в соответствующем бите. У меня получилось следующее расположение: A, B, Select, Start, Up, Down, Left, Right. После этот байт отправляется на компьютер, где принимается и обрабатывается моим «драйвером».
Несложно заметить, что можно легко подключить второй джойстик.
4. Написание «драйвера»
Здесь нужно было принять этот самый байт от Arduino и эмулировать нажатия кнопок клавиатуры. Да-да, нажатия на джойстике будут обрабатываться, как нажатия на клавиатуре, хорошо это или плохо.
В качестве языка программирования я выбрал Python. Простой и эффективный, полагаю, он отлично подошел для этой задачи.
Единственная проблема, которая здесь возникла это дребезг контактов джойстика. Я ее решил путем введения временного интервала, наступающего после смены состояния кнопки, в течение которого состояния не изменяется. Хватило 0.05 с.
Для эмуляции нажатия кнопок клавиатуры я использовал утилиту xte, идущую в комплекте Xautomation. Она очень проста в использовании, вот пример: xte ‘keydown Left’ . За дополнительной инфорацией смотрите man xte.
Для выхода из драйвера я использовал состояние, когда нажата вся крестовина целиком. Этому состоянию соответствует число 0xf0.
5. Ура! Играем!
Все! Осталось лишь настроить эмулятор денди, я выбрал FCEUX.
Указываем в настройках те клавиши, которые указаны в драйвере ииии вспоминаем детство!
Заключение
На самом деле есть и другие, возможно, более эффективные способы использования Ардуино в данной ситуации. Например, если у вас Arduino Leonardo, то можно использовать объект Keyboard для прямой посылки команд клавиатуры на компьютер. Так же можно, как я понял, перепрошить Ардуино так, чтобы она отображалась, как джойстик/клавиатура/мышь и так же напрямую посылать команды. Вот туториал: http://mitchtech.net/arduino-usb-hid-keyboard/. Впрочем, мой способ меня полностью устраивает и результатом я более чем доволен.
Как ни крути, но Ардуино это замечательная платформа для подобных экспериментов.
Теперь осталось только собрать все это в виде отдельного устройства.
Источник