ECE4180

Dependencies:   mbed PulseSensor mbed-rtos LSM9DS1_Library_cal

Committer:
yutation
Date:
Wed Dec 01 00:20:32 2021 +0000
Revision:
7:88d71c228407
Parent:
6:0398d0fcc8cc
Child:
8:2d43385e7784
4180;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbedAustin 0:59bec1fd956e 1 #include "mbed.h"
yutation 7:88d71c228407 2 #include "rtos.h"
yutation 7:88d71c228407 3 #include "LSM9DS1.h"
yutation 7:88d71c228407 4 #include "stepcounter.h"
yutation 7:88d71c228407 5 #define PI 3.14159
yutation 7:88d71c228407 6 // Earth's magnetic field varies by location. Add or subtract
yutation 7:88d71c228407 7 // a declination to get a more accurate heading. Calculate
yutation 7:88d71c228407 8 // your's here:
yutation 7:88d71c228407 9 // http://www.ngdc.noaa.gov/geomag-web/#declination
yutation 7:88d71c228407 10 #define DECLINATION -4.94 // Declination (degrees) in Atlanta,GA.
yutation 7:88d71c228407 11 LSM9DS1 IMU(p28, p27, 0xD6, 0x3C);
yutation 7:88d71c228407 12 Timer timer;
yutation 7:88d71c228407 13
yutation 7:88d71c228407 14 //
yutation 7:88d71c228407 15 filter_avg_t acc_data;
yutation 7:88d71c228407 16 axis_info_t acc_sample;
yutation 7:88d71c228407 17 peak_value_t acc_peak;
yutation 7:88d71c228407 18 slid_reg_t acc_slid;
yutation 7:88d71c228407 19 uint8_t step_cnt = 0;
yutation 7:88d71c228407 20 //
yutation 7:88d71c228407 21 AnalogIn skinTemp(p19);
mbedAustin 2:a8dcb07a1d00 22
sam_grove 5:96cb82af9996 23 RawSerial pc(USBTX, USBRX);
yutation 7:88d71c228407 24 RawSerial dev(p9,p10);
sam_grove 5:96cb82af9996 25 DigitalOut led1(LED1);
sam_grove 5:96cb82af9996 26 DigitalOut led4(LED4);
mbedAustin 2:a8dcb07a1d00 27
yutation 7:88d71c228407 28 struct gyro {
yutation 7:88d71c228407 29 float x;
yutation 7:88d71c228407 30 float y;
yutation 7:88d71c228407 31 float z;
yutation 7:88d71c228407 32 };
yutation 7:88d71c228407 33
yutation 7:88d71c228407 34 struct acce {
yutation 7:88d71c228407 35 float x;
yutation 7:88d71c228407 36 float y;
yutation 7:88d71c228407 37 float z;
yutation 7:88d71c228407 38 };
yutation 7:88d71c228407 39
yutation 7:88d71c228407 40 char imu_data[24];
yutation 7:88d71c228407 41
yutation 7:88d71c228407 42
yutation 7:88d71c228407 43 char c[4];
yutation 7:88d71c228407 44 void aa(void const *arg){
yutation 7:88d71c228407 45 char d1 = '0';
yutation 7:88d71c228407 46 while(1){
yutation 7:88d71c228407 47 c[1] = d1;
yutation 7:88d71c228407 48 d1++;
yutation 7:88d71c228407 49 if(d1 >= '9')
yutation 7:88d71c228407 50 d1 = '0';
yutation 7:88d71c228407 51 Thread::wait(100);
yutation 7:88d71c228407 52 }
yutation 7:88d71c228407 53 }
yutation 7:88d71c228407 54
yutation 7:88d71c228407 55 void bb(void const *arg){
yutation 7:88d71c228407 56 char d2 = 'a';
yutation 7:88d71c228407 57 while(1){
yutation 7:88d71c228407 58 c[2] = d2;
yutation 7:88d71c228407 59 d2++;
yutation 7:88d71c228407 60 if(d2 >= 'z')
yutation 7:88d71c228407 61 d2 = 'a';
yutation 7:88d71c228407 62 Thread::wait(100);
yutation 7:88d71c228407 63 }
yutation 7:88d71c228407 64 }
yutation 7:88d71c228407 65
yutation 7:88d71c228407 66 void out(void const *arg){
yutation 7:88d71c228407 67 while(1){
yutation 7:88d71c228407 68 //int i = 1;
yutation 7:88d71c228407 69 //dev.putc(c[1]);
yutation 7:88d71c228407 70 //dev.putc(c[2]);
yutation 7:88d71c228407 71 //dev.putc(10);
yutation 7:88d71c228407 72 //pc.printf("step: %d\n", step_cnt);
yutation 7:88d71c228407 73 Thread::wait(100);
yutation 7:88d71c228407 74 }
yutation 7:88d71c228407 75 }
yutation 7:88d71c228407 76
yutation 7:88d71c228407 77 void store_imu_data(float d, char* sp) {
yutation 7:88d71c228407 78 int id = *(int*)&d;
yutation 7:88d71c228407 79 for(int i = 0; i < 4; i++) {
yutation 7:88d71c228407 80 *(sp+i) = id % 0xff;
yutation 7:88d71c228407 81 id = id >> 8;
yutation 7:88d71c228407 82 }
yutation 7:88d71c228407 83 }
yutation 7:88d71c228407 84
yutation 7:88d71c228407 85 void update_IMU_data(void const *arg){
yutation 7:88d71c228407 86 struct gyro gy;
yutation 7:88d71c228407 87 struct acce ac;
yutation 7:88d71c228407 88 while(1){
yutation 7:88d71c228407 89 while(!IMU.accelAvailable());
yutation 7:88d71c228407 90 IMU.readAccel();
yutation 7:88d71c228407 91 while(!IMU.gyroAvailable());
yutation 7:88d71c228407 92 IMU.readGyro();
yutation 7:88d71c228407 93
yutation 7:88d71c228407 94 gy.x = IMU.calcGyro(IMU.gx);
yutation 7:88d71c228407 95 gy.y = IMU.calcGyro(IMU.gy);
yutation 7:88d71c228407 96 gy.z = IMU.calcGyro(IMU.gz);
yutation 7:88d71c228407 97 ac.x = IMU.calcAccel(IMU.ax);
yutation 7:88d71c228407 98 ac.y = IMU.calcAccel(IMU.ay);
yutation 7:88d71c228407 99 ac.z = IMU.calcAccel(IMU.az);
yutation 7:88d71c228407 100
yutation 7:88d71c228407 101 store_imu_data(gy.x, &imu_data[0]);
yutation 7:88d71c228407 102 store_imu_data(gy.y, &imu_data[4]);
yutation 7:88d71c228407 103 store_imu_data(gy.z, &imu_data[8]);
yutation 7:88d71c228407 104 store_imu_data(ac.x, &imu_data[12]);
yutation 7:88d71c228407 105 store_imu_data(ac.y, &imu_data[16]);
yutation 7:88d71c228407 106 store_imu_data(ac.z, &imu_data[20]);
yutation 7:88d71c228407 107
yutation 7:88d71c228407 108 Thread::wait(500);
sam_grove 5:96cb82af9996 109 }
sam_grove 5:96cb82af9996 110 }
sam_grove 5:96cb82af9996 111
yutation 7:88d71c228407 112 void step_counter(void const *arg) {
yutation 7:88d71c228407 113
yutation 7:88d71c228407 114 peak_value_init(&acc_peak);
yutation 7:88d71c228407 115 struct acce ac2;
yutation 7:88d71c228407 116
yutation 7:88d71c228407 117 while (1)
yutation 7:88d71c228407 118 {
yutation 7:88d71c228407 119 timer.reset();
yutation 7:88d71c228407 120 timer.start();
yutation 7:88d71c228407 121 uint16_t i = 0;
yutation 7:88d71c228407 122 float temp = 0;
yutation 7:88d71c228407 123
yutation 7:88d71c228407 124 for (i = 0; i < FILTER_CNT; i++)
yutation 7:88d71c228407 125 {
yutation 7:88d71c228407 126 while(!IMU.accelAvailable());
yutation 7:88d71c228407 127 IMU.readAccel();
yutation 7:88d71c228407 128 ac2.x = IMU.calcAccel(IMU.ax);
yutation 7:88d71c228407 129 ac2.y = IMU.calcAccel(IMU.ay);
yutation 7:88d71c228407 130 ac2.z = IMU.calcAccel(IMU.az);
yutation 7:88d71c228407 131
yutation 7:88d71c228407 132 temp = ac2.x * DATA_FACTOR;
yutation 7:88d71c228407 133 acc_data.info[i].x = (short)(temp);
yutation 7:88d71c228407 134
yutation 7:88d71c228407 135 temp = ac2.y * DATA_FACTOR;
yutation 7:88d71c228407 136 acc_data.info[i].y = (short)temp;
yutation 7:88d71c228407 137
yutation 7:88d71c228407 138 temp = ac2.z * DATA_FACTOR;
yutation 7:88d71c228407 139 acc_data.info[i].z = (short)temp;
yutation 7:88d71c228407 140
yutation 7:88d71c228407 141 Thread::wait(5);
yutation 7:88d71c228407 142 }
yutation 7:88d71c228407 143
yutation 7:88d71c228407 144 filter_calculate(&acc_data, &acc_sample);
yutation 7:88d71c228407 145
yutation 7:88d71c228407 146 peak_update(&acc_peak, &acc_sample);
yutation 7:88d71c228407 147
yutation 7:88d71c228407 148 slid_update(&acc_slid, &acc_sample);
yutation 7:88d71c228407 149
yutation 7:88d71c228407 150 detect_step(&acc_peak, &acc_slid, &acc_sample);
yutation 7:88d71c228407 151
yutation 7:88d71c228407 152 timer.stop();
yutation 7:88d71c228407 153 if(timer.read_ms() <= 20)
yutation 7:88d71c228407 154 Thread::wait(20 - timer.read_ms());
mbedAustin 0:59bec1fd956e 155 }
yutation 7:88d71c228407 156
mbedAustin 0:59bec1fd956e 157 }
mbedAustin 4:ba9100d52e48 158
yutation 7:88d71c228407 159 void skin_temp(void const *arg) {
yutation 7:88d71c228407 160 float R1 = 12457; //thermistor resistance at 20C
yutation 7:88d71c228407 161 float R2 = 8052.1; //thermistor resistance at 30C
yutation 7:88d71c228407 162 float R3 = 5334.0; //thermistor resistance at 40C
yutation 7:88d71c228407 163
yutation 7:88d71c228407 164 float T1 = 293.15; //20C
yutation 7:88d71c228407 165 float T2 = 303.15; //30C
yutation 7:88d71c228407 166 float T3 = 313.15; //40C
yutation 7:88d71c228407 167
yutation 7:88d71c228407 168 float L1 = log(R1);
yutation 7:88d71c228407 169 float L2 = log(R2);
yutation 7:88d71c228407 170 float L3 = log(R3);
yutation 7:88d71c228407 171 float Y1 = 1/T1;
yutation 7:88d71c228407 172 float Y2 = 1/T2;
yutation 7:88d71c228407 173 float Y3 = 1/T3;
yutation 7:88d71c228407 174
yutation 7:88d71c228407 175 float g2 = (Y2-Y1)/(L2-L1);
yutation 7:88d71c228407 176 float g3 = (Y3-Y1)/(L3-L1);
yutation 7:88d71c228407 177
yutation 7:88d71c228407 178 float C = (g3-g2)/(L3-L2)*(1/(L1+L2+L3));
yutation 7:88d71c228407 179 float B = g2 - C*(L1*L1 + L1*L2 + L2*L2);
yutation 7:88d71c228407 180 float A = Y1 - L1*(B + L1*L1*C);
yutation 7:88d71c228407 181
yutation 7:88d71c228407 182 float Vt;
yutation 7:88d71c228407 183 while(1) {
yutation 7:88d71c228407 184 Vt = skinTemp;
yutation 7:88d71c228407 185 //myled = skinTemp;
yutation 7:88d71c228407 186 float R = 9900*(1/Vt - 1); //9900 is the resistance of R1 in voltage divider
yutation 7:88d71c228407 187
yutation 7:88d71c228407 188 float T = 1/(A + B*log(R) + C*log(R)*log(R)*log(R));
yutation 7:88d71c228407 189 //pc.printf("Vt: %f\n\r", 1 - Vt);
yutation 7:88d71c228407 190 //pc.printf("R: %f\n\r", R);
yutation 7:88d71c228407 191
yutation 7:88d71c228407 192 //pc.printf("Skin temp: %f\n\r", T-273.15);
yutation 7:88d71c228407 193 Thread::wait(1000);
yutation 7:88d71c228407 194 }
yutation 7:88d71c228407 195
yutation 7:88d71c228407 196 }
yutation 7:88d71c228407 197
yutation 7:88d71c228407 198
mbedAustin 4:ba9100d52e48 199 int main()
mbedAustin 4:ba9100d52e48 200 {
yutation 7:88d71c228407 201
mbedAustin 4:ba9100d52e48 202 pc.baud(9600);
mbedAustin 4:ba9100d52e48 203 dev.baud(9600);
yutation 7:88d71c228407 204
yutation 7:88d71c228407 205 IMU.begin();
yutation 7:88d71c228407 206 if (!IMU.begin()) {
yutation 7:88d71c228407 207 pc.printf("Failed to communicate with LSM9DS1.\n");
yutation 7:88d71c228407 208 }
yutation 7:88d71c228407 209 IMU.calibrate(1);
mbedAustin 4:ba9100d52e48 210
yutation 7:88d71c228407 211
yutation 7:88d71c228407 212 Thread t1(step_counter);
yutation 7:88d71c228407 213 Thread t2(skin_temp);
yutation 7:88d71c228407 214 //Thread t2(bb);
yutation 7:88d71c228407 215 //Thread t3(out);
sam_grove 5:96cb82af9996 216
yutation 7:88d71c228407 217
mbedAustin 4:ba9100d52e48 218 while(1) {
yutation 7:88d71c228407 219
yutation 7:88d71c228407 220 dev.putc(0xff);
yutation 7:88d71c228407 221 dev.putc('a');
yutation 7:88d71c228407 222 dev.putc('b');
yutation 7:88d71c228407 223 dev.putc('\n')
yutation 7:88d71c228407 224 dev.putc(0xff);
yutation 7:88d71c228407 225 Thread::wait(10000);
yutation 7:88d71c228407 226
mbedAustin 4:ba9100d52e48 227 }
mbedAustin 4:ba9100d52e48 228 }