4 joystick (6-axis 6-dof) game controller

a 4 joystick game controller for 6axis+ games (inertial thrust space games)

Similar projects worth following
(demo video in logs)
4 joystick game controller made with arduino, programmed with code and driver taken from Cleric-K's github page. The controller is designed to be used for space games, particularly space games that are simple enough that they could be enjoyed from a casual posture (simple navigation and shooting). The game controller allows for all 6 axis of control to be on joysticks. To make the coordination of your pointer fingers easier to learn, simply use each front stick to control one axis. My configuration is:
- left thumb: strafe updownleftright
- left pointer: pull trigger for throttle, push trigger for reverse thrust
- right thumb: pitch/yaw
- right pointer: roll
some logic: I chose yaw and pitch on the thumb, and only play games that allow for rapid yaw (Orbital Racer, simulation mode, float on). Although many players will prefer to roll and pitch for control, and a lot of games optimize this motion,,, it is still extra moves when only one is required.

the joystick breakout board files are for the thb series thumbsticks available at digikey, unfortunately I can't seem to save descriptions under those files, but they were created by 07_sev under public commons license. 

to program the controller, just go to cleric-k's vjoyserialfeeder page. 

I have my sketch pasted below, and config available for download, if you would like to use those, although the setup from vjoyserial is very easy. 

my arduino page is here.

I will later include a discussion and theory about using 4 joysticks, and ideal configuration, however my recommendations are in the above description!

My favorite games that currently work well with the controller are : Orbital Racer, Starmade, Absolute Territory (excellent for low performance budget computers), and Infinity Battlescape. I also like Astrokill, however the joystick support is broken in the game and is awaiting update. I highly recommend my Starmade world download for navigation challenges, and Starmade has a demo-version on steam which is the full version of the game,, ,HOWEVER, you will need to reset your controller assignments every time you play the game, and every time you go to the menu, because there's a bug in the game that will only save your config properly the first time you set it. That means if you need to go back to invert or change your selection, you will need to reset that change every time you go to the menu. It might be possible to simply uninstall and reinstall the game, and ensure your config is properly entered the first time that install. 

license - 234.00 bytes - 02/13/2022 at 22:34


x-zip-compressed - 50.74 kB - 02/13/2022 at 22:34


x-zip-compressed - 42.80 kB - 02/13/2022 at 22:31


installation tutorial instructions attempt 1.rtf

Hopefully comprehensive installation instructions!

Rich Text Format - 3.71 kB - 12/05/2021 at 18:54



