![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Version 3 is with update to the test rig with a linear actuator
Dependencies: SPTE_10Bar_5V mbed AS5048 SDFileSystem MODSERIAL PinDetect LCM101 LinearActuator
main.cpp@12:b0a6faaa5e9f, 2020-02-25 (annotated)
- 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?
User | Revision | Line number | New 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 |