Introduction: 3D Printed USB Flight Controller / Joystick With Four Axes

With the new flight simulator coming out fall 2020, it is about time to make your own JOYSTICK!

This is a 3D printed fully functional flight control joystick. The usb interface is managed by an Arduino Micro (or compatible board). The axes movements are detected via 10k potentiometers. To print and assemble this you don’t need to know a lot of programming or electronics skills. The software uses the Joystick 1.0 library from Matthew Heironimus ( With all parts, the joystick will cost something between 20 and 50 €, depending on how cheap you can get your hands on parts.

All printable files, design files and software are available from thingiverse

Step 1: 3D Printing

All Parts were printed in PETG from different vendors (Prusament and extrudr)


STL files were sliced with PrusaSlicer


All STL-files are oriented in optimal print orientation.


Most pieces were printed with 0.15 mm resolution (0.15 mm Quality MK3 in PrusaSlicer) . Larger Pieces were printed with 0.3 mm resolution (0.30 mm Draft MK3 in PrusaSlicer) for time reasons

  • Stick_L
  • Stick_R
  • Throttle_L
  • Throttle_R
  • Bottom_Plate


Some pieces have to be printed with support:

  • Rubber_Platform
  • Stick_R
  • Stick_L

Step 2: Required Parts & Tools

Part list

  • 1x Arduino Micro or compatible board [10-20 €]
  • 1x Stripboard [5€]
  • 2x female 18-20 pin headers (for the Arduino) (black ones in the pictures, 17 pins are actually used for arduino micro, the rest can be cut off)
  • 4x 10K trimming potentiometer (PT10MV10103A or PT10MV11103A or PT10MV13103A) [4x 1€]
  • 6x buttons (7.8x6mm) [0.20€]
  • less than 1m Coloured ribbon cable [2€]
  • less than 1m black cable (0.14mm²) for GND
  • 5x Household rubber bands
  • 4x Rubber feet e.g ø13mmx6mm [4x 0.50€]
  • 23x M3 nuts [few cents]
  • 17x M3x10 hex head screws [few cents]
  • 15x M3x20 hex head screws [few cents]
  • 2x M3x30 hex head screws [few cents] (I’d recommend buying an M3 hex head screw set. They are anyways useful)
  • Micro-USB cable - We all have tons of them at home, don’t we?
  • 32x 3D printed parts (See Thingiverse for files)


I setup the arduino on a stripboard with female pin headers and soldered strips. You can also directly solder the cables to the stripboard

  • 1x 20 pin connector strip (probably get more, I used 19 pins in total, but you might lose one or break/bend one or two; Maybe you also want to add another button later?)
  • 2x female 10 pin headers (for button pins) in yellow
  • 2x female 10 pin headers (for axis pins and for the +5V line) in red
  • 1x female 10 pin headers (for GND line) in black


  • M3 Allen key (2.5) - Pliers to remove support and fix parts
  • soldering equipment
  • a set of files or sanding paper to clean prints if necessary (especially the gears)
  • power drill with a 3 to 4 mm drill to put holes in the stripboard.
  • glue that glues plastic

Step 3: X-Axis Assembly

You’ll need:

  • X_Frame
  • 1x Gear_Small
  • 2x Rod
  • Y_Gear_Big
  • 3x M3 nut
  • 1x 10K Potentiometer

Potentiometer assembly

This can be done for all four potentiometers already.

  1. Put one rod into the small gear. The rod should be flush on the flat side of the small gear (I’ll call this the upper side).
  2. Turn the potentiometer into it’s middle position (a 2 mm allen key should fit nicely, otherwise use one of the rods).
  3. Inspect the gear carefully. There should be a small nose on the down side of the gear (see also the rendered picture of the small gear in thingiverse). This nose should point towards the single leg of the potentiometer when the potentiometer is in its middle position.
  4. Push the gear into the potentiometer. Leave a small gap between the gear and the potentiometer.
  5. Label the opposite gear tooth with a marker on the upper side. This way you can easily set the potentiometer into middle position later.

X-Axis frame

  1. Put an M3 nut in both holes on the inside of the frame. Pull them in using a suitable screw (e.g. M3x10). Do not use excessive force to fit any of the nuts or screws!
  2. Put an M3 nut into the hole on the side. Pull it into the hole using an M3 screw with sufficient length (M3x30). To avoid pressure on the frame, put the Stick_Holder in the middle of the frame while pulling the screw into the cavity.
  3. Use one of the rods (green in the image) and glue the Y_Gear_Big onto the X_Frame.
  4. Push the potentiometer into the frame. Guide the pins gently through the slits. Free up the slits with a knife if necessary.

Step 4: Y-Axis Assembly

You’ll need:

  • 4x Household rubbers
  • Y_Frame
  • Rubber_Platform
  • 2x Spacer_Small
  • 2x Spacer_Large
  • 1x Gear_Small
  • 1x Rod
  • 1x 10K Potentiometer
  • 4x M3 nut
  • 2x M3x20
  • 2x M3x30

  1. Push another assembled potentiometer into the Y_Frame as you did before for the X_Frame.
  2. Take the Rubber_Platform and put two rubbers together around one side and two rubber bands perpendicular two this. There are small cutouts that hold the rubber bands on each side.
  3. Pull four M3 nuts into the holes on the bottom side of the Rubber_Platform
  4. Using the Spacers (large and small) and two M3x20 and M3x30 screws each to fix the Y-frame onto the rubber platform.

Step 5: Throttle Assembly

You’ll need:

  • Throttle_R
  • Throttle_L
  • Throttle_Frame
  • Throttle_Stick
  • 1x Gear_Small
  • 1xRod
  • 1x 10K Potentiometer
  • 4x M3x20
  • 4x M3 nuts

  1. Pull another M3 nut int the Throttle_Frame. Put the Throttle_Stick in the middle of the frame to avoid pressure on the frame. Take out the screw and Throttle_Stick again.
  2. Push in an assembled potentiometer in middle position.
  3. Put the Throttle_Stick into the frame in a perpendicular position. Align it with the central hole on the frame and the small gear. Put in a M3x20 screw and loosely tighten the screw so that the throttle stick can rotate freely around the screw.
  4. Test the movement of the stick it should be stopped on both extremes by the potentiometer. If the gear jumps out on one side, it means you didn’t assemble while the potentiometer was in the middle position or the small gear is not correctly inserted into the potentiometer (There is only one correct orientation of the small gear, but 6 possibilities!)
  5. Put two M3 nuts into Throttle_L and pull them into the hole using a M3x20 Screw from the flat side of the print.
  6. Pull one M3 nut into the hole in Throttle_R where the throttle grip will be connected to the Throttle_Stick
  7. Assemble the two halfs of the throttle grip using two M3x20 screws.
  8. Push the grip onto the stick and fix it with an M3x20 screw.

Step 6: Z-Axis Assembly

You’ll need:

  • Stick_L
  • Stick_R
  • Stick_Holder
  • Rubber_Holder
  • Z_Gear_Big
  • Z_Screw_Holder
  • 1xGear_small
  • 1x Rod
  • 5x M3 nut
  • 2x M3x20
  • 1x 10K Potentiometer
  • 3 pin cable (~15 cm) (e.g. from colored ribbon cable)
  • 3x Heat shrink tubing (~1cm)

  1. Screw the Rubber_holder on the simple square end of the Stick_Holder unsing an M3x20 screw.
  2. Pull an M3 nut into the Z_Screw_Axis_Holder using an M3x20 screw. This time, the screw can stay in place. This screw will later rotate freely in the top hole of the Stick_Holder and stabilize Z-Axis rotation.
  3. Push the Z_Gear_Big onto the stick holder. When the Stick_Holder lies on the gear side, the gear teeth of the Z-axis gear should face upwards (see picture)
  4. Push the Z_Screw_Holder with the M3x20 screw through the gear into the hole on top of the Stick_Holder. This should fit loosely, in case you are wondering.
  5. Solder a three pin cable to one of the potentiometers that you prepared in the very first step. Protect the connections with heat shrink tube.
  6. Bend the cables so that the two cables for GND and +5V run along the bottom side of the potentiometer on both sides of the signal pin.
  7. Make sure the potentiometer is in the middle position!
  8. After removing the support from Stick_R and Stick_L, make sure that the Stick_Holder fits between the two halfs of the stick and can rotate without too much friction. If that is not the case, you might have to file and sand a bit to make it rotate.
  9. Push the potentiometer into Stick_R. You might need some force to put this in, depending on how flat the cables are pressed to the bottom of the potentiometer.
  10. Put four M3 nuts into Stick_R. Two go in from the bottom as for the throttle grip. Two go in on the from the side. Pull them tight with M3x20 or M3x30 screws. Remove the screws again.
  11. Push in the assembled Stick_Holder. Again, this will only loosely fit. Make sure, that the Z_Gear_Big is inserted perpendicular to the stick.
  12. You can test this by holding the two stick halfs together and rotate the Stick_Holder. If it blocks in one direction much earlier than in the other, the potentiometer was not in the middle position or the Z_Gear_Big was not put in properly. This must be corrected before assembling the Stick!

Step 7: Button Assembly

You’ll need:

  • 6x push buttons (7.8x6mm)
  • Button_Holder
  • Button_Plate
  • Hat_Switch
  • Button_1_2
  • 6 Pin Ribbon cable (30 cm) [optional: already soldered to pins (6 individual pins)]
  • 4 cable (black, GND) (5 cm)
  • 1 cable (black, GND) (25 cm) [optional: already soldered to a pin]
  • Heat shrink tubing

  1. Lay the Button_1_2 and the Hat_Switch in the Button_Holder
  2. Push the six Buttons into the Button_Plate
  3. Solder the four short cables and the one long black cable together (you could also use a strip of the strip board with five holes) protect this with shrink tube.
  4. Now we connect the six buttons. Make sure that the buttons are pushed in tightly into the holes.The pins on each side of the buttons are internally connected. To avoid mistakes while soldering, we will wire the pins that are across to each other (see diagram).
  5. Solder a 5 cm black cable (GND) to one of the pins for each button. Use one cable for two pins of very close buttons on the hat switch (see diagram buttons C/F and E/D))
  6. For each button now solder one of the colored ribbon cables to the pin that is across (see diagram)
  7. Push the plate into the holder and test the buttons by clicking all of them. You should hear the buttons clicking.

