Project tutorial
Throttle Quadrant and Trim Wheel

Throttle Quadrant and Trim Wheel © CC BY-NC-SA

A modular 3D printed throttle quadrant and trim wheel for use with flight simulators.

  • 12,202 views
  • 14 comments
  • 42 respects

Components and supplies

A000057 featured
Arduino Leonardo
A Leonardo or Micro will be suitable for this project, up to 6 controls possible on each Arduino
×1
4818485
Wire, Hook Up
3 wires per module
×3
Rotary potentiometer 50k, details in story section
1 per module
×1

Necessary tools and machines

09507 01
Soldering iron (generic)
3drag
3D Printer (generic)

Apps and online services

About this project

Introduction

Having recently upgraded my PC to enable it to run MS FS2020, I was inspired to improve the controls I was using. A keyboard does not really have the right feel for flying and I wanted to upgrade the experience to something better. I am not a full-time flight simmer and cannot afford the space or money to dedicate a lot to making a full cockpit or even a purchased set of controls.

Design

I set about designing a set of controls in CAD that could be made with the tools I have and give a reasonable experience of what I imagine a real plane would feel like, I have never touched the controls on a plane so it is based on what I think they would be like.

I decided that the controls I would like are some single levers for throttle, flaps, landing gear and an elevator trim wheel. I mostly fly the small light single engine planes in the sim so that is what I was focusing on.

The trim wheel was the most challenging to design and it took several sketched ideas over many days to come up with a design that I thought would provide the look and feel that I wanted.

Build

All the parts were 3D printed in ABS on my UP! printer, they were then painted and wired up to an Arduino, a Leonardo to start with then swapped over to a Micro. To end up with a plug and play unit which can be stored away easily when not in use.

Video of build and configuration

Parts

3D Printed Part List

