1. Do not share user accounts! Any account that is shared by another person will be blocked and closed. This means: we will close not only the account that is shared, but also the main account of the user who uses another person's account. We have the ability to detect account sharing, so please do not try to cheat the system. This action will take place on 04/18/2023. Read all forum rules.
    Dismiss Notice
  2. For downloading SimTools plugins you need a Download Package. Get it with virtual coins that you receive for forum activity or Buy Download Package - We have a zero Spam tolerance so read our forum rules first.

    Buy Now a Download Plan!
  3. Do not try to cheat our system and do not post an unnecessary amount of useless posts only to earn credits here. We have a zero spam tolerance policy and this will cause a ban of your user account. Otherwise we wish you a pleasant stay here! Read the forum rules
  4. We have a few rules which you need to read and accept before posting anything here! Following these rules will keep the forum clean and your stay pleasant. Do not follow these rules can lead to permanent exclusion from this website: Read the forum rules.
    Are you a company? Read our company rules

DIY G-Seat (from concept to final)

Discussion in 'DIY Motion Simulator Projects' started by early_m, Feb 21, 2018.

  1. early_m

    early_m Active Member

    Joined:
    Jul 28, 2016
    Messages:
    318
    Location:
    Chelmsford
    Balance:
    824Coins
    Ratings:
    +341 / 4 / -0
    My Motion Simulator:
    2DOF, DC motor, Arduino, Motion platform
    not sure on that, wouldn't like to comment - I don't know enough about the GS4
  2. early_m

    early_m Active Member

    Joined:
    Jul 28, 2016
    Messages:
    318
    Location:
    Chelmsford
    Balance:
    824Coins
    Ratings:
    +341 / 4 / -0
    My Motion Simulator:
    2DOF, DC motor, Arduino, Motion platform
    No, the seat is static. May add 2 dof further down the line
  3. SeatTime

    SeatTime Well-Known Member

    Joined:
    Dec 27, 2013
    Messages:
    2,574
    Occupation:
    Retired
    Location:
    Brisbane Australia
    Balance:
    28,370Coins
    Ratings:
    +2,844 / 38 / -0
    My Motion Simulator:
    AC motor, Motion platform
    Yes a 2DOF would make your inner ear happy for pitch/roll and let you better simulate flight, roller coaster or similar experiences, but from my experience for cars , I think you would benefit more from adding a heave paddle to your G seat. Unfortunately Heave really requires some high powered/fast DC/AC motors, or allot of high speed servos to drive the paddle/s reliabilily.
  4. MAYAman

    MAYAman New Member

    Joined:
    Jun 2, 2010
    Messages:
    23
    Balance:
    97Coins
    Ratings:
    +2 / 0 / -0
    I can’t stop reading and perusing this thread lol. This seat is better than any commercial seat I’ve seen. I tried to contract early to help me make designs for a seat like his but he is a very busy man. So I’m asking if anyone would like to help me put the design to such a seat on paper. No building, just planning. Instructions on how to build such a seat for a novice. I am willing to pay for any and all time you spend helping me.

    thanks and thanks to early_m for the great work.
    • Like Like x 1
  5. early_m

    early_m Active Member

    Joined:
    Jul 28, 2016
    Messages:
    318
    Location:
    Chelmsford
    Balance:
    824Coins
    Ratings:
    +341 / 4 / -0
    My Motion Simulator:
    2DOF, DC motor, Arduino, Motion platform
    Slightly overdue update but the seat and frame is 100% finished.

    Seat covers back on along with headrest:

    IMG_3187.JPG
    • Like Like x 3
  6. early_m

    early_m Active Member

    Joined:
    Jul 28, 2016
    Messages:
    318
    Location:
    Chelmsford
    Balance:
    824Coins
    Ratings:
    +341 / 4 / -0
    My Motion Simulator:
    2DOF, DC motor, Arduino, Motion platform
    Did make a few modifications since the last update

    Removed the g-wheel system and printed off some cover plates where the servos were:

    IMG_3188.JPG

    I initially thought the system worked well, but after more and more use it just didn't feel right. When you brake your body pushes into your arms which push into your hands and onto the wheel. The system I implemented didn't really accomplish this feeling. The force down the arms and into the hands wasn't there. The wheel just moves towards you and your arms naturally bend. Another lesson learnt but have to give these things a go
    Last edited: Oct 22, 2018
  7. early_m

    early_m Active Member

    Joined:
    Jul 28, 2016
    Messages:
    318
    Location:
    Chelmsford
    Balance:
    824Coins
    Ratings:
    +341 / 4 / -0
    My Motion Simulator:
    2DOF, DC motor, Arduino, Motion platform
    I also completed changed how the servos connect into the breadboard. The original design was too fiddly when taking the seat on and off for maintenance. Refitting the servo connectors was a pain. I tried running just a 9 pin dsub cable but the wires aren't rated high enough for the current I need, so implemented 2 connectors, 1 for power and one for data. This way I know the servos are getting all the power they need:

    IMG_3193.JPG

    Now it's very easy to maintain - undo 2 connectors and 4 bolts and the entire seat lifts off the frame.
    • Like Like x 2
  8. early_m

    early_m Active Member

    Joined:
    Jul 28, 2016
    Messages:
    318
    Location:
    Chelmsford
    Balance:
    824Coins
    Ratings:
    +341 / 4 / -0
    My Motion Simulator:
    2DOF, DC motor, Arduino, Motion platform
  9. early_m

    early_m Active Member

    Joined:
    Jul 28, 2016
    Messages:
    318
    Location:
    Chelmsford
    Balance:
    824Coins
    Ratings:
    +341 / 4 / -0
    My Motion Simulator:
    2DOF, DC motor, Arduino, Motion platform
    Came up with a solution to mount the sifter. Is sturdy enough. Just needs painting black.

    IMG_4162.JPG
    IMG_4163.JPG
    • Like Like x 1
  10. early_m

    early_m Active Member

    Joined:
    Jul 28, 2016
    Messages:
    318
    Location:
    Chelmsford
    Balance:
    824Coins
    Ratings:
    +341 / 4 / -0
    My Motion Simulator:
    2DOF, DC motor, Arduino, Motion platform
    Added a bass shaker to the underside of the seat. A sinus live 50w (£30) paired with a cheap 2x50w amp of eBay (£6).

    Main purpose is to achieve a sense of heave. Initial tests with LFS are great. Can feel bumps in the road and the rumble strips. Have also included a little rpm and gear change which takes the immersion to another level.

    The only issue I didn't forsee was the misses shouting at me from downstairs about the vibrations. Have tried to isolate the seat using rubber washers but will also need to source some anti vibration pads to go under the casters.

    Anyone have any other suggestions for isolation?

    image.jpeg
    • Like Like x 1
  11. noorbeast

    noorbeast VR Tassie Devil Staff Member Moderator Race Director

    Joined:
    Jul 13, 2014
    Messages:
    20,534
    Occupation:
    Innovative tech specialist for NGOs
    Location:
    St Helens, Tasmania, Australia
    Balance:
    145,028Coins
    Ratings:
    +10,776 / 52 / -2
    My Motion Simulator:
    3DOF, DC motor, JRK
  12. early_m

    early_m Active Member

    Joined:
    Jul 28, 2016
    Messages:
    318
    Location:
    Chelmsford
    Balance:
    824Coins
    Ratings:
    +341 / 4 / -0
    My Motion Simulator:
    2DOF, DC motor, Arduino, Motion platform
    Thanks for the isolator link, can you confirm they are effective? Doesn't look like they'd stop vibrations travelling down through a fixing? Not without an additional rubber washer under the bolt head?

    Think I'll go for these https://www.ebay.co.uk/itm/1pc-φ50x...e=STRK:MEBIDX:IT&_trksid=p2057872.m2749.l2649 as they offer a complete rubber isolation between mounts.
  13. noorbeast

    noorbeast VR Tassie Devil Staff Member Moderator Race Director

    Joined:
    Jul 13, 2014
    Messages:
    20,534
    Occupation:
    Innovative tech specialist for NGOs
    Location:
    St Helens, Tasmania, Australia
    Balance:
    145,028Coins
    Ratings:
    +10,776 / 52 / -2
    My Motion Simulator:
    3DOF, DC motor, JRK
    They are effective in isolating sim vibrations from my wooden floor.
  14. early_m

    early_m Active Member

    Joined:
    Jul 28, 2016
    Messages:
    318
    Location:
    Chelmsford
    Balance:
    824Coins
    Ratings:
    +341 / 4 / -0
    My Motion Simulator:
    2DOF, DC motor, Arduino, Motion platform
    My first handbrake design sucked a bit. It did the job but the feel just wasn't right.
    So I went back to the drawing board. Thought that a compression spring would be a better option so the design revolves around that concept.

    All 3D printed except the spring and screws:

    image.jpeg

    Final assembly:

    image.jpeg

    Added a bike handle bar grip to finish it off:

    IMG_5970.JPG
    • Like Like x 3
    Last edited: Apr 23, 2019
  15. Trip Rodriguez

    Trip Rodriguez VR Pilot

    Joined:
    May 8, 2016
    Messages:
    675
    Location:
    Lake Ariel, Pennsylvania
    Balance:
    3,920Coins
    Ratings:
    +330 / 6 / -0
    My Motion Simulator:
    6DOF
    Excellent work @early_m ! Thank you for the great build thread. I'm once again thinking about building a G-seat for my rig (it's the one final thing my sim really needs!), but it has to be pretty cheap at this juncture. I think I can follow the instructions here pretty easily.

    Two questions for you Early_m:
    1- How are those servos holding up so far? How many hours you think you have on them?

    2- I apologize in advance for this one! Can you direct me to the information on how to drive this type of servo from Simtools? From your thread I gather you are using Arduino Uno's, but I have zero experience or knowledge about that type of setup and so have no idea what's involved. For my AC powered 6DOF rig I used AMC1280USB and followed someone else's thread on exactly what components to buy and how to connect everything so now I have to do the same for this type of small servo setup.

    Before anyone says it, yes I'm sure I could learn about this by searching on the forum but since I intend to follow this build and use the same (or similar) servos I want to make sure I follow the exact method you used here.

    I just really hope I'm able to build this thing and get the seat cover back on like you did! That looks absolutely perfect in the photo!
  16. early_m

    early_m Active Member

    Joined:
    Jul 28, 2016
    Messages:
    318
    Location:
    Chelmsford
    Balance:
    824Coins
    Ratings:
    +341 / 4 / -0
    My Motion Simulator:
    2DOF, DC motor, Arduino, Motion platform
    So far the servos are holding up well - no issues with any of them. Although it doesn't get used all that much due to parenthood :confused: i reckon about 15-20 hours so far. Im a relatively small fella, but it's moved some big mates about just fine. What I would say is those servos are a little hard to come by now - possibly end of life so best to source an alternative.

    I took the RC code from @eaorobbie and modified it a bit to drive 6 axis. I'm no expert on coding so dug around a little, had a tinker, and managed to figure it out. Also had to modify the code so that only positive/negative values where sent to the servos as they could only travel in one direction due to my design build (but you may not have that issue).

    Thanks for your kind words - it was a fun project!
  17. Trip Rodriguez

    Trip Rodriguez VR Pilot

    Joined:
    May 8, 2016
    Messages:
    675
    Location:
    Lake Ariel, Pennsylvania
    Balance:
    3,920Coins
    Ratings:
    +330 / 6 / -0
    My Motion Simulator:
    6DOF
    Might you be able to share your code to give me a good starting point when the time comes?

    Thanks!
  18. early_m

    early_m Active Member

    Joined:
    Jul 28, 2016
    Messages:
    318
    Location:
    Chelmsford
    Balance:
    824Coins
    Ratings:
    +341 / 4 / -0
    My Motion Simulator:
    2DOF, DC motor, Arduino, Motion platform
    Here is the code, very much for my particular setup so will need tweaking for yours. Only positive values are sent to the servos. There's a small bug when the left sway servo initialises (goes to an odd angle) but sorts itself out when telemetry starts (maybe someone can advise).

    Code:
    //********************************************************************************************
    // RC Model Servo
    // Original code By EAOROBBIE (Robert Lindsay)
    // Completely mangled by aarondc
    // For free use for Sim Tool Motion Software
    //********************************************************************************************
    #include <Servo.h>
    //#define DEBUG 1                                    // comment out this line to remove debuggin Serial.print lines
    const int kActuatorCount = 6;                       // how many Actuators we are handling
    
    // the letters ("names") sent from Sim Tools to identify each actuator
    // NB: the order of the letters here determines the order of the remaining constants kPins and kActuatorScale
    const char kActuatorName[kActuatorCount] = { 'A', 'B', 'C', 'D', 'E', 'F' };
    const int kPins[kActuatorCount] = {4, 5, 6, 7, 8, 9};             // pins to which the Actuators are attached
    const int kActuatorScale[kActuatorCount][2] = { { 90, 0 } ,    // A Actuator scaling
                                                    { 90, 179 } ,    // B Actuator scaling
                                                    { 90, 0 } ,    // C Actuator scaling
                                                    { 90, 179 } ,    // D Actuator scaling
                                                    { 175, 14 } ,    // E Actuator scaling
                                                    { 14, 175 } ,    // F Actuator scaling
                                                   };     
    const char kEOL = '~';                              // End of Line - the delimiter for our acutator values
    const int kMaxCharCount = 3;                        // some insurance...
    Servo actuatorSet[kActuatorCount];                  // our array of Actuators
    int actuatorPosition[kActuatorCount] = {90, 90, 90, 90, 14, 14};    // current Actuator positions, initialised to 90
    int currentActuator;                                // keep track of the current Actuator being read in from serial port
    int valueCharCount = 0;                             // how many value characters have we read (must be less than kMaxCharCount!!
    
    // set up some states for our state machine
    // psReadActuator = next character from serial port tells us the Actuator
    // psReadValue = next 3 characters from serial port tells us the value
    enum TPortState { psReadActuator, psReadValue };   
    TPortState currentState = psReadActuator;
    
    void setup()
    {
        // attach the Actuators to the pins
        for (int i = 0; i < kActuatorCount; i++)
            actuatorSet[i].attach(kPins[i]);
        
        // initialise actuator position
        for (int i = 0; i < kActuatorCount; i++)
            updateActuator(i);
        
        Serial.begin(9600); // opens serial port at a baud rate of 9600
    }
     
    void loop()
    {
    
    }
    
    // this code only runs when we have serial data available. ie (Serial.available() > 0).
    void serialEvent() {
        char tmpChar;
        int tmpValue;
    
        while (Serial.available()) {
            // if we're waiting for a Actuator name, grab it here
            if (currentState == psReadActuator) {
                tmpChar = Serial.read();
                // look for our actuator in the array of actuator names we set up
    #ifdef DEBUG           
    Serial.print("read in ");           
    Serial.println(tmpChar);           
    #endif
                for (int i = 0; i < kActuatorCount; i++) {
                    if (tmpChar == kActuatorName[i]) {
    #ifdef DEBUG           
    Serial.print("which is actuator ");           
    Serial.println(i);           
    #endif
                        currentActuator = i;                        // remember which actuator we found
                        currentState = psReadValue;                 // start looking for the Actuator position
                        actuatorPosition[currentActuator] = 0;      // initialise the new position
                        valueCharCount = 0;                         // initialise number of value chars read in
                        break;
                    }
                }
            }
            
            // if we're ready to read in the current Actuator's position data
            if (currentState == psReadValue) {
                while ((valueCharCount < kMaxCharCount) && Serial.available()) {
                    tmpValue = Serial.read();
                    if (tmpValue != kEOL) {
                        tmpValue = tmpValue - 48;
                        if ((tmpValue < 0) || (tmpValue > 9)) tmpValue = 0;
                        actuatorPosition[currentActuator] = actuatorPosition[currentActuator] * 10 + tmpValue;
                        valueCharCount++;
                    }
                    else break;
                }
                
                // if we've read the value delimiter, update the Actuator and start looking for the next Actuator name
                if (tmpValue == kEOL || valueCharCount == kMaxCharCount) {
    #ifdef DEBUG           
    Serial.print("read in ");           
    Serial.println(actuatorPosition[currentActuator]);           
    #endif
                    //No -ve on G-seat : 128 = middle
                    if (actuatorPosition[currentActuator]<128) actuatorPosition[currentActuator]=128;
    
                    // scale the new position
                    // Range is now 128 - 255
                    // Maps between min and max
                    actuatorPosition[currentActuator] = map(actuatorPosition[currentActuator], 128, 255, kActuatorScale[currentActuator][0], kActuatorScale[currentActuator][1]);
                    //
    #ifdef DEBUG           
    Serial.print("scaled to ");           
    Serial.println(actuatorPosition[currentActuator]);           
    #endif
                    updateActuator(currentActuator);
                    currentState = psReadActuator;
                }
            }
        }
    }
    
    
    // write the current Actuator position to the passed in Actuator
    void updateActuator(int thisActuator) {
        int safePos;
        safePos=actuatorPosition[thisActuator];
      //  safePos=100;
        actuatorSet[thisActuator].write(safePos);
    }
    Simtools Axis assignments:

    Axis Settings.JPG

    Interface Settings

    Interface Settings.JPG

    Interface - Output

    A<Axis1a>~B<Axis2a>~C<Axis3a>~D<Axis4a>~E<Axis5a>~F<Axis6a>~

    This is the servo https://hobbyking.com/en_us/sm-s8330m-137g-30kg-22-sec.html?___store=en_us - discontinued from where I got them for £13 a pop. You can still get them but not for that price so might be better cheaper alternatives.

    Hope that helps. Good Luck.

    Attached Files:

    • Like Like x 1
  19. Henrik

    Henrik New Member Gold Contributor

    Joined:
    Aug 13, 2017
    Messages:
    18
    Location:
    Sverige
    Balance:
    104Coins
    Ratings:
    +15 / 0 / -0
    I have one question because i am on the move with my own (yeei)
    Do you really need 4 servos for the brake paddel, or do you think one would get away with only 2 ?

    And course the praise of your inspiring and cool projekt!! :thumbs
  20. early_m

    early_m Active Member

    Joined:
    Jul 28, 2016
    Messages:
    318
    Location:
    Chelmsford
    Balance:
    824Coins
    Ratings:
    +341 / 4 / -0
    My Motion Simulator:
    2DOF, DC motor, Arduino, Motion platform
    depends on what servos you're using and the torque they supply. It also depends on how your seat and peddles are set up as this affects how your thighs contact that part of the seat. On my seat the backs of my legs aren't being fully supported by that area, so 4 servos are probably excessive but I originally went with 2 paddles under the legs (2 servos on each) but then changed to just one paddle.