DIY: using Thrustmaster wheels with QR and working buttons on DD wheelbase like VRS DirectForce Pro / MiGE 130ST

Combined.jpg


I’m using Thrustmaster wheels for years. Until recently on a T300 wheelbase, but now I have moved on to a Virtual Racing School DirectForce Pro direct drive wheelbase.
A direct drive wheelbase is quite an expense, I did not want to buy new wheels as well. Since I had already added a quick release to my Thrustmaster wheels I was looking for a way to reuse these on the VRS DirectForce Pro, with working buttons. A few guys figured out parts of my project:

I have done the last bit:
  • Figuring out how to connect the Sparkfun Pro Micro to a female 6 pin mini-DIN connector.
  • Enhanced Noel’s Arduino code by adding support for hot plugging Thrustmaster R383, F1 and Ferrari 599xx Evo wheels. It detects which wheel is plugged in and maps the corresponding buttons.
  • Added support for the Thrustmaster F1 wheel. This took me a few days since I had a lot of timing issues with this wheel. Maybe Thrustmaster is using different chips inside the wheel, I don’t know, but I managed to solve it in the end.
  • Converting all button numbers on these wheels to the standard Thrustmaster button numbering, this makes swapping wheels easier. All buttons are working on the wheels mentioned.
Attached you will find the Sparkfun Pro Micro code and a construction manual to make it all work. Sorry for the low-res pictures, RaceDepartment only allows a maximum file size of 1 MB for PDF files.

Rename TMwheels.ino.txt to TMwheels.ino.

March 21 2022: manual updated to version 1.1, see second post below.

June 2022: addendum - alternative to the 3D printed steering shaft, see post #15 below.

October 2022: tiny bug fixed in the Arduino code, 'button pressed' was sent continuously over USB as long as a button was pressed (sending 'button pressed' once is enough).

November 2023: if you experience a bit of play in the wheel or hear clicks while turning the wheel at high FFB forces, see this post how to fix that.

Have fun!

Insert Coin
 

Attachments

  • TM wheels with QR on DD VRS DFP low resolution.pdf
    682.2 KB · Views: 371
  • TMwheels.ino.txt
    10.9 KB · Views: 205
Last edited:
  • Deleted member 1066209

This is freaking wonderful. Thank you so much for documenting your knowledge!
 
Manual updated to version 1.1

Improved the design of the adapter:
1. 5 bolts instead of 3. The original design didn’t have a bolt at one side. I have managed to squeeze in 2 more bolts, which wasn’t easy: I had to prevent loss of material. It won’t win a beauty contest, but the two adapters are now firmly attached to each other.
2. Added an interlock to the design of the adapters. Previously the adapters were pushed together on a flat surface, which, after some time of use, started to shift and due to the movement between the two adapters it caused the bolts to loosen. The interlock prevents this from happening.
3. Larger tolerances for the shaft, keyway and nuts.
4. Removed the unused holes in the QD JA adapter.
Use of other PLA filament: 3DJake ecoPLA is much stronger (70 MPa) than Extrudr NX-2 (47 MPa). I didn’t have broken parts though, but 3DJake ecoPLA is a better choice for this.
 
I'm in the process of converting the 599xx to 70mm bolt pattern by creating a wheel hub with the a pro micro board. I was able to upload the code on to the board fine. For some reason, I can't get any of the button input to work. This applies to your code and Noel’s. Noel's code has the opposite problem where all the buttons are triggered. I double checked the pin-out, I'm using the Sparkfun AVR Boards Library with 5v 16hz
. The pro-micro is a clone and works fine with a simple controller script so it shouldn't be defective. Does the controller have to be the Spark Fun Pro Micro? Any suggestions?
 
Last edited:
I figured it out!!!!
It was the wiring... I matched the colour of the wire to correspond to the stock Thrustmaster cable. For anyone wondering about the pinout to match with the 599xx connector colour scheme.
  • PCB Pin 1 - White- Arduino VCC
  • PCB Pin 2 - Yellow- Arduino Pin 15
  • PCB Pin 3 - Blue- Arduino Pin 7
  • PCB Pin 4 - Green- Arduino Pin 14
  • PCB Pin 5 - Black- Arduino GND
  • PCB Pin 6 - Red- Not connected
 
Last edited:
I figured it out!!!!
It was the wiring... I matched the colour of the wire to correspond to the stock Thrustmaster cable. For anyone wondering about the pinout to match with the 599xx connector colour scheme.
  • PCB Pin 1 - White- Arduino VCC
  • PCB Pin 2 - Yellow- Arduino Pin 15
  • PCB Pin 3 - Blue- Arduino Pin 7
  • PCB Pin 4 - Green- Arduino Pin 14
  • PCB Pin 5 - Black- Arduino GND
  • PCB Pin 6 - Red- Not connected
