Raspberry Pi GPIO + Sega Mega Drive/Genesis Gamepad
Некоторое время назад у меня появился Raspberry Pi модель «B» с ОЗУ 512МБ. Появился он для лечения 3DS у которой сработала защита GW3DS.
Как-то сразу не продал и он остался. Это мини-компьютер, на линуксе, с USB, Ethernet, HDMI. Помимо USB портов на плате ещё есть порт для переферии GPIO.
Проектов для Raspberry Pi много, и просто десктоп, и медиаплеер, и один из них это эмуляторы старых игровых приставок. Джойстик для эмуляторов можно использовать USBшный.
Позже я наткнулся на информацию что к GPIO можно подключить джойстики от игровых приставок. Правильно называть их геймпад или джойпад или игровыми контроллерами, но мне как-то привычнее называть их джойстиками. Сега, денди, супернинтендо, MD/Genesis, NES, SNES, PS и другие.
Джойстиков от денди и супернинтендо у меня не было. А вот сеговских (megadrive/genesis) было парочку 6-кнопочных, плюс я купил два на алиэкспресс за $6.30. Они оказались не тем что ожидал, нет кнопки mode, короткий шнур, так себе качество и т.д.
Рашил я их подключить к Raspberry Pi. Спаял по схемке, сначала всё напрямую. Кое-как заработало, но нажатия обрабатывались не чётко, были фантомные нажатия.
Дело в том что сеговский джойстик от приставки получает питание 5В, сигналы он выдаёт и принимает тоже 5В уровня, но GPIO имеет уровни 3.3В. GPIO может выйти из строя от 5В уровней, и на плате нет защиты от этого.
Как было написано на нескольких сайтах, сеговский джойстик умеет устойчиво работать от 3.3В выдавая при таком питании уровни 3.3В, что вполне подходит.
Это справедливо для оригинальных 3-кнопочных, у них внутри используется стандартная микросхема 74HC157, если вдруг в конкретном джое она только на 5V (TTL), её можно заменить на другую (2-6V, CMOS).
Если от 3.3В джой не заведётся и микросхему менять не хочется, чтобы подружить их, автором проекта предполагается использование специальной микросхемы 74LVC245. Она выдаёт уровни 3.3В и нормально относится к входным уровням 5В.
74LVC245 в DIP корпусе ни у нас ни в Китае я не нашел, поэтому для эксперимента использовал преобразователь уровня на резисторе 330Ом и стабилитроне 3V3.
У сеговского джоя 9 контактов: питание, земля, 6 сигналов от джойстика, 1 сигнал в джойстик (select). Сигнал select определяет какие конпки опрашиваются в данный момент.
В 3-кнопочном джое сигнал select или «0», тогда выдаются состояния кнопок «A» и «Start», или «1», тогда «B» и «С».
Отдельного генератора и какого-либо контроллера в консоли нет, каждая игра сама формирует сигналы и сама решает как ей опрашивать джой.
В 6-кнопочном джое всё сложнее. Микросхема внутри используется заказная и чтобы по тем же проводам опросить добавившиеся 4 конпки (X Y Z Mode) сигнал select должен отсылать в джойстик определённые сигналы. Причём количество импульсов, их тайминги и паузы должны быть весьма точными.
Если подавать «по старинке» select 0 и 1, то джой не выдаст состояние дополнительных кнопок и будет работать в режиме 3-кнопочного. По сути драйвер формирует сигнал select.
Подал на джойстик 5В, сигналы из него передал через понижатели уровня, сигнал select подключил напрямую.
Стрелки и A B C Start стали обрабатываться чётко. X Y Z Mode не обрабатываются, вернее если зажать кнопку, то иногда можно увидеть кратковременное фантомное мерцание нажатой клавиши.
У меня нет осциллографа посмотреть что там есть на самом деле, но я очень надеюсь этот выход не подгоревший и там всё нормально выдаётся. Ведь A B C Start опрашиваются нормально.
Подобные проблемы с 6-кнопочными джоями я встречал на форумах посвященных RPi и GPIO. С 3-кнопочными вроде бы таких проблем нет.
Оригинального 3- или 6-конпочого джойстика у меня нет. Но думаю там всё будет в порядке. Не на пустом же месте появилась схема и драйвер.
Скорее всего дело в неоригинальности моих джойстиков. Видимо скопирована микросхема с TTL уровнями.
Возможно нужно преобразовывать сигнал select из 3.3В уровня в 5В уровень. Подходящая микросхема 74HC4050N. Но её также у меня нет. Или 74LVC8T245.
Попытался использовать два НЕ элемента из К561ЛН2, запитал её от 5В и получил почти тот-же результат. Возможно из-за того, что в даташите указан уровень «1» не менее 3,6V.
Попытался сделать преобразователь на 2 n-p-n транзисторах и 4*1КОм резисторах, и опять почти тот-же результат. Не знаю несколько точно он преобразовывает и отрабатывает тайминги если сравнивать со специализированными микросхемами.
Есть и другие схемы 3.3V->5V/5V->3.3V и на полевых транзисторах и на спец микросхемах.
Hardware: BCM2708 Revision: 000e
Ставил я RetroPie V2.3.
Сначала обновил систему.
sudo apt-get update
sudo rpi-update
или если не заработало sudo apt-get update && sudo apt-get install rpi-update
Потом обновил RetroPie скрипт.
cd RetroPie-Setup
sudo ./retropie_setup.sh
После запуска нужно проапгрейдить установочный скрипт. [5 UPDATE RetroPie Setup script]
После апгрейда скрипта из него установил драйвер GPIO джойстика, [3 SETUP] [309 Gamecon driver]. Не путать с [326 SNESDev], это другое.
Мануал zless /usr/share/doc/db9_gpio_rpi/README.gz
Загрузать драйвер sudo modprobe —first-time db9_gpio_rpi map=6,6
Выгрузить драйвер sudo modprobe —first-time -r db9_gpio_rpi
Добавить драйвер в автозапуск sudo nano /etc/modules (e.g. «db9_gpio_rpi map=6,6»)
Для теста джойстика есть утилита jstest
apt-get install joystick
jstest /dev/input/jsX (где X номер джойстика (0-1))
https://github.com/petrockblog/RetroPie-Setup/wiki/Module-for-GPIO-interface-for-retro-game-controllers
https://github.com/petrockblog/RetroPie-Setup/wiki/Db9_gpio_rpi
http://blog.petrockblock.com/2012/10/21/the-retropie-gpio-adapter/
http://www.daycounter.com/Circuits/Level-Translators/Level-Translator-Zener-Clamp.gif
http://www.thebox.myzen.co.uk/Raspberry/Breakout.html
http://www.db-elec.com/home/technical-info/Genesis/gamepad-protocol
http://www.bit16.ru/index.php?gl=jpad&act=2
http://sega.ucoz.com/publ/2-1-0-5
http://blog.petrockblock.com/forums/topic/problem-with-the-db9_gpio_rpi-interface-and-a-6-button-genesis-controller/
http://www.raspberrypi.org/forums/viewtopic.php?f=78&t=15787&p=574237
http://blog.sunyday.net/?p=36
http://ru.aliexpress.com/item/8ch-Logic-Level-Bus-Transceiver-5V-to-3-3V-For-Raspberry-Pi/2022249056.html
http://www.raspberrypi.org/documentation/raspbian/updating.md
http://blog.petrockblock.com/retropie/retropie-downloads/