
Gait detection system for exoskeleton control
main.cpp@0:a40546713f83, 2017-02-07 (annotated)
- Committer:
- yacine1991
- Date:
- Tue Feb 07 19:19:43 2017 +0000
- Revision:
- 0:a40546713f83
- Child:
- 1:3ce5d2797365
In this version return to a new line is added to avoid getting 5m and 0.22p
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
yacine1991 | 0:a40546713f83 | 1 | #include "mbed.h" |
yacine1991 | 0:a40546713f83 | 2 | #include <stdio.h> |
yacine1991 | 0:a40546713f83 | 3 | |
yacine1991 | 0:a40546713f83 | 4 | //Initialize pins |
yacine1991 | 0:a40546713f83 | 5 | AnalogIn ain(p16); |
yacine1991 | 0:a40546713f83 | 6 | Serial device(p28,p27); |
yacine1991 | 0:a40546713f83 | 7 | |
yacine1991 | 0:a40546713f83 | 8 | //Variables |
yacine1991 | 0:a40546713f83 | 9 | Timer t; |
yacine1991 | 0:a40546713f83 | 10 | float gaitPeriod[6]; |
yacine1991 | 0:a40546713f83 | 11 | int startTime = 0; |
yacine1991 | 0:a40546713f83 | 12 | int gaitCounter = 0; |
yacine1991 | 0:a40546713f83 | 13 | float gaitPeriodMean = 0.00f; |
yacine1991 | 0:a40546713f83 | 14 | float inputReading = 0.00f; |
yacine1991 | 0:a40546713f83 | 15 | float percentage = 0.00f; |
yacine1991 | 0:a40546713f83 | 16 | |
yacine1991 | 0:a40546713f83 | 17 | //function to calculate the mean |
yacine1991 | 0:a40546713f83 | 18 | float mean (float tab[], int size){ |
yacine1991 | 0:a40546713f83 | 19 | float sum = 0.00f; |
yacine1991 | 0:a40546713f83 | 20 | for (int i=1;i<size;i++){ |
yacine1991 | 0:a40546713f83 | 21 | sum += tab[i]; |
yacine1991 | 0:a40546713f83 | 22 | } |
yacine1991 | 0:a40546713f83 | 23 | return sum/(size-1); |
yacine1991 | 0:a40546713f83 | 24 | } |
yacine1991 | 0:a40546713f83 | 25 | |
yacine1991 | 0:a40546713f83 | 26 | int main(void) |
yacine1991 | 0:a40546713f83 | 27 | { |
yacine1991 | 0:a40546713f83 | 28 | device.baud(57600); |
yacine1991 | 0:a40546713f83 | 29 | |
yacine1991 | 0:a40546713f83 | 30 | while (1) { |
yacine1991 | 0:a40546713f83 | 31 | //Check for Serial Event |
yacine1991 | 0:a40546713f83 | 32 | if (device.readable()){ |
yacine1991 | 0:a40546713f83 | 33 | char command = device.getc(); |
yacine1991 | 0:a40546713f83 | 34 | /* |
yacine1991 | 0:a40546713f83 | 35 | Menu: |
yacine1991 | 0:a40546713f83 | 36 | Case a: get the mean of gait period over 5 cycles |
yacine1991 | 0:a40546713f83 | 37 | Case b: use the calculated mean to estimate gait |
yacine1991 | 0:a40546713f83 | 38 | cycle percentage while walking |
yacine1991 | 0:a40546713f83 | 39 | */ |
yacine1991 | 0:a40546713f83 | 40 | switch (command){ |
yacine1991 | 0:a40546713f83 | 41 | case 'a': |
yacine1991 | 0:a40546713f83 | 42 | //Get sensor reading |
yacine1991 | 0:a40546713f83 | 43 | inputReading = ain.read(); |
yacine1991 | 0:a40546713f83 | 44 | wait(0.5); |
yacine1991 | 0:a40546713f83 | 45 | |
yacine1991 | 0:a40546713f83 | 46 | //Busy waiting for 1st heel strike |
yacine1991 | 0:a40546713f83 | 47 | while (inputReading < 0.20f){ |
yacine1991 | 0:a40546713f83 | 48 | device.printf("n|a"); |
yacine1991 | 0:a40546713f83 | 49 | inputReading = ain.read(); |
yacine1991 | 0:a40546713f83 | 50 | wait(0.5); |
yacine1991 | 0:a40546713f83 | 51 | } |
yacine1991 | 0:a40546713f83 | 52 | t.start(); |
yacine1991 | 0:a40546713f83 | 53 | t.reset(); |
yacine1991 | 0:a40546713f83 | 54 | gaitCounter = 0; |
yacine1991 | 0:a40546713f83 | 55 | |
yacine1991 | 0:a40546713f83 | 56 | //Get the mean of five gait cycles periods |
yacine1991 | 0:a40546713f83 | 57 | while (gaitCounter<6){ |
yacine1991 | 0:a40546713f83 | 58 | inputReading = ain.read(); |
yacine1991 | 0:a40546713f83 | 59 | //***This "wait" must be minimal***// |
yacine1991 | 0:a40546713f83 | 60 | wait(0.5); |
yacine1991 | 0:a40546713f83 | 61 | |
yacine1991 | 0:a40546713f83 | 62 | //Sensor threshold and time more than 0.8 sec |
yacine1991 | 0:a40546713f83 | 63 | if((inputReading>0.20f)&&(t.read()>0.8f)){ |
yacine1991 | 0:a40546713f83 | 64 | gaitCounter++; |
yacine1991 | 0:a40546713f83 | 65 | gaitPeriod[gaitCounter] = t.read_ms();//-startTime; |
yacine1991 | 0:a40546713f83 | 66 | t.reset();//reset timer to zero |
yacine1991 | 0:a40546713f83 | 67 | device.printf("g|%d\r\n",gaitCounter); |
yacine1991 | 0:a40546713f83 | 68 | |
yacine1991 | 0:a40546713f83 | 69 | if (gaitCounter == 5){ |
yacine1991 | 0:a40546713f83 | 70 | //mean =(gaitPeriod[2]+gaitPeriod[3]+gaitPeriod[4]+gaitPeriod[5]+gaitPeriod[6])/5.0f; |
yacine1991 | 0:a40546713f83 | 71 | gaitPeriodMean = mean(gaitPeriod,6); |
yacine1991 | 0:a40546713f83 | 72 | //device.printf("Gait period: %1.2f\r\n", mean); |
yacine1991 | 0:a40546713f83 | 73 | device.printf("m|%1.2f", gaitPeriodMean); |
yacine1991 | 0:a40546713f83 | 74 | gaitCounter = 100;//get out of While |
yacine1991 | 0:a40546713f83 | 75 | } |
yacine1991 | 0:a40546713f83 | 76 | } |
yacine1991 | 0:a40546713f83 | 77 | } |
yacine1991 | 0:a40546713f83 | 78 | break; |
yacine1991 | 0:a40546713f83 | 79 | |
yacine1991 | 0:a40546713f83 | 80 | case 'b': |
yacine1991 | 0:a40546713f83 | 81 | t.stop(); |
yacine1991 | 0:a40546713f83 | 82 | device.printf("n|b"); |
yacine1991 | 0:a40546713f83 | 83 | inputReading = ain.read(); |
yacine1991 | 0:a40546713f83 | 84 | wait(0.5); |
yacine1991 | 0:a40546713f83 | 85 | |
yacine1991 | 0:a40546713f83 | 86 | //Busy waiting for the first heel strike to occur |
yacine1991 | 0:a40546713f83 | 87 | while(inputReading<0.20f){ |
yacine1991 | 0:a40546713f83 | 88 | inputReading = ain.read(); |
yacine1991 | 0:a40546713f83 | 89 | wait(0.5); |
yacine1991 | 0:a40546713f83 | 90 | //device.printf("I am in empty While B\r\n"); |
yacine1991 | 0:a40546713f83 | 91 | } |
yacine1991 | 0:a40546713f83 | 92 | |
yacine1991 | 0:a40546713f83 | 93 | //device.printf("I just get out of Empty While\r\n"); |
yacine1991 | 0:a40546713f83 | 94 | |
yacine1991 | 0:a40546713f83 | 95 | //Re-initialize gaitCounter to Zero to start a new cycle |
yacine1991 | 0:a40546713f83 | 96 | percentage = 0.00; |
yacine1991 | 0:a40546713f83 | 97 | t.reset(); |
yacine1991 | 0:a40546713f83 | 98 | t.start(); |
yacine1991 | 0:a40546713f83 | 99 | |
yacine1991 | 0:a40546713f83 | 100 | while(percentage<1.00){ |
yacine1991 | 0:a40546713f83 | 101 | //device.printf("I am in the Percentage While\r\n"); |
yacine1991 | 0:a40546713f83 | 102 | percentage = t.read_ms()/gaitPeriodMean; |
yacine1991 | 0:a40546713f83 | 103 | device.printf("p|%1.2f\r\n",percentage); |
yacine1991 | 0:a40546713f83 | 104 | |
yacine1991 | 0:a40546713f83 | 105 | //***To Do*** |
yacine1991 | 0:a40546713f83 | 106 | //Check if reading the sensor is necessary |
yacine1991 | 0:a40546713f83 | 107 | //to ensure starting a new cycle |
yacine1991 | 0:a40546713f83 | 108 | //Real test to determine |
yacine1991 | 0:a40546713f83 | 109 | |
yacine1991 | 0:a40546713f83 | 110 | //Check if the cycle is finished |
yacine1991 | 0:a40546713f83 | 111 | if(percentage >= 1.0){ |
yacine1991 | 0:a40546713f83 | 112 | //Reset percentage |
yacine1991 | 0:a40546713f83 | 113 | percentage = 0.00; |
yacine1991 | 0:a40546713f83 | 114 | t.stop(); |
yacine1991 | 0:a40546713f83 | 115 | t.reset(); |
yacine1991 | 0:a40546713f83 | 116 | //device.printf("Percentage set to zero,%1.2f\r\n",t.read_ms()); |
yacine1991 | 0:a40546713f83 | 117 | //Start timer for another gait cycle |
yacine1991 | 0:a40546713f83 | 118 | t.start(); |
yacine1991 | 0:a40546713f83 | 119 | } |
yacine1991 | 0:a40546713f83 | 120 | |
yacine1991 | 0:a40546713f83 | 121 | //Check if the user wants to stop the system |
yacine1991 | 0:a40546713f83 | 122 | if (device.readable()){ |
yacine1991 | 0:a40546713f83 | 123 | command = device.getc(); |
yacine1991 | 0:a40546713f83 | 124 | //Go back to the menu |
yacine1991 | 0:a40546713f83 | 125 | if (command == 'o'){ |
yacine1991 | 0:a40546713f83 | 126 | percentage = 100; |
yacine1991 | 0:a40546713f83 | 127 | device.printf("o|%1.2f",percentage); |
yacine1991 | 0:a40546713f83 | 128 | t.stop();t.reset();t.start(); |
yacine1991 | 0:a40546713f83 | 129 | } |
yacine1991 | 0:a40546713f83 | 130 | } |
yacine1991 | 0:a40546713f83 | 131 | } |
yacine1991 | 0:a40546713f83 | 132 | break; |
yacine1991 | 0:a40546713f83 | 133 | |
yacine1991 | 0:a40546713f83 | 134 | default: |
yacine1991 | 0:a40546713f83 | 135 | device.printf("Waiting for your commad\r\n"); |
yacine1991 | 0:a40546713f83 | 136 | } |
yacine1991 | 0:a40546713f83 | 137 | } |
yacine1991 | 0:a40546713f83 | 138 | } |
yacine1991 | 0:a40546713f83 | 139 | } |