Author: ChrisDeadman
Convert USB devices to PS/2 & Gameport devices with the power of Arduino 🙂
* Descriptor parsing is a work in progress and may not work for all devices.
** Currently, only the Xbox 360 Wireless Receiver is supported.
* All types are supported, including IntelliMouse (5 Buttons + Scroll wheel).
** Scancode Set 2
* Other ATSAMD21G18 boards should also work well, provided they have the same pinout.
Power the board using a USB cable and set the Power select jumper to USB.
Alternative: Set Power select jumper to Gameport. Be aware that the current is limited depending on the host machine.
Use a USB OTG cable to connect your USB device to the Arduino.
Recommendation: Connect a USB hub to the Arduino if you want to use multiple USB devices.
This is how USB Joysticks / Gamepads are mapped to the Gameport:
Joystick 1 | Joystick 2 | Gameport |
---|---|---|
X-Axis 1 / D-Pad | - | X-Axis 1 |
Y-Axis 1 / D-Pad | - | Y-Axis 1 |
X-Axis 2 | X-Axis 1 / D-Pad | X-Axis 2 |
Y-Axis 2 | Y-Axis 2 / D-Pad | Y-Axis 2 |
Button 1 / A / R2 | - | Button 1 |
Button 2 / B / L2 | - | Button 2 |
Button 3 / X / Select | Button 1 / A / R2 | Button 3 |
Button 4 / Y / Start | Button 2 / B / L2 | Button 4 |
Consult the table below to understand the mapping between various device inputs when an emulation mode is enabled:
Keyboard | Mouse | Joystick | Gameport |
---|---|---|---|
Left / Right Arrow | X-Axis | X-Axis 1 / D-Pad | X-Axis 1 |
Up / Down Arrow | Y-Axis | Y-Axis 1 / D-Pad | Y-Axis 1 |
A / D | - | X-Axis 2 | X-Axis 2 |
W / S | Scroll wheel | Y-Axis 2 | Y-Axis 2 |
L-Ctrl / R-Ctrl | Button 1 | Button 1 / A | Button 1 |
Space / R-Shift | Button 2 | Button 2 / B | Button 2 |
L-Alt / CapsLock | Button 3 | Button 3 / X | Button 3 |
L-Shift | Button 4 | Button 4 / Y | Button 4 |
Period | Button 5 | Button 5 / R1 | - |
Comma | - | Button 6 / L1 | - |
Up Arrow | - | Button 7 / R2 | - |
Down Arrow | - | Button 8 / L2 | - |
Escape | - | Button 9 / SELECT | - |
Tab | - | Button 10 / START | - |
Joystick -> Keyboard Emulation Mode:
Moving the joystick along X-Axis 1 (or D-Pad left and right) acts as if you pressed the Left / Right Arrow keys on the keyboard.
Joystick -> Mouse Emulation Mode:
Moving the joystick along X-Axis 1 (or D-Pad left and right) move the mouse cursor along the X-Axis.
Keyboard -> Joystick Emulation Mode:
If L-CTRL or R-CTRL is pressed, it acts as if you pressed Button 1 on the joystick.
Keyboard -> Mouse Emulation Mode:
The Left / Right Arrow keys on your keyboard move the mouse cursor along the X-Axis.
Mouse -> Joystick Emulation Mode:
Moving the mouse left and right corresponds to moving the joystick along the X-Axis 1.
Enter this mode to enable special features. Note that those settings are reset to default when the device is reset.
Setting | LED1 Blinks | Values / LED2 Blinks | Default |
---|---|---|---|
Emulation Mode | 1 | OFF | OFF |
1 Joystick -> Keyboard | |||
2 Joystick -> Mouse | |||
3 Keyboard -> Joystick | |||
4 Keyboard -> Mouse | |||
5 Mouse -> Joystick | |||
Swap joy axis 3 and 4 | 2 | ON / OFF | OFF |
Mouse Emu Speed | 3 | 1 <= n <= 255 | 2 |
Keyboard | Joystick / Gamepad | Function |
---|---|---|
CTRL+SHIFT+WIN | Button 5 / R1 + Button 6 / L1 | Hold for ~1s to enter/exit setup mode |
Return | Button 1 / A | Edit setting / exit edit mode |
Right Arrow | X-Axis 1 / D-PAD Right | Next setting / increase value (edit mode) |
Left Arrow | X-Axis 1 / D-PAD Left | Prev. setting / decrease value (edit mode) |
ESC | Button 9 / SELECT | Apply Default Settings and exit setup mode |
F1 | - | Set Emulation Mode #1 and exit setup mode |
F2 | - | Set Emulation Mode #2 and exit setup mode |
F3 | - | Set Emulation Mode #3 and exit setup mode |
F4 | - | Set Emulation Mode #4 and exit setup mode |
F5 | - | Set Emulation Mode #5 and exit setup mode |
F6 | - | Toggle Swap joy axis 3 and 4 and exit setup mode |
F7 | - | Decrease Mouse Emu Speed and exit setup mode |
F8 | - | Increase Mouse Emu Speed and exit setup mode |
bossac --port=/dev/ttyUSB0 -U -i --offset=0x2000 -e -w firmware.bin -R
Ensure you change --port
to match your system's actual port. The example provided is for Linux systems.
Diagnostic information is available via Debug Conn. @ 115200 8N1
Sending any character returns sent/received data and device status.
Enable USB Debugging in USB.h
(in USB_Host_Library_SAMD) by uncommenting #define DEBUG_USB_HOST 1
and setting #define USB_HOST_SERIAL
to SERIAL_PORT_HARDWARE
.
You can change pins in include/Config.h
.
You can add support for additional USB devices by implementing a JoystickDriverMapper
and adding it to joy_mappers
in main.cpp
.