Step 8: Stick Assembly

You’ll need:

  • Button assembly
  • Stick assembly
  • 3x M3x20
  • 1x M3x10

  1. Guide the cables from the button assembly and the Z-potentiometer through the cable outlet on the lower left of Stick_L.
  2. Hold the two halfs together and make sure again that the Z-Axis is positioned properly. The gear of the stick holder (red part) should face forward on the joystick (see pictures)
  3. Put in one M3x10 screw in the hole just below the button panel on top of the joystick. Use 3 M3x20 Screws to tighten the rest of the connections.
  4. Test Z-Axis again
  5. Push the button holder in and pull out all cables as far as possible again without using excessive force.

Step 9: Electronics

You’ll need:

  • Strip board
  • 2x female 18-20 pin headers (for the Arduino) (17 pins will be used)
  • 1x 20 pin connector strip (probably get more, I used 19 pins in total, but you might lose one or break/bend one or two; Maybe you also want to add another button later?)
  • 2x female 10 pin headers (for button pins) in yellow
  • 2x female 10 pin headers (for axis pins and for the +5V line) in red
  • 1x female 10 pin headers (for GND line) in black

  1. Shorten the long female pin headers to 17 pins using pliers
  2. Cut out one pieces of the strip board with 26 strips x 3 holes (e.g. use a cutter knife cut along the next row of pins multiple times from both sides and then break of the part)
  3. Cut out one piece of the strip board with 3 strips x 26 holes and file off the cupper at 4 holes to each end to break the connections to where the screws will sit (see picture as well)
  4. Drill two holes in the ends of each strip (see diagram). The holes should be 5.84 cm apart
  5. Cut the other female pin headers to the required lengths (using pliers)
  6. Solder the pin headers as in the diagram onto the strips. The diagram always shows top and bottom view of the strips. The two yellow connections with the red cross should not be soldered to the board. I clipped of the pins of the yellow female header. I didn’t want to unintentionally reset the arduino or ground something. I would recommend you to do the same.
  7. Connect the power strip with the pins indicated in the diagram with red and black cables.

