Arduino Microsoft Sidewinder Wheel
I took time to documentate a Microsoft Sidewinder Wheel modification. This piece of hardware from 1999 is still listed on Amazon:
- Realistic, rugged, and durable styling
- Customizable with profiling software
- 8 programmable buttons
- Easy-to-release wheel clamp
- Sturdy antislip pedals
The wheel is unsupported after Windows XP (or at least does not work well under modern systems). The basic idea was to replace the manufacturer logic with an Arduino to take over the functionality.
The original design used a Mitsubishi MCU M37532 (USB Human Interface Device Controller). The image below shows the connector side of the PCB.
After some tinkering I found out:
- Multiplexed buttons with two select signals (violet and white) & four button signals (brown, red, orange, yellow).
- An analog axis for the steering wheel over a potentiometer (orange, red, brown).
- Two analog axis for acceleration and brake over two potentiometers in the pedals (RJ-like connector).
The hardware engineering consisted of soldering 13 cables onto the right pins. See the result below. No additional components needed.
Pinout and connections between components (cable colors from picture)
Wheel Cable Arduino // steering wheel cable violet Pin 2 white Pin 3 yellow Pin 4 orange Pin 5 red Pin 6 brown Pin 7 // steering wheel potentiometer Pin 1 orange VCC Pin 2 red A0 Pin 3 brown GND // pedal connections ACC yellow A1 BRAKE white A2 VCC red VCC GND blue GND
It has become easy to turn Arduino boards into USB HID devices (mouse, keyboard, joystick). The statement below sets up a steering wheel and pedals with the library ArduinoJoystickLibrary.
Joystick_ mJoystick(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_JOYSTICK, 8, 0, // button count and hat switch count false, false, false, // X, Y and Z axis false, false, false, // rx, ry, or rz false, false, // rudder or throttle true, true, true // accelerator, brake and steering axis );
Working on all boards with the ATmega32u4. See the full source here.
Some notes on the script:
- Buttons are read over digitalRead(), axis over analogRead().
- The joystick library has two modes to operate (initAutoSendState). The default is to send state updates to the PC immediately.
- There is a debug mode in the script for basic timing measurement. The time for the loop logic is 8 to 11 ms. So the update rate is around 100 Hz.
- The analog axis are not mapped to a 0-1023 range during runtime. The script provides a basic initial calibration over the define statements. You should calibrate it one time under Windows.
In the final arrangement the Arduino is taped down.
A DIRT3 joyride is outstanding.