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:
I still do not see a ground connection in the image between UNO and servo.
I suppose that the UNO is being powered via USB;
at least, that is how my STM32 "blue pill" is powered.
 
Upvote 0
I still do not see a ground connection in the image between UNO and servo.
I suppose that the UNO is being powered via USB;
at least, that is how my STM32 "blue pill" is powered.
I think the issue may be the Arduino because when I open the Arduino software it's unrecognised so I have returned and ordered a legit R3 from the website direct

I'm not that sure what I'm doing here but I don't want to give up yet! ;)
 
Last edited:
Upvote 0
when I open the Arduino software it's unrecognised
Before returning, be sure to try Arduino software with the UNO connected ONLY by USB;
electrical interference can confuse these microcontrollers so that their firmware gets lost.
I'm not that sure what I'm doing here
I am also not sure what you have connected in that image;
is that red wire connected to ground at the UNO end?
If so, bad color choice.
The other end appears to be connected to green wire ground (for AC power)
which is NOT the same as black/ground to the servo, which is wanted.
 
Last edited:
Upvote 0
Before returning, be sure to try Arduino software with the UNO connected ONLY by USB;
electrical interference can confuse these microcontrollers so that their firmware gets lost.

I am also not sure what you have connected in that image;
is that red wire connected to ground at the UNO end?
If so, bad color choice.
The other end appears to be connected to green wire ground (for AC power)
which is NOT the same as black/ground to the servo, which is wanted.
I tried with just the USB like this:
1616348704319.png

sadly no dice nothing happened. I followed the exact same pinouts as above using a generated Arduino code but when I tried sending it to the Arduino all it gave was this error:
1616348870464.png


And yeah sorry forgot to mention, I only have red wire currently I placed the ground to the AC input ground to see if that would work and also tried the V- line (first) but that did not work.

As a result, I decided to return that Arduino for the genuine R3 model, I hope I haven't burnt out the servos that's one slight concern I have in my head still
 
Last edited:
Upvote 0
what sketch did you upload into the arduino?
For initial system testing I tried to use this

For sim use I used the instructions from your video on FlyPT Mover:
1616678993197.png


But once connected when manually changing the slider no servo movement happened.
 
Upvote 0
okay...
I guess you're new to arduino :)

you have to setup accordingly
- the serial communication in FlyPTMover parameters
- the arduino serial communication parameters in the code
- the RC servo wiring on the arduino board according to pin declared in the arduino code
It's mandatory.

The arduino code you used, is standalone: no serial communication is setup. It automatically moves the servos from position to position.
So, if your test didn't succeed:
- your servo is not wired on the right arduino pins
- your servo is not connected to the power supply? (edit: I skipped your previous message, you don't use a power supply unit (I hope you're not using a 35kg.cm servo, it cannot be powered from Arduino board))
- the code is actually not loaded into the arduino (edit: your previous message confirmed my supposition)
Try some basic arduino tutorial first. You'll succeed eventually!

I'll add the code that goes with the Fly PT mover video I made, in the first post with some wiring scheme. :)
 
Last edited:
Upvote 0
Upvote 0
okay...
I guess you're new to arduino :)

you have to setup accordingly
- the serial communication in FlyPTMover parameters
- the arduino serial communication parameters in the code
- the RC servo wiring on the arduino board according to pin declared in the arduino code
It's mandatory.

The arduino code you used, is standalone: no serial communication is setup. It automatically moves the servos from position to position.
So, if your test didn't succeed:
- your servo is not wired on the right arduino pins
- your servo is not connected to the power supply? (edit: I skipped your previous message, you don't use a power supply unit (I hope you're not using a 35kg.cm servo, it cannot be powered from Arduino board))
- the code is actually not loaded into the arduino (edit: your previous message confirmed my supposition)
Try some basic arduino tutorial first. You'll succeed eventually!

I'll add the code that goes with the Fly PT mover video I made, in the first post with some wiring scheme. :)
Oh I did not realise there was additional code required for the Arduino I assumed the mover software would handle all the code in the background, I am new to Arduino :) Unfortunately, I am not a coder so maybe looking at some servo tutorials will be beneficial, I will try your code when the new board arrives but then I would like to learn a little
 
Last edited:
Upvote 0
I finally had success the issue was I needed the correct library Servo.h for the Arduino, I managed to successfully get one motor working, tomorrow I will continue my basic test and if proof of concept works I will then move to the structural design

I can see why people say they are noisy just one alone sounded like a squealing bunch of ferrits
 
Last edited:
Upvote 0
I got everything set up and working well but one of the motors get extremely hot after two laps and I think it burnt out as it no longer works, since I need to get another motor I am taking the opportunity to move to the 60kg ones as I was wanting a bit more strength
Technically the current power supply should work for this still but may require changing as well
 
Upvote 0
Back
Top