Jump to content

Full switch upgrade for Thrustmaster Warthog throttle [OTTO, Cutler-Hammer, Honeywell, Mason]


Recommended Posts

Posted (edited)

---------------------------------------------

Warthog throttle

NEW-> Upgrading the throttle panels

 

Warthog, Hornet and Cougar stick grips

Mil-spec upgrades for Thrustmaster stick grips

---------------------------------------------

 

I've upgraded all switches to mil-spec on the Warthog throttle to improve the switch feel and make it more functionally realistic. This is probably only of interest if you really like the A-10C. 

 

This includes mil-spec locking and standard Eaton/Cutler-Hammer switches on the panel, the locking flap switch, OTTO push buttons and a functioning Honeywell mag switch. I had to provide 12VDC and install an Arduino running DCS-BIOS and a MOSFET circuit to control and sync the mag switch with DCS. Due to the size of the mag switch I had to extend the height of the throttle body with a simple 3D printed frame.
 

yYkasOc.jpg?1

 

On the throttle grips I put in all Eaton/Cutler-Hammer and one Honeywell toggle switch, OTTO hat switches and push button, and a Mason force transducer slew control out of a real F15 throttle unit. The force transducer is interfaced directly with the throttle using a small prototype PCB from Deltasim. I couldn't fit the whole mechanism from the F15 so I dropped the push functionality. It does exist in the real A-10C AFAIK but it is unused so not a great loss.

 

dVoShv1.jpg?1

 

While I was at it, I rewired the panel backlight to the Arduino I needed for the mag switch. This allows the LEDS to be directly synchronized with the in-game panel light intensity using DCS-BIOS. We included the actual brightness parameter in the latest DCS BIOS module for the A-10C. We have it for the Hornet as well in the DCSflightpanels branch.

 

