Servo Testing
|
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.
/***************************************************************** 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 }
![]() |
|