Version 3 is with update to the test rig with a linear actuator

Dependencies:   SPTE_10Bar_5V mbed AS5048 SDFileSystem MODSERIAL PinDetect LCM101 LinearActuator

Committer:
cnckiwi31
Date:
Tue Feb 25 15:04:21 2020 +0000
Revision:
12:b0a6faaa5e9f
Parent:
10:77fcbad99a31
Manual data logging call

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cnckiwi31 5:63063a9fa51c 1 /**
cnckiwi31 5:63063a9fa51c 2 * Author: Allan Veale
cnckiwi31 5:63063a9fa51c 3 * Date: 27/11/19
cnckiwi31 5:63063a9fa51c 4 * Purpose: Datalog from the active wearable test rig fitted with the first
cnckiwi31 5:63063a9fa51c 5 * realistic (foam tissue) leg
cnckiwi31 5:63063a9fa51c 6 */
megrootens 0:3855d4588f76 7
cnckiwi31 5:63063a9fa51c 8 //Both the general mbed header and the test rig bench header are needed
cnckiwi31 5:63063a9fa51c 9 #include "mbed.h"
cnckiwi31 5:63063a9fa51c 10 #include "bench.h"
megrootens 0:3855d4588f76 11
cnckiwi31 10:77fcbad99a31 12
cnckiwi31 12:b0a6faaa5e9f 13 //Experiment methods
cnckiwi31 12:b0a6faaa5e9f 14 void runFatigueExperiment0(int cycles, float targetkPa,float inflateTimeOut,float deflateTimeOut);
cnckiwi31 10:77fcbad99a31 15
cnckiwi31 5:63063a9fa51c 16 // Create bench object - this is used to control the test rig
cnckiwi31 5:63063a9fa51c 17 Bench leg;
megrootens 0:3855d4588f76 18
megrootens 0:3855d4588f76 19 /**
cnckiwi31 5:63063a9fa51c 20 * Main loop
megrootens 0:3855d4588f76 21 */
megrootens 0:3855d4588f76 22 int main()
cnckiwi31 5:63063a9fa51c 23 {
cnckiwi31 12:b0a6faaa5e9f 24 leg.setLoggingFrequency(10); //Set datalogging frequency
cnckiwi31 5:63063a9fa51c 25
cnckiwi31 5:63063a9fa51c 26 /* Two extra columns of data will be recorded in this experiment.
cnckiwi31 5:63063a9fa51c 27 One for the target pressure, and the other for the number of sit and
cnckiwi31 5:63063a9fa51c 28 stand cycles currently completed in the experiment */
cnckiwi31 5:63063a9fa51c 29 string colNames[] = {"Target pressure (kPa)","Cycle"}; //add data headings
cnckiwi31 5:63063a9fa51c 30 leg.setExtraColumns(colNames,2);
megrootens 0:3855d4588f76 31
cnckiwi31 12:b0a6faaa5e9f 32 float targetP = 350; //Target pressure in kPa
cnckiwi31 12:b0a6faaa5e9f 33 int expCycles = 50; //Number of sit to stand to sit cycles
cnckiwi31 5:63063a9fa51c 34 float vals[] = {targetP,0}; //set initial values of data that will be logged
cnckiwi31 5:63063a9fa51c 35 leg.setExtraData(vals);
cnckiwi31 4:1cdce6c6c94e 36
cnckiwi31 5:63063a9fa51c 37 /* Setup all peripherals on rig, display info about SD card and the
cnckiwi31 5:63063a9fa51c 38 user interface menu */
cnckiwi31 12:b0a6faaa5e9f 39 leg.initialise();
cnckiwi31 5:63063a9fa51c 40
cnckiwi31 5:63063a9fa51c 41 /*Run an experiment when the button is pressed to start datalogging and
cnckiwi31 5:63063a9fa51c 42 stop it if the button is pressed again to stop datalogging
cnckiwi31 5:63063a9fa51c 43 (or when experiment stops - then datalogging stops by itself) */
cnckiwi31 5:63063a9fa51c 44 while (true) {
cnckiwi31 5:63063a9fa51c 45 if (leg.isLogging()) {
cnckiwi31 12:b0a6faaa5e9f 46 runFatigueExperiment0(expCycles,targetP,10,10);
cnckiwi31 5:63063a9fa51c 47 }
cnckiwi31 12:b0a6faaa5e9f 48 wait(0.5);
megrootens 0:3855d4588f76 49 }
megrootens 0:3855d4588f76 50 }
megrootens 0:3855d4588f76 51
cnckiwi31 5:63063a9fa51c 52 /**
cnckiwi31 12:b0a6faaa5e9f 53 * Shows how a fatigue experiment works. This experiment pressurises the leg to
cnckiwi31 5:63063a9fa51c 54 * pressure targetkPa, depressurises it, and then repeats the process cycles
cnckiwi31 5:63063a9fa51c 55 * number of times
cnckiwi31 5:63063a9fa51c 56 * @param cycles: the number of cycles the leg goes up and down
cnckiwi31 5:63063a9fa51c 57 * @param targetkPa: the pressure at which the valve is opened to let the leg go down
cnckiwi31 12:b0a6faaa5e9f 58 * @param inflateTimeOut: time in seconds after which experiment will stop if target pressure is not reached
cnckiwi31 12:b0a6faaa5e9f 59 * @param inflateTimeOut: time in seconds after which experiment will stop if deflation pressure is not reached
cnckiwi31 5:63063a9fa51c 60 */
cnckiwi31 12:b0a6faaa5e9f 61 void runFatigueExperiment0(int cycles, float targetkPa, float inflateTimeOut,float deflateTimeOut)
megrootens 0:3855d4588f76 62 {
cnckiwi31 12:b0a6faaa5e9f 63 Timer flowT;//used to time flow into and out of actuator
cnckiwi31 12:b0a6faaa5e9f 64 float loopTime = 0.1; //(s) time between checking pressure
cnckiwi31 12:b0a6faaa5e9f 65
cnckiwi31 12:b0a6faaa5e9f 66 leg.StartLogging();
cnckiwi31 5:63063a9fa51c 67
cnckiwi31 5:63063a9fa51c 68 //Stop the Bench class from printing, so this method can print
cnckiwi31 5:63063a9fa51c 69 leg.pausePrint();
cnckiwi31 12:b0a6faaa5e9f 70
cnckiwi31 12:b0a6faaa5e9f 71 // Pressurise and depressurise the leg cycles number of times
cnckiwi31 12:b0a6faaa5e9f 72 for (int i=0; i<cycles; i++) {
cnckiwi31 12:b0a6faaa5e9f 73 //Print the progress
cnckiwi31 12:b0a6faaa5e9f 74 leg.pc.printf("\r\nCycle: \t%i out of \t%i",i+1,cycles);
megrootens 0:3855d4588f76 75
cnckiwi31 12:b0a6faaa5e9f 76 //Update cycles logged
cnckiwi31 12:b0a6faaa5e9f 77 float data[] = {targetkPa,i+1};
cnckiwi31 12:b0a6faaa5e9f 78 leg.setExtraData(data);
megrootens 0:3855d4588f76 79
cnckiwi31 12:b0a6faaa5e9f 80 //Pressurise
cnckiwi31 12:b0a6faaa5e9f 81 leg.setValve(true);
cnckiwi31 12:b0a6faaa5e9f 82 flowT.reset();
cnckiwi31 12:b0a6faaa5e9f 83 flowT.start();// start inflation timer
cnckiwi31 12:b0a6faaa5e9f 84
cnckiwi31 12:b0a6faaa5e9f 85 //Wait until measured pressure reaches target pressure
cnckiwi31 12:b0a6faaa5e9f 86 while(leg.getPressure0()*100 < targetkPa && flowT.read() < inflateTimeOut) {
megrootens 0:3855d4588f76 87
cnckiwi31 12:b0a6faaa5e9f 88 //Keep checking logging is going
cnckiwi31 12:b0a6faaa5e9f 89 if (!leg.isLogging()) {
cnckiwi31 12:b0a6faaa5e9f 90 leg.pc.printf("\r\nExit A");
cnckiwi31 12:b0a6faaa5e9f 91 //Logging stopped
cnckiwi31 12:b0a6faaa5e9f 92 leg.setValve(false); //Depressurise
cnckiwi31 12:b0a6faaa5e9f 93 leg.StopLogging(); //Stop logging data
cnckiwi31 12:b0a6faaa5e9f 94 leg.resumePrint(); //Let the Bench class print
cnckiwi31 12:b0a6faaa5e9f 95 return;
cnckiwi31 12:b0a6faaa5e9f 96 }
cnckiwi31 12:b0a6faaa5e9f 97
cnckiwi31 12:b0a6faaa5e9f 98 leg.LogData();
cnckiwi31 12:b0a6faaa5e9f 99 wait(loopTime);//Wait a bit
cnckiwi31 12:b0a6faaa5e9f 100 }
cnckiwi31 12:b0a6faaa5e9f 101 leg.pc.printf("\r\nTimer inflate: \t%7.2f",flowT.read());
cnckiwi31 12:b0a6faaa5e9f 102 if(flowT.read() >= inflateTimeOut) {
cnckiwi31 12:b0a6faaa5e9f 103 leg.pc.printf("\r\nExit B");
cnckiwi31 12:b0a6faaa5e9f 104 //Logging stopped
cnckiwi31 12:b0a6faaa5e9f 105 leg.setValve(false); //Depressurise
cnckiwi31 12:b0a6faaa5e9f 106 leg.StopLogging(); //Stop logging data
cnckiwi31 12:b0a6faaa5e9f 107 leg.resumePrint(); //Let the Bench class print
cnckiwi31 12:b0a6faaa5e9f 108 return;
cnckiwi31 12:b0a6faaa5e9f 109 }
cnckiwi31 12:b0a6faaa5e9f 110
cnckiwi31 12:b0a6faaa5e9f 111 //Depressurise
cnckiwi31 12:b0a6faaa5e9f 112 leg.setValve(false);
cnckiwi31 12:b0a6faaa5e9f 113 flowT.reset();
megrootens 0:3855d4588f76 114
cnckiwi31 12:b0a6faaa5e9f 115 /*Wait until depressurised (completely depressurised is
cnckiwi31 12:b0a6faaa5e9f 116 around 10-12 kPa due to current sensor calibration)*/
cnckiwi31 12:b0a6faaa5e9f 117 while(leg.getPressure0()*100 > 15 && flowT.read() < deflateTimeOut) {
cnckiwi31 12:b0a6faaa5e9f 118
cnckiwi31 12:b0a6faaa5e9f 119 //Keep checking logging is going
cnckiwi31 12:b0a6faaa5e9f 120 if (!leg.isLogging()) {
cnckiwi31 12:b0a6faaa5e9f 121 leg.pc.printf("\r\nExit C");
cnckiwi31 12:b0a6faaa5e9f 122 //Logging stopped
cnckiwi31 12:b0a6faaa5e9f 123 leg.setValve(false); //Depressurise
cnckiwi31 12:b0a6faaa5e9f 124 leg.StopLogging(); //Stop logging data
cnckiwi31 12:b0a6faaa5e9f 125 leg.resumePrint(); //Let the Bench class print
cnckiwi31 12:b0a6faaa5e9f 126 return;
cnckiwi31 12:b0a6faaa5e9f 127 }
cnckiwi31 12:b0a6faaa5e9f 128
cnckiwi31 12:b0a6faaa5e9f 129 leg.LogData();
cnckiwi31 12:b0a6faaa5e9f 130 wait(loopTime);//Wait a bit
cnckiwi31 12:b0a6faaa5e9f 131 }
cnckiwi31 12:b0a6faaa5e9f 132
cnckiwi31 12:b0a6faaa5e9f 133 leg.pc.printf("\r\nTimer deflate: \t%7.2f",flowT.read());
cnckiwi31 12:b0a6faaa5e9f 134 if(flowT.read() >= deflateTimeOut) {
cnckiwi31 12:b0a6faaa5e9f 135 leg.pc.printf("\r\nExit D");
cnckiwi31 12:b0a6faaa5e9f 136 //Logging stopped
cnckiwi31 12:b0a6faaa5e9f 137 leg.setValve(false); //Depressurise
cnckiwi31 12:b0a6faaa5e9f 138 leg.StopLogging(); //Stop logging data
cnckiwi31 12:b0a6faaa5e9f 139 leg.resumePrint(); //Let the Bench class print
cnckiwi31 12:b0a6faaa5e9f 140 return;
cnckiwi31 12:b0a6faaa5e9f 141 }
cnckiwi31 10:77fcbad99a31 142 }
cnckiwi31 12:b0a6faaa5e9f 143 leg.pc.printf("\r\nExit E");
cnckiwi31 12:b0a6faaa5e9f 144 // Logging stopped as experiment is fully completed
cnckiwi31 12:b0a6faaa5e9f 145 leg.setValve(false); //Depressurise
cnckiwi31 12:b0a6faaa5e9f 146 leg.StopLogging(); //Stop logging data
cnckiwi31 12:b0a6faaa5e9f 147 leg.resumePrint(); //Let the Bench class print
cnckiwi31 10:77fcbad99a31 148 }
cnckiwi31 10:77fcbad99a31 149