Here is my world with hoop courses to practice driving around. Just import this file (don't unzip it) in the game menu.

smdb - 36.93 MB - 11/22/2021 at 04:56


View all 7 files

  • Kerbal Space Program (skiff simulator)

    tsmspace01/07/2022 at 04:23 0 comments

  • another demo video

    tsmspace10/31/2021 at 05:25 0 comments

  • Some demonstration videos

    tsmspace07/21/2021 at 18:39 0 comments

  • arduino sketch paste

    tsmspace07/21/2021 at 18:25 0 comments

    #include "ibus.h"

    // //////////////////
    // Edit here to customize

    // How often to send data?
    #define UPDATE_INTERVAL 10 // milliseconds

    // 1. Analog channels. Data can be read with the Arduino's 10-bit ADC.
    // This gives values from 0 to 1023.
    // Specify below the analog pin numbers (as for analogRead) you would like to use.
    // Every analog input is sent as a single channel.
    #define NUM_ANALOG_INPUTS 8
    byte analogPins[] = {A0, A1, A2, A3, A4, A5, A6, A7}; // element count MUST be == NUM_ANALOG_INPUTS

    // 2. Digital channels. Data can be read from Arduino's digital pins.
    // They could be either LOW or HIGH.
    // Specify below the digital pin numbers (as for digitalRead) you would like to use.
    // Every pin is sent as a single channel. LOW is encoded as 0, HIGH - as 1023
    #define NUM_DIGITAL_INPUTS 12
    byte digitalPins[] = {2,3,4,5,6, 7,8,9,10,11,12,13}; // element count MUST be == NUM_DIGITAL_INPUTS

    // 3. Digital bit-mapped channels. Sending a single binary state as a 16-bit
    // channel is pretty wasteful. Instead, we can encode one digital input
    // in each of the 16 channel bits.
    // Specify below the digital pins (as for digitalRead) you would like to send as
    // bitmapped channel data. Data will be automatically organized in channels.
    // The first 16 pins will go in one channel (the first pin goes into the LSB of the channel).
    // The next 16 pins go in another channel and so on
    // LOW pins are encoded as 0 bit, HIGH - as 1.
    byte digitalBitmappedPins[] = {}; // element count MUST be == NUM_DIGITAL_BITMAPPED_INPUTS

    // Define the appropriate analog reference source. See

    // Define the baud rate
    #define BAUD_RATE 115200

    // /////////////////


    IBus ibus(NUM_CHANNELS);

    void setup()
      analogReference(ANALOG_REFERENCE); // use the defined ADC reference voltage source
      Serial.begin(BAUD_RATE);           // setup serial

    void loop()
      int i, bm_ch = 0;
      unsigned long time = millis();


      // read analog pins - one per channel
      for(i=0; i < NUM_ANALOG_INPUTS; i++)

      // read digital pins - one per channel
      for(i=0; i < NUM_DIGITAL_INPUTS; i++)
        ibus.write(digitalRead(digitalPins[i]) == HIGH ? 1023 : 0);

      // read digital bit-mapped pins - 16 pins go in one channel
      for(i=0; i < NUM_DIGITAL_BITMAPPED_INPUTS; i++) {
      int bit = i%16;
      if(digitalRead(digitalBitmappedPins[i]) == HIGH)
      bm_ch |= 1 << bit;

      if(bit == 15 || i == NUM_DIGITAL_BITMAPPED_INPUTS-1) {
      // data for one channel ready
      bm_ch = 0;


      time = millis() - time; // time elapsed in reading the inputs
      if(time < UPDATE_INTERVAL)
        // sleep till it is time for the next update
        delay(UPDATE_INTERVAL  - time);

View all 4 project logs

  • 1
    specific build decisions

    There is a simple "picture schematic" in the images for the page. I used an arduino nano v3. It doesn't matter which axis go to which analog pins or which buttons go to which digital pins, you can manage which channel is which axis in vjoyserialfeeder and each game will need to be set up with customized config anyway.

    The pulldown resistors are 10k, the joysticks are 10k. The joystick tactile buttons are not included in the build. 5v runs from the arduino to the rails on the breadboard, so does ground. The joysticks just plug directly to the analog pins. The power runs from the rails to the tactile buttons on the breadboards, and from the buttons the wire runs to the pins on the arduino. A pulldown resistor is placed between the arduino pins and ground. This means that the sketch will read high as press. 

    I have found that the small buttons are difficult to press in the trigger positions, because your fingers pull at a different angle. Your thumb will easily interact with the buttons, but you are only holding the board with your fingers and palms, so in order to make it easy and smooth to press the buttons on the bottom (your triggers!) I mounted a small block between the buttons and mounted some broken propellers to suspend over the buttons. Then you have a nice surface area to interact with and can easily pull in any direction to press the buttons. If you don't have propellers then you can use plastic knives, or some other flexible yet stable plastic. 

  • 2
    vjoyserialfeeder setup

    The setup for vjoyserialfeeder is pretty easy. I have also uploaded my configuration json, but if your pins are not in the same order as mine, then your axis and buttons will not have the same number order. This doesn't matter though, because you will need to map all of the controls in each game anyway, and mostly you just select the control and press the button or deflect the stick you want, so it's really fine. You will need to calibrate each of your axis, and while using a breadboard you may need to calibrate frequently. If it is soldered together, calibration should be very stable. Don't forget to hit save after you calibrate.

  • 3
    Some troubleshooting tips

    make sure the correct drivers for the specific arduino you have are installed, most of the arduino boards I have use the "ch340" , there is a sparkfun tutorial for the driver installation. You will need these drivers if the arduino appears on device manager as a serial usb device instead of in the com-ports as "ch340 device". -- run the "configure vjoy" app and ensure you have 8 axis and 12 buttons in the profile you set up, none of the other settings should be changed. -- make sure you have the correct comport selected in vjoyserialfeeder, you can check in device manager to see which one the gamepad is. -- once vjoyserialfeeder shows the controller and all of the controls respond, you can verify in "set up usb game controllers" that everything is feeding through vjoy correctly, just check the properties of the vjoy device. -- you should not need to restart your computer after a basic setup, but if you just installed vjoy, or the ch340 drivers, or you just reconfigured vjoy, you may need to. -- presently the Starmade joystick configuration is whacky, you will need to reset your configuration every time you go to the menu, as well as every time you load the game. This can be frustrating as if you need to simply invert an axis, you may need to reset all of your controls to do so, however starmade is very worth the effort, as my courses are just so darn well made.!

View all 3 instructions

Enjoy this project?



MabelKuhn wrote 07/23/2022 at 03:50 point

Der Gamecontroller mit 4 Joysticks (6-Achsen 6-dof) kann mit dem mitgelieferten USB-Kabel und seiner Treibersoftware an Ihren PC angeschlossen werden. Der Controller hat 3 Tasten, 1 Joystick und 1 Analogstick auf der linken Seite und 2 Tasten, 1 Joystick und 1 Analogstick auf der rechten Seite. Spielen ist bei  Neue Online Casinos wirklich wunderbar, weil man damit online viel Geld verdienen kann.

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates