Jump to content

Recommended Posts

Posted

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.

 

Background:

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:

http://forums.eagle....86&postcount=51

http://forum.il2stur...k-2/#entry46228

http://forums.eagle.ru/showthread.php?t=125281

 

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:

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

  • Upvote 1
Posted

I'm curious. Hope it will work as you intend.

Please post some pics if possible.

 

:clapping:

Posted

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.

nfoRuxgl.jpg

 

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:

Ik2wmBzl.jpg

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.
s8VWIZ2l.jpg
 
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.
19bWTgsl.jpg
 
 
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%):
7qjD3FXl.jpg
 
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:
ieXp2Ddl.jpg
 
Zooming in:
Haa59MGl.jpg
 
 
Result:
The force feedback effects are back in their glorious strength!  :biggrin:  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. I'm not sure what the longevity effect is but if it last for at least 2 years, I'll be a happy man. :biggrin: There is some noticable heating around the power conversion area (lots of capacitor there) – I might add a fan in the long run.
Posted

2. Chair modification
 
Here's where I started:
OdTqV1Tl.jpg
 
Cutting the sitting materials out, preserving the leather:
u9K45Qzl.jpg
M0p8oVDl.jpg
NGqVnTIl.jpg
 
The result:
dxlBqqYl.jpg
KIuzeQQl.jpg
 
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:
DFnt6WSl.jpg
w4JVXgtl.jpg
TcXqomVl.jpg
 
I later painted it black to make it blend in some more (don’t forget, this is in a living room).
iDOSbqll.jpg

Posted

3. Grip modification

 

Here is the original F-16 joystick from Thrustmaster:

xKErMd2l.jpg

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.

 

83PKLmMl.jpg

f8Dpcjql.jpg

 

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.

lkiIj8Fl.jpg

 

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.

AA69erol.jpg

 

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.

ettWZDVl.jpg

 

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:
  SPI.begin();
  // 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().
  Joystick.useManualSend(true);
}


// loop() runs for as long as power is applied
void loop() {
  // take the SS pin low to select the chip
  digitalWrite(slaveSelectPin,LOW);
  // 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:
  digitalWrite(slaveSelectPin,HIGH); 

  // 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;
  }
  Joystick.hat(angle);

  // 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.
  Joystick.send_now();
}

 

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:

kNm7Ytzl.jpg

Sn1sEZol.jpg

 

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.

  • Upvote 1
Posted

Wow, great job.

It looks good.

 

:good:

 

Thank you. Apart from bragging rights :) I wanted to share this so maybe more people will find the courage to start a similar project. After trying it, stick extension feels like a must have and since MS FFB2 is still one of the best joysticks out there, it seems logical that we convert them.

Posted

I have one on the attic. I use a Warthog now with Sahaj's 20cm extension.

Very happy with it, although it lacks FFB.

 

Flying with the stick up from the floor is much more precise and feels a lot more realistic imho.

Posted

Awesome, thanks for posting this!

Posted

@Milopapa: what's the purpose of using the trustmaster grip replacement + teensy? just to have more buttons or it is a need for have teensy+trustmaster grip for having the compensate FFB loose from the mod of the stick?.

Posted

Since the MSFFB2 controller circuit handle only ~8 buttons, for use a grip with more is need other controller (e.g. Teensy), for Windows and games the joystick is now 2 individual devices.

 

To compensate the more weight above the pivot point is added resistors in FFB2 circuit board to allow more current drain.

 

Some users add a counter weigh under the FFB2 base, specially using heavy grips like Cougar/Warthog (~600 grs), but this weight have the penalty to add inertia...

 

 

 

 

 

Posted

Sokol's got it right :)

Primary reason was to have more buttons + a nicer, more serious looking grip.

I also liked how I could use a USB cable instead of soldering the base wires to the grip directly - this way it was a lot easier to adjust the extension height.

Posted (edited)

Thank for clearing me M8's, and in final I ask you then what are the right resistances to order ( 1 Ohm, 1/4 or 1/2 watt ?) and if you are happy with "default/standard" cooling even after 2/3 hurs of game.. of may be FF2 may broke if not mounting a little pc Fan?

Edited by EAF_51Raptor
Posted

This is the full spec for the resistors: RC1206 1R 1Ohm 1/4W 1%

1206 is the form factor, meaning the size (metric equivalent is 3216) 

1R is the same as 1 Ohm

1/4W is what it says, 0.25W :)

1% is the tolerance

 

Not sure where you are located, these are the ones:

Germany

Hong Kong

 

Can't find anything in the US.

Posted

Oh, about the cooling: I usually fly at least 2 hours, the base gets warm to touch but so far I haven't seen the need for a fan.

Posted

Thank you very much for your prompt and exaustive reply miopapa, I'm italian, so I will go to see german catalogue you kindly posted above. I will report my workaround on my stick as soon as I start the work;). Cheers.

  • 3 weeks later...
Posted

Wow...just very impressed how some of you guys can do this stuff.  Great job!

Posted

Wow...just very impressed how some of you guys can do this stuff.  Great job!

Once you get going, there's not stopping :)

 

Seriously - the more DIY stuff you do, the braver and more confident you get. And it bleeds into other areas - I just knocked up a new handrail for our stairway in no time :)

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...