2DOF harness tensionner with Fly PTmover

Hi!

My cockpit is static, I've build a pressure gSeat with bladders and RC servo.
I wanted to increase immersion by a harness tensionner.

I'd already tested a static harness tensionner on a 2 DOF plateform, and the feeling was great.
As my rig is static, I'll have to actuate the harness but the advantage is that I can make a 2 DOF tensionner.

principle:
2 DOF harness -> the strength on the right shoulder and left shoulder will be different

both will react along Surge (longitudinal acceleration)
and Sway (lateral acceleration) will tight one shoulder or the other (depending on left turn or right turn)
(maybe later add some heave information?)

harness : 5 points
the 5th will prevent the harness to move up, this will give actual tension (vs movement)!

prefer larger harness 3" (vs only 2")

actuators:
RC servos 35kg.cm (5V to 8,3V)
PSU @7,3V

arduino:
code for 4 servos as I want to combine the harness and the gSeat pressure bladders also RC servo driven.

software:
FlyPT mover https://www.xsimulator.net/community/faq/flypt-mover.29/category

1607507030563.png


1607507067271.png


Here is a video showing step by step how I drive the 2 DOF belt with Fly PTmover:

The strength from 35kg.cm servo is enough.
Power up the servo, sit down, thight the belt as you wish, and start the sim. If you tight the belt before powering up the servos, they are loose and they could be pushed out of their range...

The only drawback, in my opinion is the noise of the servos: they are whinning...

here some infos gathered in this FAQ https://www.xsimulator.net/community/faq/harness-tensioner-simulation.361/

► shopping list
"HV high torque servo motor Robot servo 35kg RDS3235 Metal gear Coreless motor digital servo arduino servo for Robotic DIY"
17€
I chose 270° range
You'll need a dedicated power supply (5V slower to 7,4V fastest)

Speed: 0.13sec/60 degree at(5v)
0.12sec/60 degree at(6v)
0.11sec/60 degree at(7.4v)

Torque: 29kg.cm.at(5v) -1.9A
32kg.cm.at(6v) -2.1A
35kg.cm.at(7.4v) -2.3A

or stronger but unecessary in my opinion
60kgcm 24€
https://www.aliexpress.com/item/4000055027119.html

speed is voltage related
torque is current related!

1/ choose speed AKA voltage
2/ check the spec which gives you the current at chosen voltage
3/ buy your PSU ;-)

if you choose 7,4V PSU, verify it'll be able to deliver up to 2.3A in order to give full torque (add a BIG margin ;-) )
https://fr.aliexpress.com/item/32823922664.html
11€ 7V 10A


here is my ball bearing support (12€ for 2 supports)
they are made of:
P000 https://www.aliexpress.com/item/32833812473.html
Zinc Alloy Diameter Bore Ball Bearing Pillow Block Mounted Support
they allow a big static disalignment as the bearing is mounted like a joint articulation :)

and 200mm Ø10 linear shaft Cylinder Chrome Plated Liner Rods
https://www.aliexpress.com/item/4001294745058.html

roller-jpg.434449


ball-bearing-harness-2-jpg.439581


ball-bearing-harness-1-jpg.439582


► budget:
2x 17€ for 35 kg.cm servo
11€ for 7V 10A PSU
(maybe consider a 12V 10A PSU + an Adjustable Power Module Constant Current 5A)
12€ for bearing rollers
15€ any arduino with a USB port (an original to support the community or a clone)

50€ for a used 3" width 5 points harness
total = 120€ all included



arduino code (for up to 4 servos)
C++:
// Multi Direct
// -> 4 servos
// <255><LeftBelt><127><127><RightBelt>
// Rig : Bit output -> 8 bits
// avec inversion
// PT Mover envoie de 0 à 255 par axe

/*Mover = output "Binary" et "10bits"
Arduino = Byte Data[2]
Data[0] = Serial.read();
Data[1] = Serial.read();
result = (Data[0] * 256 + Data[1]);

OU

Mover = output "Binary" et "8bits"
Arduino = Byte Data
Data = Serial.read(); on obtient directement le résultat*/

#include <Servo.h>  // local library "Servo.h" vs library partagée <Servo.h>

const byte nbServos = 4;

// create servo objects to control any servo
Servo myServo[nbServos];
const byte servoPin[nbServos] = {2, 3, 4, 5};  // pins digitales (pas forcément ~pwm)
const byte inversion[nbServos] = {1, 1, 0, 0 }; // paramètre à changer si un servo part le mauvais sens
int OldSerialValue[nbServos] = {0, 0, 0, 0};
int NewSerialValue[nbServos] = {0, 0, 0, 0};