Each lever module will require

  • 1 x Body left
  • 1 x Body right
  • 1 x Lever with x detents, 5 variants available with 2-6 detents
  • 1 x Lever end
  • 1 x Knob, 6 variants available
  • 1 x Friction plate, 3 variants available
  • 1 x Potentiometer holder
  • Each wheel module will require

  • 1 x Trim wheel body left
  • 1 x Trim wheel body right
  • 1 x Trim wheel gear
  • 1 x Trim wheel hub
  • 1 x Trim wheel wheel, if making the assembled wheel
  • 8 x Trim wheel nodules, if making the assembled wheel
  • 1 x Trim wheel single piece, if making the single piece wheel
  • 1 x Trim wheel quadrant
  • 1 x Trim wheel quadrant drive
  • 1 x Potentiometer holder
  • Back box parts can be used to house the Arduino and wiring.

    Conclusion

    A very enjoyable build, very easy from a coding point ofview, the real challenge in this build was the design, especially the trim wheel and getting the feel right.

    Code

    Quadrant.inoArduino
    Use the setting variable and the serial monitor to find the end point values for each potentiometer, enter them into the axisLimits array
    #include <Joystick.h>
    
    Joystick_ Joystick;
    
    // put the max and min values from the analogRead in these arrays
    // these are translated to a range of 0 - 1023
    int axisLimits0[] = {686, 338};
    int axisLimits1[] = {345, 695};
    int axisLimits2[] = {327, 678};
    int axisLimits3[] = {342, 692};
    int axisLimits4[] = {0, 1023};
    int axisLimits5[] = {0, 1023};
    
    // turn axes on or off by setting these variables
    bool a0Used = true;
    bool a1Used = true;
    bool a2Used = true;
    bool a3Used = true;
    bool a4Used = false;
    bool a5Used = false;
    
    // setting mode prints the pin value and translated value to the serial monitor
    // int setting = -1; // no printing to the serial monitor
    // int setting = 2; // values 0 - 5, print the pin values to the serial monitor
    int setting = -1;
    
    void setup() {
      if(a0Used) pinMode(A0, INPUT);
      if(a1Used) pinMode(A1, INPUT);
      if(a2Used) pinMode(A2, INPUT);
      if(a3Used) pinMode(A3, INPUT);
      if(a4Used) pinMode(A4, INPUT);
      if(a5Used) pinMode(A5, INPUT);
      Joystick.begin();
      if(setting >= 0) Serial.begin(9600);
    }
    
    void loop() {
      int value = 0;
      int pos = 0;
    
      if(a0Used){
        value = analogRead(A0);
        pos = translateValue(value, axisLimits0[0], axisLimits0[1]);
        Joystick.setThrottle(pos);
        if(setting == 0) settingPrint(value, pos);
      }
      
      if(a1Used){
        value = analogRead(A1);
        pos = translateValue(value, axisLimits1[0], axisLimits1[1]);
        Joystick.setRxAxis(pos);
        if(setting == 1) settingPrint(value, pos);
      }
      
      if(a2Used){
        value = analogRead(A2);
        pos = translateValue(value, axisLimits2[0], axisLimits2[1]);
        Joystick.setRyAxis(pos);
        if(setting == 2) settingPrint(value, pos);
      }
      
      if(a3Used){
        value = analogRead(A3);
        pos = translateValue(value, axisLimits3[0], axisLimits3[1]);
        Joystick.setRzAxis(pos);
        if(setting == 3) settingPrint(value, pos);
      }
      
      if(a4Used){
        value = analogRead(A4);
        pos = translateValue(value, axisLimits4[0], axisLimits4[1]);
        Joystick.setXAxis(pos);
        if(setting == 4) settingPrint(value, pos);
      }
      
      if(a5Used){
        value = analogRead(A5);
        pos = translateValue(value, axisLimits5[0], axisLimits5[1]);
        Joystick.setYAxis(pos);
        if(setting == 5) settingPrint(value, pos);
      }
    
      delay(5);
    }
    
    int translateValue(int v, int f1, int f2){
      // translates values to a 0 - 1023 range
      int result = 0;
      int start = 0;
      float range = 0;
      
      if(f1 < f2){
        start = f1;
        range = f2 - f1;
      }
      else{
        start = f2;
        range = f1 - f2;
      }
      
      result = (v - start) * (1023 / range);
    
      if(result < 0) result = 0;
      if(result > 1023) result = 1023;
      
      return result;
    }
    
    void settingPrint(int value, int pos){
      Serial.print(value); 
      Serial.print(" "); 
      Serial.println(pos);
    }
    

    Custom parts and enclosures

    Body left
    Body Right
    End Cap Left
    End Cap Plain (Optional)
    One without the tab in case you need it
    End Cap Right
    Friction Plate Option 1 (Least friction)
    Friction Plate Option 2 (Middle friction)
    The one I use
    Friction Plate Option 3 (Most friction)
    Knob for Flaps
    Knob for Landing Gear
    Knob for Fuel Mixture
    Knob for Propeller Pitch
    Knob for Throttle (Type 1)
    Knob for Throttle (Type 2)
    Lever with 0 Detents
    Lever with 2 Detents
    Lever with 3 Detents
    Lever with 4 Detents
    Lever with 5 Detents
    Lever with 6 Detents
    Lever End
    Potentiometer Holder
    Trim Wheel Body Left
    Trim Wheel Body Right
    Trim Wheel Gear
    Trim Wheel Hub
    Trim Wheel Nodule
    Trim Wheel Quadrant Drive
    Trim Wheel Quadrant
    Trim Wheel Single Piece (Option)
    Trim Wheel Wheel

    Sketchfab still processing.

    Back Box Narrow Centre
    Back Box Narrow End Right
    Back Box Narrow End Left
    Back Box Wide End Left
    Back Box Wide Centre
    Complete STEP File
    This file contains all the parts as a STEP file
    released_u3k8QjPXzJ.stp

    Schematics

    Single potentiometer diagram
    To add more controls hook up 5V and GRD and use pins A1 to A5
    quadrant_ZkMygPyRiE.fzz

    Comments

    Similar projects you might like

    FlightGear Analog Trim Tab Wheel

    Project tutorial by dancili

    • 5,256 views
    • 6 comments
    • 7 respects

    DIY Simple Measuring Wheel with Rotary Encoder

    Project tutorial by Mirko Pavleski

    • 20,841 views
    • 6 comments
    • 24 respects

    QuizBox - The Offline Internet Quiz

    Project tutorial by 8bitsandabyte

    • 2,900 views
    • 0 comments
    • 3 respects

    WW2 Tank Laser Tag Sherman & Panther

    Project tutorial by Arduino “having11” Guy

    • 22,998 views
    • 1 comment
    • 64 respects

    Autonomous Nerf Sentry Turret

    Project tutorial by Arduino “having11” Guy

    • 21,582 views
    • 4 comments
    • 53 respects

    Outboard Motor Throttle Controller

    Project tutorial by Terry Towle

    • 14,365 views
    • 4 comments
    • 22 respects
    Add projectSign up / Login