My MS FFB2 extension project - ED Forums


Thread Tools Display Modes
Old 11-17-2015, 02:48 PM   #1
Join Date: Oct 2015
Location: Hungary
Posts: 144
Default My MS FFB2 extension project

I’ve started a joystick modding project and since I did a lot of research and got a lot of inspiration from other posts around the net, I thought I’d also post my updates on various flight sim forums (the original thread is here).
My goal: extend the MS FFB2 so I could enjoy the enhanced precision provided by a longer throw. Along the way, I also found that this is a good opportunity to replace the grip with something that has more buttons.

I needed something that could be easily removed as I have two small kids who can’t be expected to show proper respect to Daddy’s flying equipment – which (for now) lives in the living room until I can get my own room (next year’s project). I’m already using VESA mounts for the CH Throttle which I routinely install and remove on the arms of the chair (with the help of some 3M velcro).
I won’t be needing the built-in twist rudder as I’m now using my namesake’s excellent Crosswind rudder.
I found these posts to be really inspiring:

Here are the steps I performed so far:
  1. Preparing MS FFB2 base
    1. remove original grip (incl cabling and twist rudder)
    2. add carbon tube extension (20cm)
    3. create hole in base for extra cabling
    4. remove throttle control for tighter fit
    5. increase current to FFB motors to compensate for longer leverage by adding resistors to one of the base PCBs
  2. Seat modification
    1. cut away parts of my office chair’s seat to allow enough movement for stick between my legs
    2. install tray to hold joystick base below leg level
  3. Grip replacement
    1. strip down Thrustmaster F-16 FLCS joystick for grip only
    2. install Teensy board, connect to grip wiring
    3. add mini-USB cable connected to Teensy, lead through the shaft extension and out in the base
    4. program board so it shows up as a joystick device in Windows
    5. limit stick throw by adding an outer ring the bottom of the shaft
Materials needed:
Total cost of materials (MSFFB2 joystick included): $211

In the consecutive posts I'll detail each of the stages.

Last edited by Milopapa; 11-17-2015 at 03:50 PM. Reason: Adding costs
Milopapa is offline   Reply With Quote
Old 11-17-2015, 02:51 PM   #2
Join Date: Oct 2015
Location: Hungary
Posts: 144
Default 1. MS FFB2 base modifications

So here is the first step, removing the grip and trying on the carbon extension.
I had to remove the buttom plate to get access to the wiring - I wanted to keep the original grip intact and the only way to do that is to pull it through the shaft.

The central 3 screws scared me first - I though they were stripped as a regular philips head wouldn't catch them. Fortunately I found this guide which assured me these were normal heads and all I needed was to experiement with different screwdrivers till I found a fitting one. Basically the grooves are a lot deeper that in a regular phillips head - I eventually just used a trusted old flathead.
You can see the cable strip going into the shaft on the image above - that's the one carrying the signals of the grip buttons, the twist rudder and the IR sensor.

Next I tried the tube on – it fits really nice and tight:

It's a bit long as my raw material is 50cm long - I cut it to a comfortable size after a few tests (currently 20cm).
During the disassembly process I came unto an interesting find. The twist rudder's centering force is achieved through a U-shaped spring.