How is it holding up with the direct drive ? I'm worry that the plastic will break and the wheel shatters in pieces
 
No problems so far, it's very stiff and strong. I'm running 100% FFB in game and 35% VRS DFP FFB which is plenty enough for me. I do have to use a screw in the big nut to prevent it from turning loose (same solution as Thrustmaster uses on the T300 base).
 
Last edited:
Soo cool. My vrs dfp arrives tomorrow. I have a resin printer, I don't think resin would be up to par in strength unless I print something not as long. Anyone make or have an stl for a tm to 6 hole hub adapter (removing the tm qr sort of like simracingcoach's adapter)?
 
Last edited:
I'm testing this to convert a 599XX and a TM open wheel to usb, with the 599xx it works fine, with the open wheel the buttons are wrong, the hatswitch is swapped with some buttons. there is an easy way to read the serial bytes of this wheel and edit the sketch for it to work correctly?
 
Last edited:
Change the debugging flag in the code from false to true (line 90). Connect a terminal program (Putty or TeraTerm for example) to the COM-port of the Sparkfun Pro Micro and you should see the bits flying by. Set the window width (no. of characters) high enough so you can see all characters on one line, that makes it easier to read.
 
Last edited:
Change the debugging flag in the code from false to true (line 90). Connect a terminal program (Putty or TeraTerm for example) to the COM-port of the Sparkfun Pro Micro and you should see the bits flying by. Set the window width (no. of characters) high enough so you can see all characters on one line, that makes it easier to read.
Thanks, already read the serial data from the wheel, i´ll leave it here If you want to add to your sketch.

Code:
  TM Open Wheel
-------------------------------- 
 *
 Byte 1
7 - constant 0
6 - constant 0
5 - constant 1
4 - constant 0
3 - constant 0
2 - constant 1
1 - constant 1
0 - constant 0
 * 
 Byte 2
7 - yellow down left (6)
6 - Dpad left
5 - Dpad down 
4 - Dpad right
3 - green down left (4)
2 - toggle switch left (7)
1 - toggle switch pushed in (13)
0 - toggle switch right (8)
 * 
 Byte 3
7 - Dpad up
6 - red upper left (10)
5 - blue upper left (3)
4 - purple upper right (5)
3 - left paddle (1)
2 - orange upper right (9)
1 - right paddle (2)
0 - constant 0
 
Addendum for those of you who do not trust a fully 3D printed shaft and want a metal solution instead of the 3D printed steering shaft.

20220604_164348.jpg


20220604_160616.jpg

20220604_162412.jpg

20220604_160538.jpg

The steering shaft is made of metal parts, with 3D printed parts ‘sandwiched’ between metal parts. A 3D printed inner shaft is made for the coiled cable + plug which rests on the SRC quick release and is mounted with bolts between de Chinese quick release and the hollow spacer. The metal parts carry all the load, the 3D printed inner shaft is only to support the Thrustmaster QR plug.

See the attached manual.
 

Attachments

  • Metal shaft with Quick Release for Thrustmaster wheels (low resolution).pdf
    547.3 KB · Views: 142
I have found a tiny bug in the Arduino code: 'button pressed' was sent continuously over USB as long as a button was pressed. Sending 'button pressed' once is enough.

I have uploaded version 1.01 of the Arduino code in the first post. Only the part under " // deal with the buttons first" has changed.
 
Last edited:
Hello, could you help me whit this please...ive installed the joystick library but i still have this error message.. thanks.