Step 10: Full XYZ-Axis Assembly

You’ll need:

  • Stick assembly
  • X-Axis assembly
  • Y-Axis assembly
  • 1x M3x20
  • 2x M3x10

  1. As for the throttle before, set the potentiometer in the X-axis assembly to middle position and position the stick assembly with the big gear on the stick holder facing the small gear.
  2. Insert and gently tighten a M3x20 screw to fix the stick to the X-Axis assembly.
  3. Set the potentiometer of the Y-axis to middle position and put the X-Axis assembly into the frame. Fix it again in an upright position with two M3x10 screws from both sides of the frame
  4. Spin the rubber band pairs around the Rubber_Holder as in the images
  5. Spin the 5th rubber band around the knob multiple times to tightly fix the other rubber bands

Step 11: Final Assembly of the Joystick

You’ll need:

  • Bottom_Plate
  • 8x M3 nuts
  • 4x M3x20 screws
  • 14x M3x10 screws
  • 4x rubber feet
  • 3x 3 pin wire (15 cm) pre-soldered with pins
  • Arduino Micro or compatible board (~15€)

  1. Pull four M3 nuts into the Bottom_Plate using an M3x10 screw
  2. Attach the throttle grip using four M3x10 screws.
  3. Attach the electronic assembly using six M3x10 screws.
  4. Attach the axis assembly onto the bottom plate with four M3x10
  5. Solder the three 3 pin cables to the three remaining potentiometers as before.
  6. Connect the black button ground cable to the GND line on the power strip.
  7. Connect the black GND cables of the potentiometers to the GND line of the power strip.
  8. Connect the red +5V cables of the potentiometers to the +5V line of the power strip.
  9. Connect the colored pins to the D.. pins. I connected them for no good reason to D0, D1, D7, D8, D10 and D11.
  10. Connect the signal lines of the potentiometers to the A.. pins.
  11. Connect X to A0
  12. Connect Y to A1
  13. Connect Z/rudder to A2
  14. Connect throttle to A3

Step 12: Arduino Setup

Download the source code files (JoystickControl.ino, Joystick.h and Joystick.cpp) to a folder on your PC and name the folder JoystickController.

  1. Download the Arduino IDE from
  2. Attach the Arduino via USB to the computer.
  3. Open the JoystickController programm with the Arduino IDE
  4. Go to Tools -> Board and select Arduino Micro
  5. Go to Tools -> Port and select the port that the arduino is connected to.
  6. Press Ctrl + U to compile and upload the programm to the Arduino

The controller should now be visible to Windows as a gamepad/controller.

Go to the device settings of windows and try to find the arduino micro controller and test its properties. It should behave as in the animation above if you test all the axes , buttons and the hat switch. If the axis or buttons are swapped you can either switch the pins or change the program until it is running as expected.

3D Printed Contest

Participated in the
3D Printed Contest