Servo Testing
07/06/21: Page Origin

I considering how to improve 4" sliding Valve 8's performance, I decided I need to measure the actual torque delivered by different servos, plus that'll come in handy when automating my 2" dust system.
I ordered 20Kg pressure sensor with amplifier from Amazon.          


Click For Larger Pic
/*****************************************************************
MEASURE TORQUE OUTPUT OF A SMALL SERVO. 
HOLD SERVO AND LOAD CELL STATIC. SERVO TRIES ROTATE HORN INTO LOAD CELL, 
MEASURING FORCE. KNOWN DIST BETWEEN SERVO'S CENTER OF ROT & LOAD CELL, 
SERVO'S TORQUE CALCD FROM FORCE ON LOAD CELL, AVG RDNGS
*****************************************************************/
#include "HX711.h"                 // INCLUDE IFAC LIBS WITH HX711 AND SERVO
#include 

//********************* DEFINES ***********************************
#define CALFCTR -7050.0                 // VAL FROM HX711_Calibration SKETCH
#define TRLRUNS 5                                     // NUMBER MSRMNT RDNGS
float ArmLen = 2.75;   // DIST (CM) SERVO'S CENTER OF ROTATION AND LOAD CELL
#define DT  3                      // HX711 DT PIN CONNECTS TO D3 ON ARDUINO
#define SCK  2                    // HX711 SCK PIN CONNECTS TO D2 ON ARDUINO

//********************* VARIABLES ***********************************
Servo TstSrvo;                                      // CREATE A SERVO OBJECT
HX711 LdCell( DT, SCK);                                  // INITIALIZE HX711

//********************* PROTOTYPES ***********************************
void measTrq(); 
void align();

/*F***************************************************************
*
*****************************************************************/
void 
setup() 
{
    Serial.begin( 9600 );                                    // BGN SER COMM
    Serial.println(" - Torque Measurement Tool - ");          // PNT HEADING
    TstSrvo.attach( 9 );                    // SET PIN USED TO CONTROL SERVO
    LdCell.set_scale( CALFCTR );               // VAL FROM HX711_CALIBRATION
    LdCell.tare();  // RST SCALE TO ZERO TO COMPENSATE FOR ANY EXISTING LOAD
    align();                                         // SERVO START POSITION
}
/*F***************************************************************
*
*****************************************************************/
void 
loop() 
{
    int   chr;

    if( Serial.available() > 0 )
    {
        chr = toupper( Serial.read());   // READ FROM SERIAL & CONVERT TO UC
        switch( chr )
        {
            case 't':                                        // PERFORM TEST
                measTrq();  
                break;
            case 'a':                              // ALIGN ARM TO LD SENSOR
                align();
                break;
            default:
                break;
        }
    }
    delay( 500 );                               // NOTHING TO DO, TAKE A NAP
}
/*F***************************************************************
* ALIGN SERVO TO STRAIN GUAGE, SERVO ARM ALIGNED SO THAT IT IS JUST MAKING
* CONTACT WITH STRAIN GUAGE, AT SERVO ANGLE OF 140 DEGREES 
*****************************************************************/
void 
align() 
{
    TstSrvo.write( 140 );                       // MOVE SERVO INTO LOAD CELL
    Serial.println("Arm at alignment position");
}
/*F***************************************************************
* TEST SERVO'S TORQUE, SERVO PUSHES ON LD CELL
* TAKE FIVE FORCE READINGS, COMPUTE AN AVERAGE FORCE VALUE. DISTANCE
* BETWEEN SERVO'S CENTER OF ROTATION AND LOAD CELL KNOWN
* T = F * r (T = torque, F = load reading (force), and r = radius of rotation
* (DISTANCE BETWEEN SERVO AND LOAD CELL).  TORQUE WILL BE kg*cm
*****************************************************************/
void 
measTrq() 
{
    int     ndx1, ndx2;
    float   avgRdng, srvoTrq, rdgSum, rdgs[TRLRUNS];

    Serial.println( "Individual Readings: ");
    for( ndx1 = 0; ndx1 < 5; ndx1++) 
    {
        TstSrvo.write( 180 );             // MOVE SERVO AWAY FROM LOAD CELL
        delay( 1000 );                            // WAIT FOR SERVO TO MOVE
        LdCell.tare();  // RST SCALE = ZERO TO COMPENSATE FOR EXISTING LOAD
        TstSrvo.write( 130 );       // SERVO PUSHES ON CELL (130 DEG ANGLE)
        delay( 1000 );                            // WAIT FOR SERVO TO MOVE
        rdgs[ndx1] = LdCell.get_units();                 // TAKE MEASURMENT
        Serial.print( rdgs[ndx1]);          // PRINT MEASURMENT OVER SERIAL
        Serial.print("   ");
    }
    Serial.println(); // HAVE FIVE READINGS, AVG TO GET ONE AVG LOAD READING
    for( rdgSum = ndx2 = 0; ndx2 < TRLRUNS; ndx2++) 
        rdgSum += rdgs[ndx2];                   // ADD TOGETHER ALL READINGS
    avgRdng = rdgSum / TRLRUNS;                          // AVERAGE READINGS
    Serial.println((String)"Average Readings: "+avgRdng);  // PRINT AVG RDNG
    srvoTrq = avgRdng * ArmLen;                          // CALCULATE TORQUE
    Serial.println((String)"Torque: "+srvoTrq+" kgcm");      // PRINT TORQUE
    TstSrvo.write( 180 ); // MOVE SERVO AWAY FROM LOAD CELL AFTER TESTING
}