TurboGrafx-16/PC-Engine/Duo to USB adapter
ContentsProject overview
This page explains how to convert a TurboGrafx-16/PC-Engine controller
to USB. The firmware and most of the hardware design are shared with other
projects, such as the
Atari/SMS/Genesis joystick/controller/multi-tap to USB adapter
and
SNES/NES gamepad (and mouse) to USB adapter. The
shared firmware supports TG16 controllers since version 1.7.
Features:
- Supports Pads with DIN and Mini-DIN connectors
- Two speed "Turbo" modes are functional
- No special drivers required. Implements a standard USB HID device
Picture Gallery
Schematic
Here is the schematic and some connector pictures
(DINs on the left, MINI-DINs on the right) to help with the pinout:
Component list:
Ref | Description |
U2 | Atmega8 microcontroller. ATMEGA8-16PC, ATMEGA8-16PI, ATMEGA8-16PJ or ATMEGA8-16PU. Don't use an ATMEGA8L-*, the 12Mhz clock would be too high. |
R1 | 1.5k resistor. Ordinary carbon film 1/4 watt resistors will do. |
R2, R3 | 68 ohm resistors. Ordinary carbon film 1/4 watt resistors will do. |
D2, D3 | 3.6 volts zener diodes. |
Y1 | 12 Mhz crystal. |
C2, C3 | 18 pf capacitors. If the crystal datasheet recommends another value, use it instead. |
C1 | 1uf capacitor. Install it near the ATmega8 power pins. |
J2 | 6 pin header, 2.54mm spacing. Needed for programming the ATmega8. |
For the USB connection, just strip the USB cable and solder the wires directly
to the board. USB uses standard wire colors:
| Color | Description |
---|
| Red | +5 volts |
| Black | Ground |
| Green | D+ |
| White | D- |
Programming
A microcontroller is a component which must be programmed in order to do
something useful. So here is the hexfile which must be uploaded to the microcontroller:
File | Comments |
nes_snes_db9_usb-1.9.hex |
- Special features added to support the Famicom controller with
microphone. Wire the 'jumpers' in NES mode and short PC0 and PC1
together to use this new mode. Wire the extra input (PC2) for the
microphone digital signal from the controller.
- 3 button mappings implemented for the abovementionned Famicon mode.
- Fixed the device name. (It would be corrupted or would not appear since the last few releases)
|
nes_snes_db9_usb-1.8.hex |
- TGFX has its own device name and VID/PID.
- Added Sega Paddle support (HPD-200). Auto-detected in DB9 mode. If the
circuit is installed inside the controller, the two buttons can be
wired independently.
- Controller polling synchronized with USB polls. Helps maintain an
accurate timing when polling the controllers.
|
nes_snes_db9_usb-1.7.hex |
- Improved Genesis 6 button auto-detection
- Mode button now usable on Genesis 6 button controllers
- Sega multi-tap support (tested with MK-1654 only!)(technical info)
- Added TGFX controller support
|
nes_snes_db9_usb-1.6.hex |
- Changed the button IDs. Atari and SMS controllers were
using button 2 and 3. Some emulators require button 1 so....
- Added a way to force 6 Button mode for genesis controllers. Just
in case your 6 button controller is not detected. Hold 'start' when connecting
the USB cable to use this feature.
|
nes_snes_db9_usb-1.5.hex |
- Added support for Genesis 3 and 6 button controllers.
- All DB9 controllers (Genesis 3/6, SMS, Atari style 1 or 2 button and
compatible) are auto-detected.
- The wiring is now different for DB9 controllers. Easier to wire
to the multiuse PCB.
- NES controllers are now detected in SNES mode. This works great with
original Nintendo controllers. If you have trouble with clones, use
NES-only mode.
- The project is now released under the GPL v2 license
|
snes_nes_atari_usb-1.4.hex |
- Added support for Atari style joysticks (Atari, Commodore, etc).
Two button variations (eg: Sega Master System) are also supported.
- Added padding to the nes report descriptor. This makes it work correctly
on Windows. Linux sure is tolerant...
|
snes_nes_usb-1.3.hex |
- Fixed a bug which resulted in random button toggling when no
controller was connected to the circuit.
- NES mode now has it's own USB product ID.
- PD1 is left in input (and no pull-up) since PD1 and PD0 must
be shorted together in PCB rev.C (cleaner workaround than
throwing away a batch of 50 PCBs and easier than cutting a track
and soldering a wire...)
|
snes_nes_usb-1.2.hex |
Added Snes mouse support. |
snes_nes_usb-1.1.hex |
Reworked the report descriptor for better behaviour under Windows and MacOS X |
snes_nes_usb-1.0.hex |
Initial release. |
Many microcontrollers have what is called 'Fuse bytes'. In the case of the ATmega8, there
are two bytes: The high byte, and the low byte. Those bytes are used to configure some aspects
of the microcontroller. What type of clock to use? Crystal? Resonator? Internal RC clock? Allow
programming via ISP? It's very important to set the fuses to the right values. Using the wrong
values can render your MCU unusable.
For this project, here are the appropriate fuse values:
high byte =
0xc9, low byte =
0x9f
For details about how to program an AVR,
visit my
AVR programming page.
Source code
For those who wish to modify the device behaviour or add support
for new type of gamepads, here is the source code. Starting with version
1.5, it is released under the GPL v2 license. Previous version were released under
the Objective Development license, which is basically GPL + extensions to
cover hardware. See License.txt for more information.
File | Comments |
nes_snes_db9_usb-1.9.tar.gz |
- Special features added to support the Famicom controller with
microphone. Wire the 'jumpers' in NES mode and short PC0 and PC1
together to use this new mode. Wire the extra input (PC2) for the
microphone digital signal from the controller.
- 3 button mappings implemented for the abovementionned Famicon mode.
- Fixed the device name. (It would be corrupted or would not appear since the last few releases)
|
nes_snes_db9_usb-1.8.tar.gz |
- TGFX has its own device name and VID/PID.
- Added Sega Paddle support (HPD-200). Auto-detected in DB9 mode. If the
circuit is installed inside the controller, the two buttons can be
wired independently.
- Controller polling synchronized with USB polls. Helps maintain an
accurate timing when polling the controllers.
|
nes_snes_db9_usb-1.7.tar.gz |
- Improved Genesis 6 button auto-detection
- Mode button now usable on Genesis 6 button controllers
- Sega multi-tap support (tested with MK-1654 only!) (technical info)
- Added TGFX controller support
|
nes_snes_db9_usb-1.6.tar.gz |
- Changed the button IDs. Atari and SMS controllers were
using button 2 and 3. Some emulators require button 1 so....
- Added a way to force 6 Button mode for genesis controllers. Just
in case your 6 button controller is not detected. Hold 'start' when connecting
the USB cable to use this feature.
|
nes_snes_db9_usb-1.5.tar.gz |
- Added support for Genesis 3 and 6 button controllers.
- All DB9 controllers (Genesis 3/6, SMS, Atari style 1 or 2 button and
compatible) are auto-detected.
- The wiring is now different for DB9 controllers. Easier to wire
to the multiuse PCB.
- NES controllers are now detected in SNES mode. This works great with
original Nintendo controllers. If you have trouble with clones, use
NES-only mode.
- The project is now released under the GPL v2 license
|
nes_snes_usb-1.4.tar.gz |
- Added support for Atari style joysticks (Atari, Commodore, etc). Two button
variations (eg: Sega master system) are also supported.
- Added padding to the nes report descriptor. This makes it work
correctly on Windows. Linux sure is tolerant...
|
nes_snes_usb-1.3.tar.gz |
- Fixed a bug which resulted in random button toggling when no
controller was connected to the circuit.
- NES mode now has it's own USB product ID.
- PD1 is left in input (and no pull-up) since PD1 and PD0 must
be shorted together in PCB rev.C (cleaner workaround than
throwing away a batch of 50 PCBs and easier than cutting a track
and soldering a wire...)
|
nes_snes_usb-1.2.tar.gz |
Added SNES mouse support. |
nes_snes_usb-1.1.tar.gz |
Reworked the report descriptor for better behaviour under Windows and MacOS X |
nes_snes_usb-1.0.tar.gz |
Initial release. Snes and Nes support. |
Please contact me at
raph@raphnet.net
if you do useful changes.
Objective Development driver modifications:
The NES/SNES mode selection jumper changes the HID report descriptor. I had to modify
Objective Development's usb driver to support this. Here is a diff against
the usb driver from HIDKeys.2006-03-14:
usbdrv-diff
USB Vendor ID/Product ID pair:
Please do not re-use my VID/PID pair for derived or other projects. Instead, get your own.
I bought my VID/PID pairs from
mecanique,
and they are much less expensive than the 2000$ US it cost to get a vendor ID from the usb implementers
forum.
PCB for surface-mount
The surface-mount version uses my
Multiuse PCB2 circuit.
Here's what it looks like:
Multiuse PCB2:
|
Disclaimer
I cannot be held responsible for any damages that could occur to you
or your equipment while following the procedures present on this page.
Also, I GIVE ABSOLUTELY NO WARRANTY on the correctness and usability
of the informations on this page. Please note, however, that the procedures
above have worked in my case without any damages or problems.
Now you cannot say that I did not warn you :)