Gait detection system for exoskeleton control

Dependencies:   Servo mbed

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?

UserRevisionLine numberNew 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 }