TMwheels:83:3: error: 'JOYSTICK_DEFAULT_REPORT_ID' was not declared in this scope
JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_GAMEPAD, 21, 1, // 21 buttons, 1 hatswitch
^~~~~~~~~~~~~~~~~~~~~~~~~~
TMwheels:83:31: error: 'JOYSTICK_TYPE_GAMEPAD' was not declared in this scope
JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_GAMEPAD, 21, 1, // 21 buttons, 1 hatswitch
^~~~~~~~~~~~~~~~~~~~~
F:\Downloads\TMwheels\TMwheels.ino: In function 'void setup()':
TMwheels:109:12: error: 'class Joystick' has no member named 'begin'
Joystick.begin();
^~~~~
F:\Downloads\TMwheels\TMwheels.ino: In function 'void loop()':
TMwheels:165:18: error: 'class Joystick' has no member named 'setHatSwitch'
Joystick.setHatSwitch(0, JOYSTICK_HATSWITCH_RELEASE); // release hatswitch
^~~~~~~~~~~~
TMwheels:165:34: error: 'JOYSTICK_HATSWITCH_RELEASE' was not declared in this scope
Joystick.setHatSwitch(0, JOYSTICK_HATSWITCH_RELEASE); // release hatswitch
^~~~~~~~~~~~~~~~~~~~~~~~~~
F:\Downloads\TMwheels\TMwheels.ino:165:34: note: suggested alternative: '__ATOMIC_RELEASE'
Joystick.setHatSwitch(0, JOYSTICK_HATSWITCH_RELEASE); // release hatswitch
^~~~~~~~~~~~~~~~~~~~~~~~~~
__ATOMIC_RELEASE
TMwheels:167:20: error: 'class Joystick' has no member named 'setButton'
Joystick.setButton(b, 0); // release the button
^~~~~~~~~
TMwheels:236:24: error: 'class Joystick' has no member named 'setHatSwitch'
Joystick.setHatSwitch(0, JOYSTICK_HATSWITCH_RELEASE); // release hatswitch
^~~~~~~~~~~~
TMwheels:236:40: error: 'JOYSTICK_HATSWITCH_RELEASE' was not declared in this scope
Joystick.setHatSwitch(0, JOYSTICK_HATSWITCH_RELEASE); // release hatswitch
^~~~~~~~~~~~~~~~~~~~~~~~~~
F:\Downloads\TMwheels\TMwheels.ino:236:40: note: suggested alternative: '__ATOMIC_RELEASE'
Joystick.setHatSwitch(0, JOYSTICK_HATSWITCH_RELEASE); // release hatswitch
^~~~~~~~~~~~~~~~~~~~~~~~~~
__ATOMIC_RELEASE
TMwheels:237:29: error: 'class Joystick' has no member named 'setHatSwitch'
else Joystick.setHatSwitch(0, (bit2btn[(i*8)+b] - 31) * 90); // direction in 0, 90, 180, 270 degrees
^~~~~~~~~~~~
TMwheels:238:27: error: 'class Joystick' has no member named 'setButton'
} else Joystick.setButton(bit2btn[(i*8)+b], btnState); // send the update
^~~~~~~~~
TMwheels:245:16: error: 'class Joystick' has no member named 'setButton'
Joystick.setButton(13, joyBtnState); // press button 14
^~~~~~~~~
exit status 1
'JOYSTICK_DEFAULT_REPORT_ID' was not declared in this scope
 
It looks like you did not install the joystick library properly?
I have removed the joystick library I had (2.07) and installed the latest version (2.11): it compiles without errors.
Did you follow the instructions correctly?
Download https://github.com/MHeironimus/ArduinoJoystickLibrary/archive/master.zip
Start the Arduino IDE. In the Arduino IDE, select “Sketch” – “Include Library” – “Add .ZIP Library...”.
Browse to where the downloaded ZIP file is located and click “Open”.
To check if it is installed correctly: the joystick library’s examples will now appear under “File” – “Examples” – “Joystick”.
 
It looks like you did not install the joystick library properly?
I have removed the joystick library I had (2.07) and installed the latest version (2.11): it compiles without errors.
Did you follow the instructions correctly?
Download https://github.com/MHeironimus/ArduinoJoystickLibrary/archive/master.zip
Start the Arduino IDE. In the Arduino IDE, select “Sketch” – “Include Library” – “Add .ZIP Library...”.
Browse to where the downloaded ZIP file is located and click “Open”.
To check if it is installed correctly: the joystick library’s examples will now appear under “File” – “Examples” – “Joystick”.
Hi,thanks for answer...well Ive followed the instructions..but...i decided reinstall arduino id ...now the compilation looks ok but when i uploade the code to the arduino micro...evevn it say uploaded done...this messegage appear at the end...
Connecting to programmer: .
Found programmer: Id = "CATERIN"; type = S
Software Version = 1.0; No Hardware Version given.
Programmer supports auto addr increment.
Programmer supports buffered memory access with buffersize=128 bytes.

Programmer supports the following devices:
Device code: 0x44
and when i conect the usb and try to test the bottons ...no answer when push the wheel botton.
The only thing is not same that your instructios is im using a micro pro arduino board.So..in my case im choosing the board and port in my case.I guess should works also...right?
Even ive check many times the tutorial..jesus maybe iv missin thomething...
btw thanks for your help.
 
Last edited:

Latest News

Are you buying car setups?

  • Yes

  • No


Results are only viewable after voting.
Back
Top