Here's a short video showcasing the look and feel of the switches. I've listed the switches I used, what they are in the real jet (based on Deadman's list) and some Honeywell alternatives at the end that are readily available from e.g. mouser.com

 

 

This mod is neither cheap nor easy to do. It could be argued that it is in fact totally unnecessary and I would for sure have loved to convert a real throttle unit instead and it probably would have been cheaper. Good luck finding one though 😉

 

I intend to post a more in-depth guide to the various mods later - here's the short version for now:

  1. Rip out all switches and sub PCBs
  2. Poke it a bit with a Dremel tool
  3. Install new switches and wire them up
  4. You're golden

Edited by DeadMeat
  • Like 4
  • Thanks 1
Link to post
Share on other sites
Posted (edited)

Upgrading the throttle and LASTE panel switches

For this post I'll explain how to upgrade the switches in the panels. The grips will follow in another post.

 

To remove the stock switches you'll first need to remove the legend plate. It is held by a few screws and double sided tape:

oDHJDJp.jpg?1

 

Remove the foam around the toggle switches and unscrew the mounting nuts using a pair of needle nosed pliers. The push button will have to wait.

 

The stock switches are may be generic low cost switches but they have the correct action and a pretty heavy throw so they're not too bad I think. The size is helpful since the bushing is close enough to the 15/32-32 of the mil-spec switches making mounting them easy. 

 

Turning the throttle over, the metal bottom plates can be unscrewed and removed exposing the innards. I removed the weight bars from the bottom plates to free up more space inside the throttle. If you table mount the throttle afterwards you won't need the extra weight anyways.

fqBWYDK.jpg?1

 

The problematic part of the mod now becomes apparent - the stock toggle switches are soldered directly onto daughter PCBs together with wiring for with push buttons and backlight. We need to get rid of those board altogether.

w6TT5Ug.jpg?1

 

First step is to unplug all connectors from the main board, unscrew it and place it aside. Be careful not crack the connectors to the side PCB. There's another problem now. The side PCB has a corner for the status LEDs that sticks out under the plastic holder for the main PCB:

7y94TNo.jpg?1

 

Unscrew the plastic holder but be careful now the tensioning mechanism for the throttle arms is free to pop out:

VwkZh6n.jpg?1

 

To remove the bottom (LASTE) board, push button and backlight wires have to de-soldered first. Leave as much wire intact as you do so:

0GMHcwi.jpg?1

 

The side board goes in the same way - de-solder and remove:

nAsij85.jpg?1

 

Push buttons can then be removed from inside throttle housing by pushing in the side tabs and pushing them out through the front similar to those on the stick grips.

 

Now would be a good time to deal with the flaps switch. Only a small body locking switch will fit. Preferably a single pole Eaton/Cutler-Hammer 8855K10, but a 2-pole or a Honeywell TW should fit. The top needs to be removed. I had to cut the top off mine:

evDqK3n.jpg?1

 

To remove the the stock flaps switch the plastic top is first removed by pushing out the retaining pin from the side. The switch body is buried deep but can be extracted by carving hole through side of the throttle arm well to free the mounting nut from the back. The stock switch slides right out and you can transplant the wires onto the new switch and install it in the cavity:

VPhJSbm.jpg?1

 

And mounted in place:

HgT7ByF.jpg?1

 

Now to install the regular toggle switches, it should be noted that if you stick to 1-pole mil-spec switches (even if the real deal uses 2-poles) they should fit right away. 2-pole switches will require at least that the tabs on the back of the mounting holes be removed. I had to trim the corner off the structure around the throttle arms as well to fit the engine switches.

 

Mounting the new toggle switches is straightforward. Experiment with the height of the bottom mounting nut to find a good height overall where the bushing or locking features won't interfere with the legend plate and the locking switches are clear of the throttle arms: 

ebk5D6a.jpg?1

 

The mag switch body is a 1" diameter cylinder so the tabs on the back of the EAC mounting hole have to be removed with pliers/drill/Dremel.

mzQwxKx.jpg?1

 

The P1-7 OTTO push buttons are a bit wider than stock so their mounting holes need to be enlarged slightly to fit. There may not be room to use the big mounting nut on the back so press fit or hot glue the buttons in place from the back if needed.

C7S0Oyg.jpg?1

 

On to wiring. Let's start with the LASTE (bottom) panel. Here's how I mapped out the connections. Colors refer the ribbon to the main board:

QZ4AoXy.jpg?1

8bNKRAm.jpg?1

 

Cut the ribbon and splice on wires to extend and connect to the toggle switches and push buttons. The ground can be daisy chained between all switches and back to the ribbon. Note that the mag switch needs a Schottky diode across the solenoid terminals going from positive to negative terminal. This mitigates back current when the solenoid is engaged.

 

We'll need to feed it at least 12VDC to hold in the solenoid and we need a way to turn the power on and off. I use a small Arduino Pro Micro and a custom MOSFET circuit for control. My MOSFET design is based on GSS Rain's fine work here, but you can also just buy a breakout MOSFET board online. It just have to be logic level so you can control it with the Arduino. Here's how it can be connected in general: 
GuluduW.jpg?1

 

Now we can read the physical toggle switch state and synchronize the solenoid with the sim.

I wired up a female power socket that so I can feed it with a regular wall adapter. 1A@12V switching is fine.

 

Here's the confusing mess when all wired up. Only the mag switch ON position, ground and the MOSFET circuit is connected to the Arduino so far:

jZJt5w7.jpg?1

 

I control the backlight in a similar fashion. I joined all the red and black backlight wires into separate buses and wired them to a PWM port on the Arduino through another MOSFET board. The LEDS take 5V and will need a resistor on the ground wire for protection (since we removed the daughter boards that had some). I think I used 470R. The PWM port allows us to dim the lights by changing the pulses in code in response to the backlight intensity in the sim.

 

The remaining toggle switches and push button on the side panel are a bit trickier. Here's an overview of the wiring:

C24vxjc.png

 

Everything connects to the 16-pin connector that plugs into the main board, so I built a little hub out of prototype board and a double row of male pins with standard 0.1" spacing. It should plug nicely back into the main board. 

 

Ground wires have to be connected to a single cable bus and to the proper hub pins and the signal wires from each switch have to be individually connected their hub pins:

WU2iWHB.jpg?3

 

The hub sits higher than the side board used to so we have to raise the main board to be able to connect them.  I used 10mm bushings and some longer screws to hold the main PCB in place:

kEYrxsV.jpg?2

 

Connect all wires back to the main board and power on the throttle to see if everything is connected correctly (or fried) before closing up the throttle.

 

To fit everything I had to 3d print 20mm tall frame with cutouts for the 12V plug and the Arduino and main cables:

NlU2DtZ.jpg?1

 

To attach the metal bottom plates again I used longer 4x40mm screws. Always be super careful when closing the throttle back up to avoid pinching wires or stripping the flimsy plastic threads in the housing. To put the legend plates back on I had to replace the double sided tape to make them stick.

 

With everything back together we can 3d print and paint a replacement hat for the flaps switch. I just glued it on the rim of switch threading with a strong epoxy. The color is Tamiya AS-7 spray paint:

Ou3qYTc.jpg?2

 

Just the DCS-BIOS code for the mag switch and backlight left. Here's an example for the A-10C II using the latest version of DCS flight panels branch:

Spoiler

/*
  Tell DCS-BIOS to use a serial connection and use interrupt-driven
  communication. The main program will be interrupted to prioritize
  processing incoming data.
  
  This should work on any Arduino that has an ATMega328 controller
  (Uno, Pro Mini, many others).
 */

/* This version:
 *  New simplified function for backlight replaces old inference method
 */


#include "Keyboard.h" //keyboard library

unsigned int ConsolesIntensity = 0; //consoles lights intensity
 
#define DCSBIOS_DEFAULT_SERIAL

#include "DcsBios.h"

/* paste code snippets from the reference documentation here */
//***A-10C mode***
DcsBios::Switch2Pos lasteEac("LASTE_EAC", 2); //mag switch ON position
DcsBios::LED laste_Eac(0x1108, 0x0100, 4); //output for MOSFET circuit when solenoid should be on

void onIntConsoleLBrightChange(unsigned int newValue) {
    ConsolesIntensity = map(newValue, 0, 65535, 0, 255);
    analogWrite(10, ConsolesIntensity);//PWM output for backlight MOSFET
}
DcsBios::IntegerBuffer intConsoleLBrightBuffer(0x12ee, 0xffff, 0, onIntConsoleLBrightChange);

void setup() {  
  DcsBios::setup();
  
}

void loop() {
  DcsBios::loop();
  
}

 

To use the throttle for a module without native mag switch support in DCS-BIOS, we can use the Arduino Pro Micro as a USB keyboard and send a keystroke as a workaround. Note the console lights are implemented in weird way in the standard library (intensity output is an integer, so we need to use it in combination with the dimmer knob position):

Spoiler

/*
  Tell DCS-BIOS to use a serial connection and use interrupt-driven
  communication. The main program will be interrupted to prioritize
  processing incoming data.
  
  This should work on any Arduino that has an ATMega328 controller
  (Uno, Pro Mini, many others).
 */

/* This version:
 *  New simplified function for backlight replaces old inference method
 */


#include "Keyboard.h" //keyboard library

char ctrlKey = KEY_LEFT_CTRL; //just in case
unsigned int ConsolesIntensity = 0; //consoles lights intensity
byte ConsolesOn = 0 //are the console lights on
int PressHookBypass = 0; //count if HookBypass has been pushed
int StateHookBypass = 0; //HookBypass switch position
byte SimHookBypass = 0; //HookBypass sim switch position (may not be in this position at start!)
 
#define DCSBIOS_DEFAULT_SERIAL

#include "DcsBios.h"

/* paste code snippets from the reference documentation here */

//---HookBypass switch position output
DcsBios::LED hook_BypassSw(0x7480, 0x4000, 4);//added underscore to name. HookBypass switch in pos 1, send 5v to MOSFET and 12v to HookBypass solenoid.

void onHookBypassSwChange(unsigned int newValue) {
    SimHookBypass = newValue;
}
DcsBios::IntegerBuffer hookBypassSwBuffer(0x7480, 0x4000, 14, onHookBypassSwChange);

//---Console lights
void onConsoleIntLtChange(unsigned int newValue) {
    ConsolesOn = newValue; //check if lights should be allowed on
}
DcsBios::IntegerBuffer consoleIntLtBuffer(0x74d4, 0x2000, 13, onConsoleIntLtChange);

void onConsolesDimmerChange(unsigned int newValue) {
    if (newValue < 32000 && ConsolesOn == 1) {
      ConsolesIntensity = map(newValue, 0, 31999, 0 , 50);  //slower kick-in to match sim
    }
    
    if (newValue >= 32000 && ConsolesOn == 1)  {
      ConsolesIntensity = map(newValue, 32000, 65535, 50 , 255);
    }

    else {
      ConsolesIntensity = 0; //shut it off
    }
    analogWrite(10, ConsolesIntensity); //divide by more to lower max output
}
DcsBios::IntegerBuffer consolesDimmerBuffer(0x7544, 0xffff, 0, onConsolesDimmerChange);

void setup() {
  pinMode(2, INPUT_PULLUP); //Connected to HookBypass ON
  Keyboard.begin(); //Emulate keyboard
  
  DcsBios::setup();
  
}

void loop() {
  DcsBios::loop();

if (digitalRead(2) == LOW){//HookBypass switch is in on position
  StateHookBypass = 1;
}

if (digitalRead(2) == HIGH) {//HookBypass switch is in off position
  StateHookBypass = 0;
}

if (StateHookBypass == 1 && PressHookBypass == 0){//HookBypass switch moved to on
  if (SimHookBypass == 0) { //check if real and sim switches are synced
    Keyboard.press('5'); //HookBypass CYCLE ON/OFF bound to '5' in sim
    delay(100);
    Keyboard.releaseAll(); //release keys
  }
  PressHookBypass = 1; //HookBypass switch has been manually moved to on
}

//test if we can detect switch being moved to off
if (StateHookBypass == 0 && PressHookBypass == 1){//HookBypass switch manually moved to off
  if (SimHookBypass == 1) { //check if real and sim switches are synced
    Keyboard.press('5');
    delay(100);
    Keyboard.releaseAll(); //release keys
  }
  PressHookBypass = 0; //HookBypass switch is no longer in on
}

if (StateHookBypass == 0){//HookBypass switch released to off in DCS
  Keyboard.releaseAll(); //release keys
  PressHookBypass = 0;
}

  
}

 

That's it. Enjoy the toggling 🙂


Edited by DeadMeat
  • Like 2
  • Thanks 1
Link to post
Share on other sites
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...