// servo span:
int servoHomeDegres[nbServos] = { 0, 0, 0, 0}; //sera mis à jour avec la mesure de pression initiale
int servoMaxDegres[nbServos] = { 90, 90, 90, 90}; // cuisseG, cuisseD, côtéG, côtéD
int servoPositionTarget[nbServos] = {0, 0, 0, 0};

const byte deadZone = 0;

// =======================================
// Variables for info received from serial
// =======================================
int bufferPrevious = 0;      // To hold previous read fom serial command
int bufferCurrent = 0;       // To hold current read fom serial command
int bufferCount = 0;         // To hold current position in bufferCommand array
// byte bufferCommand[2*nbServos] = {0};  // (*2 if 10 bits) To hold received info from serial
int bufferCommand[4] = {0};  // To hold received info from serial

void setup()
{
  Serial.begin(115200); // opens serial port at specified baud rate

  // attach the Servos to the pins
  for (byte i = 0; i < nbServos; i++) {
    // pinMode(servoPin[i], OUTPUT); // done within the library
    myServo[i].attach(servoPin[i]);  // attaches the servo on servoPin pin
    }
  // move the servos to signal startup
  MoveAllServos255toDegres(125); // mi-course
  delay(1000);
  // send all servos to home
  MoveAllServos255toDegres(0);
}

void loop()
{
  // SerialValues contain the last order received (if there is no newer received, the last is kept)

  if (Serial.available())
  {
    bufferPrevious = bufferCurrent; // Store previous byte
    bufferCurrent = Serial.read(); // Get the new byte
    bufferCommand[bufferCount] = bufferCurrent; // Put the new byte in the array
    bufferCount++; // Change to next position in the array
    if (bufferCurrent == 255) bufferCount = 0; // one 255 is the start of the position info
    if (bufferCount == nbServos) //si 8 bits, nbServos // si 10 bits nbServos*2
      //Having reach buffer count, means we have the new positions and that we can update the aimed position
    {
      for (byte i = 0; i < nbServos; i++) {
        NewSerialValue[i] = bufferCommand[i];
        //NewSerialValue[i]= (bufferCommand[i*2] * 256) + bufferCommand[i*2+1]; // si 10 bits
      }
      bufferCount = 0;
    }
  }
  // Update orders sent to motor driver
  for (byte i = 0; i < nbServos; i++) {
    if (abs(OldSerialValue[i] - NewSerialValue[i]) > deadZone) {
      if (inversion[i] == 1)
      {
        envoiServoConsigne255toDegres(i, (255 - NewSerialValue[i]));
      }
      else
      {
        envoiServoConsigne255toDegres(i, NewSerialValue[i]);
      }
      OldSerialValue[i] = NewSerialValue[i];
    }
  }
}

void envoiServoConsigne255toDegres(byte servoID, int val )
{
  byte targetDegres;
  val = constrain(val, 0, 255); // constrain coupe au dessus et en dessous : écrêtage et pas mise à l'échelle (comme map)
  // sécurité pour éviter les cas où Simtools enverrait du négatif ou au-delà de 255
  targetDegres = map(val, 0, 255, servoHomeDegres[servoID], servoMaxDegres[servoID]);
  //  map(value, fromLow, fromHigh, toLow, toHigh)
  myServo[servoID].write(targetDegres);              // tell servo to go to position in variable : in steps of 1 degree
  // servo.write(angle)  -> angle: the value to write to the servo, from 0 to 180
}

void MoveAllServos255toDegres( int target)
{
  // send all servos to home
  for (byte i = 0; i < nbServos; i++) {
    envoiServoConsigne255toDegres(i, target);
  }
}

here is the setup:
setup 2DOF harness.png


and the file itself: replace .txt extension by .Mover extension
 

Attachments

  • 4Dof_Belt_255_multiDirect_v6bALPHA.txt
    94.9 KB · Views: 454
Last edited:
here a topic with rollers by mars on xsimulator.net

After some time spent using the harness tensionner, I really like how it help to break correctly (hardest first then decreasing) :)

only drawback is the noise: i'll try a muffle box
 
Last edited:
Upvote 0
@Petterio : I'm currently building rollers on bearing.
The harness is no more pressing down on me. The feeling is better (and there no friction): I feel more pressed :) and not push down.
I'll shoot a video once the right side will be finalized (it's not easy on a fiberglass seat)
roller.jpg
 