By bending and twisting it a little (well, I'm saying little but it took me more than half an hour) I could lessen the centering force which previously made it very difficult to apply small movements in the rudder. Once happy with the result, I took out the spring from this stick (I won't be needing it) and installed it in my backup joystick (which I'll be keeping as a regular MS FFB2 in case I mess up the extension ). It made a huge difference in my ability to use the twist rudder and I wholeheartedly recommend everyone using the twist rudder in this joystick to give it a try.

I did some preliminary tests and while the centering forces seemed okay, the shaking effect was reduced significantly. So next step was to increase motor power – as described in this thread.
I used these SMD resistors (RC1206 1R 1Ohm 1/4W 1%):

I couldn't believe my eyes when I open the box, they are tiny little f*ckers! Photos did them no justice - they are really small! I was already scared shitless about the soldering (for me soldering is a necessity not a skill), but I did some practice runs on an old HDDs circuitry and managed to figure out the right technique.
This video also helped a lot:

In the end, the actual soldering took maybe 10 minutes.

Here's what the result looks like:

Zooming in:

The force feedback effects are back in their glorious strength! I actually had to reduce the centering effect from 100% to about 70% in Rise of Flight, same as with the unmodified stick. Shaking is now clearly noticable, not to mention the bumping on the ground effect (that was always crazy strong anyway).
This mod makes a world of a difference to the extension, makes it feel exactly like the original (without a grip at least). I'm not sure what the longevity effect is but if it last for at least 2 years, I'll be a happy man. There is some noticable heating around the power conversion area (lots of capacitor there) – I might add a fan in the long run.
Milopapa is offline   Reply With Quote
Old 11-17-2015, 02:56 PM   #3
Join Date: Oct 2015
Location: Hungary
Posts: 144
Default 2. Chair modification

Here's where I started with the chair.

Cutting the sitting materials out, preserving the leather:

The result:

Since I haven't found anything that would work as the joystick holder, I decided to make one myself.
Here is what it looks like:

I later painted it black to make it blend in some more (don’t forget, this is in a living room).
Milopapa is offline   Reply With Quote
Old 11-17-2015, 03:04 PM   #4
Join Date: Oct 2015
Location: Hungary
Posts: 144
Default 3. Grip modification

Here is the original F-16 joystick from Thrustmaster:

This goes for $30-40 on ebay – no use in newer PCs as it still uses a gameport connection. For me, that doesn’t matter, I just needed the grip with the buttons.

Grip replacement
I started out by disassembling the joystick and then the grip itself. Surprise: as opposed to the CH Fighterstick, the handle is chock full of wires and a control PCB so I had trouble finding a home for the Teensy.
As the inside of the grip is extremely busy, it took a long time to figure out where to put the Teensy... or more precisely, the Teensy + the mini USB cable going through the handle.
In the end, I put it on top of the exisiting PCB but I had to reroute some of the existing wires to different parts of the grip. Soldering was also a bitch... This was probably the most difficult part of the whole project.

The two-stage trigger was worn down, I ended up replacing the hard foam for the second stage as a large part of it was missing.

This is how the grip looks like. I put a screw perpendicular to the shaft to try and keep it from rotating... it’s not perfect but it’ll do for now.

This is how the extra USB cable is routed in the base. For the outlet, I simply enlarged the existing one to accommodate an extra cable. It's tight but it works.

Programming the Teensy:
Getting the Teensy to work in Windows was relatively easy (apart from a bug). I need the Arduino IDE (only version 1.6.5 works with Teensy) and the Teensyduino extension.
Then I pasted in this code (credit: NonWonderDog):

  /* USB FLCS Grip
     You must select Joystick from the "Tools > USB Type" menu
  // Buttons are muxed into shift registers, use the SPI protocol to read them
  #include <SPI.h>
  const int slaveSelectPin = 0;
  unsigned int buttonInputs1;   // data read from SPI
  unsigned int buttonInputs2;
  unsigned int buttonInputs3;
  // Use some macros to clean things up
  #define S3   !(buttonInputs1 & 0x80)    /* Pinky Switch */
  #define TG1  !(buttonInputs1 & 0x40)    /* Trigger 1 */
  #define TG2  !(buttonInputs1 & 0x20)    /* Trigger 2 */
  #define S1   !(buttonInputs1 & 0x10)    /* Nose Wheel Steering */
  #define S4   !(buttonInputs1 & 0x08)    /* Paddle Switch */
  #define S2   !(buttonInputs1 & 0x04)    /* Pickle */
  #define H1D  !(buttonInputs2 & 0x80)    /* Trim */
  #define H1R  !(buttonInputs2 & 0x40)
  #define H1U  !(buttonInputs2 & 0x20)
  #define H1L  !(buttonInputs2 & 0x10)
  #define H4U  !(buttonInputs2 & 0x08)    /* CMS */
  #define H4L  !(buttonInputs2 & 0x04)
  #define H4D  !(buttonInputs2 & 0x02)
  #define H4R  !(buttonInputs2 & 0x01)
  #define H3D  !(buttonInputs3 & 0x80)    /* DMS */
  #define H3R  !(buttonInputs3 & 0x40)
  #define H3U  !(buttonInputs3 & 0x20)
  #define H3L  !(buttonInputs3 & 0x10)
  #define H2D  !(buttonInputs3 & 0x08)    /* TMS */
  #define H2R  !(buttonInputs3 & 0x04)
  #define H2U  !(buttonInputs3 & 0x02)
  #define H2L  !(buttonInputs3 & 0x01)
  // setup() runs once on boot
  void setup() {
    // set the slaveSelectPin as an output:
    pinMode (slaveSelectPin, OUTPUT);
    // start the SPI library:
    // configure the joystick to manual send mode.  This gives precise
    // control over when the computer receives updates, but it does
    // require you to manually call Joystick.send_now().
  // loop() runs for as long as power is applied
  void loop() {
    // take the SS pin low to select the chip
    // send a value of 0 to read the SPI bytes
    buttonInputs1 = SPI.transfer(0x00);
    buttonInputs2 = SPI.transfer(0x00);
    buttonInputs3 = SPI.transfer(0x00);
    // take the SS pin high to de-select the chip:
    // Write to joystick buttons
    Joystick.button(1,  TG1);
    Joystick.button(2,  S2);
    Joystick.button(3,  S3);
    Joystick.button(4,  S4);
    Joystick.button(5,  S1);
    Joystick.button(6,  TG2);
    Joystick.button(7,  H2U);
    Joystick.button(8,  H2R);
    Joystick.button(9,  H2D);
    Joystick.button(10, H2L);
    Joystick.button(11, H3U);
    Joystick.button(12, H3R);
    Joystick.button(13, H3D);
    Joystick.button(14, H3L);
    Joystick.button(15, H4U);
    Joystick.button(16, H4R);
    Joystick.button(17, H4D);
    Joystick.button(18, H4L);
    //Joystick.button(19, H1U);
    //Joystick.button(20, H1R);
    //Joystick.button(21, H1D);
    //Joystick.button(22, H1L);
    // Determine Joystick Hat Position
    int angle = -1;
    if (H1U) {
      if (H1R) {
        angle = 45;
      } else if (H1L) {
        angle = 315;
      } else {
        angle = 0;
    } else if (H1D) {
      if (H1R) {
        angle = 135;
      } else if (H1L) {
        angle = 225;
      } else {
        angle = 180;
    } else if (H1R) {
      angle = 90;
    } else if (H1L) {
      angle = 270;
    // Because setup configured the Joystick manual send,
    // the computer does not see any of the changes yet.
    // This send_now() transmits everything all at once.

I had to choose "Serial+Keyboard+Mouse+Joystick" under Tools > USB Type as the one without the Serial wouldn't show any buttons or axis in joy.cpl - this looks like a Windows bug. I also chose 1MHz speed as some reported issues with faster speeds - didn't bother to test.
Uploading the code was a simple matter and the joystick shows up in Game controllers right away. All buttons work (even if some require extensive force due to the age)!

So here is what it looks like at the moment:

I limited the stick throw slightly as it was getting a bit excessive. I used a plastic ring cut from a windshield cleaner bottle – pretty much anything that’s a hard (non-sticking) plastic ring would do. I don't have pictures about that yet, can upload later if anyone's interested.

Overall - I spent some time testing this setup in Il2 Bos, Rise of Flight and DCS:Huey and flying with the extended stick is AWESOME.

Summary of impressions:
  • great immersion, controls feel much more natural center-mounted
  • precise control of pitch and roll - crucial for heli but really useful for prop planes too
  • abundancy of buttons (even if they are a bit worn)
  • very slight throbbing/vibrations can be felt occasionally, might be due to the increased current to the motors - insignificant overall
  • the grip reduced the force feedback further but it's still pretty good - motor boost is a must have with an extension like this
  • two-stage trigger is NICE - I programmed guns to TG1 (leading) and cannons to TG2 (killing)
Please let me know if there is any additional detail you'd be interested to hear more about.
Milopapa is offline   Reply With Quote
Old 11-18-2015, 07:23 PM   #5
Join Date: Sep 2013
Location: SVK
Posts: 278

313_Nevo is offline   Reply With Quote
Old 11-19-2015, 08:37 AM   #6
Join Date: Oct 2010
Location: Switzerland
Posts: 125

Nice. Thanks for the whole written summary.

I purchased two MSFFB2 Sticks for arround 20$ a month ago and eager to start my own build.
This gives me another sweet starting point.

The Thrustmaster F-16 stick is all plastic, right? I would really like to use my warthog stick for my build because of the feel, but I'm pretty sure it will be to heavy.
And I have no clue how the wiring is done inside the handle.

But again, thanks
System Specs:
Oculus Rift CV1, HOTAS Warthog, Komodo Sim UH-1 Collective MFG Crosswind, TIR5
ASUS Hero VIII, Intel I5 6600K @ 4.5 GHZ (H2O), 1x MSI GTX 1080 TI, 32 GB Corsair Dominator, 34" lg 34UM95
Gruman is offline   Reply With Quote
Old 11-19-2015, 09:03 AM   #7
Join Date: Oct 2015
Location: Hungary
Posts: 144

Originally Posted by swissMAG View Post
The Thrustmaster F-16 stick is all plastic, right? I would really like to use my warthog stick for my build because of the feel, but I'm pretty sure it will be to heavy.
And I have no clue how the wiring is done inside the handle.
Correct, it's all plastic - that was one of the reasons I chose it. Even like this, the stick got pretty heavy with the grip on top of the extension.
I'm sure using a full-metal grip would further diminish the FFB effects. You'd probably need the dual motor setup, the resistor mod and a counterweight to have similar effects.

As for the wiring, I forgot to include this image:

Brown - VCC / +5V
Green - GND
Yellow - MISO / PB3
Red - SS / PB0
Orange - SCLK / PB1

It's pretty simple as all the button handling is done by the F-16 chips, and it outputs all data on a 5-wire cable strip. This is what you need to solder to the Teensy board.
Milopapa is offline   Reply With Quote
Old 11-19-2015, 03:12 PM   #8
Sokol1_br's Avatar
Join Date: Apr 2007
Posts: 3,330
Send a message via MSN to Sokol1_br

Good job on FFb2.

For use Cougar/Warthog grip (~900grs), what people do is place a counter weight bellow FFB2 base (see Peter... dual FFb).

All buttons work(even if some require extensive force due to the age)!
Is not due the age, is due the "more heavy is more real" idea that are used in Tm sticks since FCS (see the ridiculous heavy springs in F22 PRO).
I had one those sticks new and buttons/HAT's are uncomfortable for use.

From game perspective the buttons/HAT in CH are more friendly.
They grip only lack a pinkie button, a 'mod' is need.

A extra 'mod' some people do in FFB2 is place ball bearings in the gimbal, and replace worm pot' with contactless sensor.

Last edited by Sokol1_br; 05-09-2016 at 05:42 PM.
Sokol1_br is offline   Reply With Quote
Old 11-19-2015, 06:39 PM   #9
Join Date: Mar 2009
Posts: 118

Originally Posted by Milopapa View Post
I'm sure using a full-metal grip would further diminish the FFB effects. You'd probably need the dual motor setup, the resistor mod and a counterweight to have similar effects.
I have done all that (dual motors, resistor mod + counterweight) with a Cougar grip which is also full-metal and I would still like to have more force. So I think it is a good idea to use plastic grip or limit the length of the extension.

Very nice work there Milopapa .

Last edited by sydost; 11-19-2015 at 06:54 PM.
sydost is offline   Reply With Quote
Old 11-19-2015, 07:25 PM   #10
Join Date: Oct 2015
Location: Hungary
Posts: 144

Thank you!
All told, it must have been around 20-30 hours of actual work, not counting the research.
Every hour worth it! Flying with this setup (plus the Crosswind rudders) feels amazingly real.
The only thing that could make it more complete is a VR headset Hopefully next year.
Milopapa is offline   Reply With Quote

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

All times are GMT. The time now is 01:32 PM. vBulletin Skin by ForumMonkeys. Powered by vBulletin®.
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.