Upvote 0
The only drawback, in my opinion is the noise of the servos: they are whinning...
Fastening servos to that frame allows it to act as sounding board.
Instead, fabricating second hooks screwed to servos,
allowing them to be suspended between straps,
would reduce whine acoustic efficiency.
 
Upvote 0
I seem to be to old to figure out things so I would need your help to understand a bit more of your harness tensor.
I got a Simekit K2 rig, and what I believe it´s a 5 point sabelt harness and several dayton exciters around the seat.
I understand I would need 4 servos, 2 for back and one per leg.
I can´t find on amazon that servo you posted with the rectangular adaptor for axis rotation.
More things, my back harness don´t have any metallic end/ clamp / fastener, is that right? I would need to add something for the servo to grab, right?
is your system simpler than those I saw with servors turning to "roll" the harness?
do you use flight sims?
 
Upvote 0
"HV high torque servo motor Robot servo 35kg RDS3235 Metal gear Coreless motor digital servo arduino servo for Robotic DIY"
17€
I chose 270° range
You'll need a dedicated power supply (5V slower to 7,4V fastest)

Speed: 0.13sec/60 degree at(5v)
0.12sec/60 degree at(6v)
0.11sec/60 degree at(7.4v)

Torque: 29kg.cm.at(5v) -1.9A
32kg.cm.at(6v) -2.1A
35kg.cm.at(7.4v) -2.3A

or bigger but unecessary in my opinion
60kgcm 24€
 
Upvote 0
no additionnal module, it's really straightforward!

speed is voltage related
torque is current related!

1/ choose speed AKA voltage
2/ check the spec which gives you the current at chosen voltage
3/ buy your PSU ;-)

if you choose 7,4V PSU, verify it'll be able to deliver up to 2.3A in order to give full torque (add a BIG margin ;-) )
11€ 7V 10A
maybe I'll add a battery because on very quick and full range movement, the PSU cannot fully deliver.
 
Last edited:
Upvote 0
you're right @blekenbleu, it's tedious
Good idea, it reminds me that I used 3300 µF 400 V capacitor on my direct drive wheel years ago before simucube.

About supercapacitor, do you have any advice?

here is a very interesting topic about using supercapacitors

Here a 16V 5.7F
16€+13€ shipping=29€

or DIY : https://fr.aliexpress.com/item/32998532961.html
with this 6 series 2.7v500f you can make a capacity of 16V83F

prefer capacitor with 4 legs
The extra legs serve TWO purposes.
The first is to "key" the capacitor such that it only fits into the circuit one way. When working with this level of energy density it is a good idea to do this.
Second, they serve as additional mechanical connections to the board in order to stabilize and support the capacitor. These capacitors are large and heavy
 
Last edited:
Upvote 0
My preference would be capacitors directly connected to motor wires, so 7V or three 2.7V supercaps in series. To be certain that voltage distributes evenly, a resistor in parallel with each cap, e.g. 1/2 Watt 47 Ohm, less than 50mA. Initial inrush current will be large; perhaps wanting a current-limiter e.g. JacobsParts XL4015. Allowing for regulation voltage drop, that wants a 9VDC supply.
 
Upvote 0
the XL4015 current limiting function requires to down step 1V... which looks counterproductive?

maybe a simple 1ohm 25W resistor in serial?
my PSU is 7V+5%=7.35V 10A
in order to limit the charging current to 8A
R = 7,3 V / 8 A = 0,91 Ohm -> 1 Ohm will limit to 7.3A
 
Last edited:
Upvote 0
1 Ohm will limit to 7.3A
1 Ohm inserted in lead from power supply will drop 2.5V for 2.5A motor draw.
If 1 Ohm between only supply and supercap, then also need a blocking diode for discharging to motor,
which will drop about 0.5V.
3-5A, 9 or 12VDC supplies are commodities, net cost with current-limiting regulator around US$15
 
Upvote 0
Yes! 16V offerings more cost-effectively bundle balance circuitry;
I intend to reconfigure a similar 16V 16.6F offering for 8V 66.7F.
the XL4015 current limiting function requires to down step 1V... which looks counterproductive?
Already having a suitable 12VDC supply, a US$7 XL4015 5A adjustable constant current module will limit inrush, requiring about 2 minutes to charge paralleled 100F supercaps before launching motors.
 
Last edited:
Upvote 0
Back
Top