temp
Dependencies: mbed SDFileSystem MS5607 ADXL345_I2C FATFileSystem
main.cpp@0:c88c3b616c00, 2020-03-16 (annotated)
- Committer:
- IKobayashi
- Date:
- Mon Mar 16 23:37:42 2020 +0900
- Revision:
- 0:c88c3b616c00
copy
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
IKobayashi | 0:c88c3b616c00 | 1 | #include<mbed.h> |
IKobayashi | 0:c88c3b616c00 | 2 | #include"MS5607I2C.h" |
IKobayashi | 0:c88c3b616c00 | 3 | #include"ADXL345_I2C.h" |
IKobayashi | 0:c88c3b616c00 | 4 | #include "SDFileSystem.h" |
IKobayashi | 0:c88c3b616c00 | 5 | #include "HMC5883L.h" |
IKobayashi | 0:c88c3b616c00 | 6 | #include<stdio.h> |
IKobayashi | 0:c88c3b616c00 | 7 | //#include<math.h> |
IKobayashi | 0:c88c3b616c00 | 8 | |
IKobayashi | 0:c88c3b616c00 | 9 | #define SDA p9 |
IKobayashi | 0:c88c3b616c00 | 10 | #define SCL p10 |
IKobayashi | 0:c88c3b616c00 | 11 | #define Rs p21 //right servo motor |
IKobayashi | 0:c88c3b616c00 | 12 | #define Ls p22 //left servo motor |
IKobayashi | 0:c88c3b616c00 | 13 | #define PI 3.14159265 |
IKobayashi | 0:c88c3b616c00 | 14 | #define N_SAMPLE 256 |
IKobayashi | 0:c88c3b616c00 | 15 | #define WAIT_TIME 50 |
IKobayashi | 0:c88c3b616c00 | 16 | #define N_DIM 4 |
IKobayashi | 0:c88c3b616c00 | 17 | #define EPS 1e-8 |
IKobayashi | 0:c88c3b616c00 | 18 | #define goallat 4008.544783 |
IKobayashi | 0:c88c3b616c00 | 19 | #define goallon 13959.2389 |
IKobayashi | 0:c88c3b616c00 | 20 | |
IKobayashi | 0:c88c3b616c00 | 21 | SDFileSystem sd(p5, p6, p7, p8, "sd"); |
IKobayashi | 0:c88c3b616c00 | 22 | Serial pc(USBTX, USBRX); |
IKobayashi | 0:c88c3b616c00 | 23 | Serial xbee(p28,p27); |
IKobayashi | 0:c88c3b616c00 | 24 | Serial gps(p13, p14); |
IKobayashi | 0:c88c3b616c00 | 25 | MS5607I2C ms5607(SDA, SCL, true); |
IKobayashi | 0:c88c3b616c00 | 26 | ADXL345_I2C accelerometer(SDA, SCL); |
IKobayashi | 0:c88c3b616c00 | 27 | HMC5883L hmc5883l(SDA, SCL); |
IKobayashi | 0:c88c3b616c00 | 28 | Timer timer; |
IKobayashi | 0:c88c3b616c00 | 29 | Ticker decision; |
IKobayashi | 0:c88c3b616c00 | 30 | DigitalOut led1(LED1); |
IKobayashi | 0:c88c3b616c00 | 31 | DigitalOut led2(LED2); |
IKobayashi | 0:c88c3b616c00 | 32 | DigitalOut led3(LED3); |
IKobayashi | 0:c88c3b616c00 | 33 | DigitalOut led4(LED4); |
IKobayashi | 0:c88c3b616c00 | 34 | InterruptIn StartPort(p24); |
IKobayashi | 0:c88c3b616c00 | 35 | PwmOut servoLeft(Ls); |
IKobayashi | 0:c88c3b616c00 | 36 | PwmOut servoRight(Rs); |
IKobayashi | 0:c88c3b616c00 | 37 | |
IKobayashi | 0:c88c3b616c00 | 38 | FILE *dt; |
IKobayashi | 0:c88c3b616c00 | 39 | FILE *lo; |
IKobayashi | 0:c88c3b616c00 | 40 | |
IKobayashi | 0:c88c3b616c00 | 41 | bool flight_pin = false; |
IKobayashi | 0:c88c3b616c00 | 42 | bool gp = false; |
IKobayashi | 0:c88c3b616c00 | 43 | int i,rlock,mode,num; |
IKobayashi | 0:c88c3b616c00 | 44 | char gps_data[256]; |
IKobayashi | 0:c88c3b616c00 | 45 | char ns,ew; |
IKobayashi | 0:c88c3b616c00 | 46 | float w_time,hokui,tokei; |
IKobayashi | 0:c88c3b616c00 | 47 | float g_hokui,g_tokei; |
IKobayashi | 0:c88c3b616c00 | 48 | // float d_hokui,m_hokui,d_tokei,m_tokei; |
IKobayashi | 0:c88c3b616c00 | 49 | unsigned char c; |
IKobayashi | 0:c88c3b616c00 | 50 | double dev = 0; |
IKobayashi | 0:c88c3b616c00 | 51 | double gpsdata[4]; //gps data |
IKobayashi | 0:c88c3b616c00 | 52 | |
IKobayashi | 0:c88c3b616c00 | 53 | |
IKobayashi | 0:c88c3b616c00 | 54 | void ini(); |
IKobayashi | 0:c88c3b616c00 | 55 | void FP(); |
IKobayashi | 0:c88c3b616c00 | 56 | void getGPS(); |
IKobayashi | 0:c88c3b616c00 | 57 | void getdata(double *aldata, double acdata[], double mgdata[]); |
IKobayashi | 0:c88c3b616c00 | 58 | void servo(float x); |
IKobayashi | 0:c88c3b616c00 | 59 | void correction(double ac[], double mg[], double delta[]); |
IKobayashi | 0:c88c3b616c00 | 60 | void dev_calc(double exam[], double *s, double *t); |
IKobayashi | 0:c88c3b616c00 | 61 | void calc_dir_lati_longi(double newl[], double *result); |
IKobayashi | 0:c88c3b616c00 | 62 | |
IKobayashi | 0:c88c3b616c00 | 63 | |
IKobayashi | 0:c88c3b616c00 | 64 | int main(){ |
IKobayashi | 0:c88c3b616c00 | 65 | pc.baud(9600); //sekect baudrate |
IKobayashi | 0:c88c3b616c00 | 66 | gps.baud(9600); |
IKobayashi | 0:c88c3b616c00 | 67 | xbee.baud(9600); |
IKobayashi | 0:c88c3b616c00 | 68 | double aldata; |
IKobayashi | 0:c88c3b616c00 | 69 | double acdata[3]; |
IKobayashi | 0:c88c3b616c00 | 70 | double mgdata[3]; |
IKobayashi | 0:c88c3b616c00 | 71 | double delta[2]; |
IKobayashi | 0:c88c3b616c00 | 72 | double result; |
IKobayashi | 0:c88c3b616c00 | 73 | double chigh = 2000; |
IKobayashi | 0:c88c3b616c00 | 74 | double dhigh = 0; |
IKobayashi | 0:c88c3b616c00 | 75 | int k; |
IKobayashi | 0:c88c3b616c00 | 76 | mkdir("/sd/log", 0777); |
IKobayashi | 0:c88c3b616c00 | 77 | mkdir("/sd/sensordata", 0777); |
IKobayashi | 0:c88c3b616c00 | 78 | lo = fopen("/sd/log/log.txt", "a"); |
IKobayashi | 0:c88c3b616c00 | 79 | if(lo == NULL) { |
IKobayashi | 0:c88c3b616c00 | 80 | error("Could not open file for write\n"); |
IKobayashi | 0:c88c3b616c00 | 81 | } |
IKobayashi | 0:c88c3b616c00 | 82 | dt = fopen("/sd/sensordata/data.csv", "a"); |
IKobayashi | 0:c88c3b616c00 | 83 | if(dt == NULL) { |
IKobayashi | 0:c88c3b616c00 | 84 | error("Could not open file for write\n"); |
IKobayashi | 0:c88c3b616c00 | 85 | } |
IKobayashi | 0:c88c3b616c00 | 86 | fprintf(dt,"UTC,lon,lat,satnum,altitude,acce_x,acce_y,acce_z,mag_x,mag_y,mag_z\n"); |
IKobayashi | 0:c88c3b616c00 | 87 | fclose(dt); |
IKobayashi | 0:c88c3b616c00 | 88 | pc.printf("Cansat activate.....\r\n"); |
IKobayashi | 0:c88c3b616c00 | 89 | xbee.printf("Cansat activate.....\r\n"); |
IKobayashi | 0:c88c3b616c00 | 90 | fprintf(lo,"Cansat activate.....\r\n"); |
IKobayashi | 0:c88c3b616c00 | 91 | pc.printf("make directory and start initialize\r\n"); |
IKobayashi | 0:c88c3b616c00 | 92 | xbee.printf("make directory and start initialize\r\n"); |
IKobayashi | 0:c88c3b616c00 | 93 | fprintf(lo,"make directory and start initialize\r\n"); |
IKobayashi | 0:c88c3b616c00 | 94 | ini(); //initialize |
IKobayashi | 0:c88c3b616c00 | 95 | fclose(lo); |
IKobayashi | 0:c88c3b616c00 | 96 | |
IKobayashi | 0:c88c3b616c00 | 97 | StartPort.mode(PullUp); |
IKobayashi | 0:c88c3b616c00 | 98 | StartPort.fall(&FP); |
IKobayashi | 0:c88c3b616c00 | 99 | servo(0); |
IKobayashi | 0:c88c3b616c00 | 100 | |
IKobayashi | 0:c88c3b616c00 | 101 | while(flight_pin != true){ |
IKobayashi | 0:c88c3b616c00 | 102 | led1 =! led1; |
IKobayashi | 0:c88c3b616c00 | 103 | wait(0.1); |
IKobayashi | 0:c88c3b616c00 | 104 | } |
IKobayashi | 0:c88c3b616c00 | 105 | led1 = 0; |
IKobayashi | 0:c88c3b616c00 | 106 | while(true){ |
IKobayashi | 0:c88c3b616c00 | 107 | while(true){ |
IKobayashi | 0:c88c3b616c00 | 108 | gps.attach(getGPS,Serial::RxIrq); |
IKobayashi | 0:c88c3b616c00 | 109 | if(gp == true)break; |
IKobayashi | 0:c88c3b616c00 | 110 | } |
IKobayashi | 0:c88c3b616c00 | 111 | gp=false; |
IKobayashi | 0:c88c3b616c00 | 112 | getdata(&aldata,acdata,mgdata); |
IKobayashi | 0:c88c3b616c00 | 113 | dhigh = chigh - aldata; |
IKobayashi | 0:c88c3b616c00 | 114 | chigh = aldata; |
IKobayashi | 0:c88c3b616c00 | 115 | dt = fopen("/sd/sensordata/data.csv", "a"); |
IKobayashi | 0:c88c3b616c00 | 116 | if(dt == NULL) { |
IKobayashi | 0:c88c3b616c00 | 117 | error("Could not open file for write\n"); |
IKobayashi | 0:c88c3b616c00 | 118 | } |
IKobayashi | 0:c88c3b616c00 | 119 | fprintf(dt,"%lf,%lf,%lf,%2.0lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf\n",gpsdata[0],gpsdata[1],gpsdata[2],gpsdata[3],aldata,acdata[0],acdata[1],acdata[2],mgdata[0],mgdata[1],mgdata[2]); |
IKobayashi | 0:c88c3b616c00 | 120 | fclose(dt); |
IKobayashi | 0:c88c3b616c00 | 121 | correction(acdata,mgdata,delta); |
IKobayashi | 0:c88c3b616c00 | 122 | calc_dir_lati_longi(gpsdata,&result); |
IKobayashi | 0:c88c3b616c00 | 123 | dev_calc(delta,&result,&dev); |
IKobayashi | 0:c88c3b616c00 | 124 | lo = fopen("/sd/log/log.txt", "a"); |
IKobayashi | 0:c88c3b616c00 | 125 | if(lo == NULL) { |
IKobayashi | 0:c88c3b616c00 | 126 | error("Could not open file for write\n"); |
IKobayashi | 0:c88c3b616c00 | 127 | } |
IKobayashi | 0:c88c3b616c00 | 128 | if (-180 < dev && dev <= -150) { |
IKobayashi | 0:c88c3b616c00 | 129 | servo(0); |
IKobayashi | 0:c88c3b616c00 | 130 | fprintf(lo,"Left:180\r\n"); |
IKobayashi | 0:c88c3b616c00 | 131 | pc.printf("Left:180\r\n"); |
IKobayashi | 0:c88c3b616c00 | 132 | } |
IKobayashi | 0:c88c3b616c00 | 133 | else if (-150 < dev && dev <= -120) { |
IKobayashi | 0:c88c3b616c00 | 134 | servo(30); |
IKobayashi | 0:c88c3b616c00 | 135 | fprintf(lo,"Left:150\r\n"); |
IKobayashi | 0:c88c3b616c00 | 136 | pc.printf("Left:150\r\n"); |
IKobayashi | 0:c88c3b616c00 | 137 | } |
IKobayashi | 0:c88c3b616c00 | 138 | else if (-120 < dev && dev <= -90) { |
IKobayashi | 0:c88c3b616c00 | 139 | servo(60); |
IKobayashi | 0:c88c3b616c00 | 140 | fprintf(lo,"Left:120\r\n"); |
IKobayashi | 0:c88c3b616c00 | 141 | pc.printf("Left:120\r\n"); |
IKobayashi | 0:c88c3b616c00 | 142 | } |
IKobayashi | 0:c88c3b616c00 | 143 | else if (-90 < dev && dev <= -60) { |
IKobayashi | 0:c88c3b616c00 | 144 | servo(90); |
IKobayashi | 0:c88c3b616c00 | 145 | fprintf(lo,"Left:90\r\n"); |
IKobayashi | 0:c88c3b616c00 | 146 | pc.printf("Left:90\r\n"); |
IKobayashi | 0:c88c3b616c00 | 147 | } |
IKobayashi | 0:c88c3b616c00 | 148 | else if (-60 < dev && dev <= -30) { |
IKobayashi | 0:c88c3b616c00 | 149 | servo(120); |
IKobayashi | 0:c88c3b616c00 | 150 | fprintf(lo,"Left:60\r\n"); |
IKobayashi | 0:c88c3b616c00 | 151 | pc.printf("Left:60\r\n"); |
IKobayashi | 0:c88c3b616c00 | 152 | } |
IKobayashi | 0:c88c3b616c00 | 153 | else if(-30 < dev && dev < 0) { |
IKobayashi | 0:c88c3b616c00 | 154 | servo(150); |
IKobayashi | 0:c88c3b616c00 | 155 | fprintf(lo,"Left:30\r\n"); |
IKobayashi | 0:c88c3b616c00 | 156 | pc.printf("Left:30\r\n"); |
IKobayashi | 0:c88c3b616c00 | 157 | } |
IKobayashi | 0:c88c3b616c00 | 158 | else if (dev == 0) { |
IKobayashi | 0:c88c3b616c00 | 159 | servo(0); |
IKobayashi | 0:c88c3b616c00 | 160 | fprintf(lo,"Straight\r\n"); |
IKobayashi | 0:c88c3b616c00 | 161 | pc.printf("Straight\r\n"); |
IKobayashi | 0:c88c3b616c00 | 162 | } |
IKobayashi | 0:c88c3b616c00 | 163 | else if (0 < dev && dev <= 30) { |
IKobayashi | 0:c88c3b616c00 | 164 | servo(30); |
IKobayashi | 0:c88c3b616c00 | 165 | fprintf(lo,"Right:30\r\n"); |
IKobayashi | 0:c88c3b616c00 | 166 | pc.printf("Right:30\r\n"); |
IKobayashi | 0:c88c3b616c00 | 167 | } |
IKobayashi | 0:c88c3b616c00 | 168 | else if (30 < dev && dev <= 60) { |
IKobayashi | 0:c88c3b616c00 | 169 | servo(60); |
IKobayashi | 0:c88c3b616c00 | 170 | fprintf(lo,"Right:60\r\n"); |
IKobayashi | 0:c88c3b616c00 | 171 | pc.printf("Right:60\r\n"); |
IKobayashi | 0:c88c3b616c00 | 172 | } |
IKobayashi | 0:c88c3b616c00 | 173 | else if (60 < dev && dev <= 90) { |
IKobayashi | 0:c88c3b616c00 | 174 | servo(90); |
IKobayashi | 0:c88c3b616c00 | 175 | fprintf(lo,"Right:90\r\n"); |
IKobayashi | 0:c88c3b616c00 | 176 | pc.printf("Right:90\r\n"); |
IKobayashi | 0:c88c3b616c00 | 177 | } |
IKobayashi | 0:c88c3b616c00 | 178 | else if (90 < dev && dev <= 120) { |
IKobayashi | 0:c88c3b616c00 | 179 | servo(120); |
IKobayashi | 0:c88c3b616c00 | 180 | fprintf(lo,"Right:120\r\n"); |
IKobayashi | 0:c88c3b616c00 | 181 | pc.printf("Right:120\r\n"); |
IKobayashi | 0:c88c3b616c00 | 182 | } |
IKobayashi | 0:c88c3b616c00 | 183 | else if (120 < dev && dev <= 150) { |
IKobayashi | 0:c88c3b616c00 | 184 | servo(150); |
IKobayashi | 0:c88c3b616c00 | 185 | fprintf(lo,"Right:150\r\n"); |
IKobayashi | 0:c88c3b616c00 | 186 | pc.printf("Right:150\r\n"); |
IKobayashi | 0:c88c3b616c00 | 187 | } |
IKobayashi | 0:c88c3b616c00 | 188 | else if (150 < dev && dev <= 180) { |
IKobayashi | 0:c88c3b616c00 | 189 | servo(180); |
IKobayashi | 0:c88c3b616c00 | 190 | fprintf(lo,"Right:180\r\n"); |
IKobayashi | 0:c88c3b616c00 | 191 | pc.printf("Right:180\r\n"); |
IKobayashi | 0:c88c3b616c00 | 192 | } |
IKobayashi | 0:c88c3b616c00 | 193 | fclose(lo); |
IKobayashi | 0:c88c3b616c00 | 194 | /* |
IKobayashi | 0:c88c3b616c00 | 195 | if (-0.1 < dhigh < 0.1) { |
IKobayashi | 0:c88c3b616c00 | 196 | k++; |
IKobayashi | 0:c88c3b616c00 | 197 | if (k >= 20) { |
IKobayashi | 0:c88c3b616c00 | 198 | break; |
IKobayashi | 0:c88c3b616c00 | 199 | } |
IKobayashi | 0:c88c3b616c00 | 200 | } |
IKobayashi | 0:c88c3b616c00 | 201 | else { |
IKobayashi | 0:c88c3b616c00 | 202 | k = 0; |
IKobayashi | 0:c88c3b616c00 | 203 | } |
IKobayashi | 0:c88c3b616c00 | 204 | */ |
IKobayashi | 0:c88c3b616c00 | 205 | } |
IKobayashi | 0:c88c3b616c00 | 206 | pc.printf("Cansat touchdown.....\r\n"); |
IKobayashi | 0:c88c3b616c00 | 207 | xbee.printf("Cansat touchdown.....\r\n"); |
IKobayashi | 0:c88c3b616c00 | 208 | fprintf(lo,"Cansat touchdown.....\r\n"); |
IKobayashi | 0:c88c3b616c00 | 209 | fclose(lo); |
IKobayashi | 0:c88c3b616c00 | 210 | while(true){ |
IKobayashi | 0:c88c3b616c00 | 211 | led4=!led4; |
IKobayashi | 0:c88c3b616c00 | 212 | } |
IKobayashi | 0:c88c3b616c00 | 213 | return 0; |
IKobayashi | 0:c88c3b616c00 | 214 | } |
IKobayashi | 0:c88c3b616c00 | 215 | |
IKobayashi | 0:c88c3b616c00 | 216 | void ini(){ |
IKobayashi | 0:c88c3b616c00 | 217 | //accelermeter initialization |
IKobayashi | 0:c88c3b616c00 | 218 | accelerometer.setPowerControl(0x00); //Go into standby mode to configure the device. |
IKobayashi | 0:c88c3b616c00 | 219 | accelerometer.setDataFormatControl(0x0B); //Full resolution, +/-16g, 4mg/LSB. |
IKobayashi | 0:c88c3b616c00 | 220 | accelerometer.setDataRate(ADXL345_3200HZ); //3.2kHz data rate. |
IKobayashi | 0:c88c3b616c00 | 221 | accelerometer.setPowerControl(0x08); //Measurement mode. |
IKobayashi | 0:c88c3b616c00 | 222 | pc.printf("All sensor is initialized\r\n"); |
IKobayashi | 0:c88c3b616c00 | 223 | xbee.printf("All sensor is initialized\r\n"); |
IKobayashi | 0:c88c3b616c00 | 224 | fprintf(lo,"All sensor is initialized\r\n"); |
IKobayashi | 0:c88c3b616c00 | 225 | } |
IKobayashi | 0:c88c3b616c00 | 226 | |
IKobayashi | 0:c88c3b616c00 | 227 | void FP(){ |
IKobayashi | 0:c88c3b616c00 | 228 | flight_pin = true; |
IKobayashi | 0:c88c3b616c00 | 229 | } |
IKobayashi | 0:c88c3b616c00 | 230 | |
IKobayashi | 0:c88c3b616c00 | 231 | void getGPS() { |
IKobayashi | 0:c88c3b616c00 | 232 | |
IKobayashi | 0:c88c3b616c00 | 233 | c = gps.getc(); |
IKobayashi | 0:c88c3b616c00 | 234 | if( c=='$' || i == 256){ |
IKobayashi | 0:c88c3b616c00 | 235 | mode = 0; |
IKobayashi | 0:c88c3b616c00 | 236 | i = 0; |
IKobayashi | 0:c88c3b616c00 | 237 | for(int j=0; j<256; j++){ |
IKobayashi | 0:c88c3b616c00 | 238 | gps_data[j]=NULL; |
IKobayashi | 0:c88c3b616c00 | 239 | } |
IKobayashi | 0:c88c3b616c00 | 240 | } |
IKobayashi | 0:c88c3b616c00 | 241 | if(mode==0){ |
IKobayashi | 0:c88c3b616c00 | 242 | if((gps_data[i]=c) != '\r'){ |
IKobayashi | 0:c88c3b616c00 | 243 | i++; |
IKobayashi | 0:c88c3b616c00 | 244 | }else{ |
IKobayashi | 0:c88c3b616c00 | 245 | gps_data[i]='\0'; |
IKobayashi | 0:c88c3b616c00 | 246 | |
IKobayashi | 0:c88c3b616c00 | 247 | if( sscanf(gps_data, "$GPGGA,%f,%f,%c,%f,%c,%d,%d",&w_time,&hokui,&ns,&tokei,&ew,&rlock,&num) >= 1){ |
IKobayashi | 0:c88c3b616c00 | 248 | led1=!led1; |
IKobayashi | 0:c88c3b616c00 | 249 | if(rlock==1){ |
IKobayashi | 0:c88c3b616c00 | 250 | //pc.printf("Status:Lock(%d)\n\r",rlock); |
IKobayashi | 0:c88c3b616c00 | 251 | //logitude |
IKobayashi | 0:c88c3b616c00 | 252 | // d_tokei= int(tokei/100); |
IKobayashi | 0:c88c3b616c00 | 253 | // m_tokei= (tokei-d_tokei*100)/60; |
IKobayashi | 0:c88c3b616c00 | 254 | // g_tokei= d_tokei+m_tokei; |
IKobayashi | 0:c88c3b616c00 | 255 | //Latitude |
IKobayashi | 0:c88c3b616c00 | 256 | // d_hokui=int(hokui/100); |
IKobayashi | 0:c88c3b616c00 | 257 | // m_hokui=(hokui-d_hokui*100)/60; |
IKobayashi | 0:c88c3b616c00 | 258 | // g_hokui=d_hokui+m_hokui; |
IKobayashi | 0:c88c3b616c00 | 259 | pc.printf("Lon:%.6f, Lat:%.6f, num:%d\n\r",tokei, hokui, num); |
IKobayashi | 0:c88c3b616c00 | 260 | xbee.printf("Lon:%.6f, Lat:%.6f, num:%d\n\r",tokei, hokui, num); |
IKobayashi | 0:c88c3b616c00 | 261 | gpsdata[0] = (double)w_time; |
IKobayashi | 0:c88c3b616c00 | 262 | gpsdata[2] = (double)tokei; |
IKobayashi | 0:c88c3b616c00 | 263 | gpsdata[1] = (double)hokui; |
IKobayashi | 0:c88c3b616c00 | 264 | gpsdata[3] = (double)num; |
IKobayashi | 0:c88c3b616c00 | 265 | gp = true; |
IKobayashi | 0:c88c3b616c00 | 266 | } |
IKobayashi | 0:c88c3b616c00 | 267 | else{ |
IKobayashi | 0:c88c3b616c00 | 268 | // pc.printf("\n\rStatus:unLock(%d)\n\r",rlock); |
IKobayashi | 0:c88c3b616c00 | 269 | pc.printf("%s\r\n",gps_data); |
IKobayashi | 0:c88c3b616c00 | 270 | //xbee.printf("\n\rStatus:unLock(%d)\n\r",rlock); |
IKobayashi | 0:c88c3b616c00 | 271 | xbee.printf("%s\r\n",gps_data); |
IKobayashi | 0:c88c3b616c00 | 272 | // gp = true; |
IKobayashi | 0:c88c3b616c00 | 273 | } |
IKobayashi | 0:c88c3b616c00 | 274 | sprintf(gps_data, ""); |
IKobayashi | 0:c88c3b616c00 | 275 | }//if |
IKobayashi | 0:c88c3b616c00 | 276 | } |
IKobayashi | 0:c88c3b616c00 | 277 | } |
IKobayashi | 0:c88c3b616c00 | 278 | } |
IKobayashi | 0:c88c3b616c00 | 279 | |
IKobayashi | 0:c88c3b616c00 | 280 | void getdata(double *aldata, double acdata[], double mgdata[]){ |
IKobayashi | 0:c88c3b616c00 | 281 | led2=!led2; |
IKobayashi | 0:c88c3b616c00 | 282 | int readings[3]; |
IKobayashi | 0:c88c3b616c00 | 283 | *aldata = ms5607.getAltitude(); |
IKobayashi | 0:c88c3b616c00 | 284 | accelerometer.getOutput(readings); |
IKobayashi | 0:c88c3b616c00 | 285 | acdata[0] = (int16_t)readings[1]*0.039; |
IKobayashi | 0:c88c3b616c00 | 286 | acdata[1] = (int16_t)readings[0]*0.039*(-1); |
IKobayashi | 0:c88c3b616c00 | 287 | acdata[2] = (int16_t)readings[2]*0.039; |
IKobayashi | 0:c88c3b616c00 | 288 | mgdata[0] = (double)hmc5883l.getMy(); |
IKobayashi | 0:c88c3b616c00 | 289 | mgdata[1] = (double)hmc5883l.getMx()*(-1); |
IKobayashi | 0:c88c3b616c00 | 290 | mgdata[2] = (double)hmc5883l.getMz(); |
IKobayashi | 0:c88c3b616c00 | 291 | } |
IKobayashi | 0:c88c3b616c00 | 292 | void correction(double ac[], double mg[], double delta[2]) { |
IKobayashi | 0:c88c3b616c00 | 293 | double Hx, Hy, r, p; |
IKobayashi | 0:c88c3b616c00 | 294 | if ((-1 < ac[0])&&(ac[0] < 1) && (-1 < (ac[1] / sqrt(1 - ac[0] * ac[0])))&&((ac[1] / sqrt(1 - ac[0] * ac[0])) < 1)) { |
IKobayashi | 0:c88c3b616c00 | 295 | led3=!led3; |
IKobayashi | 0:c88c3b616c00 | 296 | r = asin(ac[0]); |
IKobayashi | 0:c88c3b616c00 | 297 | p = asin(ac[1] / sqrt(1 - ac[0] * ac[0])); |
IKobayashi | 0:c88c3b616c00 | 298 | Hx = cos(r) * mg[0] + sin(p) * sin(r) * mg[1] - cos(p) * sin(r) * mg[2]; |
IKobayashi | 0:c88c3b616c00 | 299 | Hy = cos(p) * mg[1] + sin(p) * mg[2]; |
IKobayashi | 0:c88c3b616c00 | 300 | delta[0]=Hx; |
IKobayashi | 0:c88c3b616c00 | 301 | delta[1]=Hy; |
IKobayashi | 0:c88c3b616c00 | 302 | /* |
IKobayashi | 0:c88c3b616c00 | 303 | *delta = atan2(Hy, Hx); |
IKobayashi | 0:c88c3b616c00 | 304 | if (*delta < 0) |
IKobayashi | 0:c88c3b616c00 | 305 | *delta += 2 * PI; |
IKobayashi | 0:c88c3b616c00 | 306 | if (*delta > 2 * PI) |
IKobayashi | 0:c88c3b616c00 | 307 | *delta -= 2 * PI; |
IKobayashi | 0:c88c3b616c00 | 308 | *delta = *delta * 180 / PI; |
IKobayashi | 0:c88c3b616c00 | 309 | */ |
IKobayashi | 0:c88c3b616c00 | 310 | } |
IKobayashi | 0:c88c3b616c00 | 311 | } |
IKobayashi | 0:c88c3b616c00 | 312 | |
IKobayashi | 0:c88c3b616c00 | 313 | void servo(float x) { |
IKobayashi | 0:c88c3b616c00 | 314 | |
IKobayashi | 0:c88c3b616c00 | 315 | float y; |
IKobayashi | 0:c88c3b616c00 | 316 | y = 0.000284*(x / 30) + 0.0007; //left |
IKobayashi | 0:c88c3b616c00 | 317 | |
IKobayashi | 0:c88c3b616c00 | 318 | if (dev < 0) { |
IKobayashi | 0:c88c3b616c00 | 319 | servoLeft.pulsewidth(y); |
IKobayashi | 0:c88c3b616c00 | 320 | } |
IKobayashi | 0:c88c3b616c00 | 321 | else if(dev == 0){ |
IKobayashi | 0:c88c3b616c00 | 322 | servoLeft.pulsewidth(y+0.000284*(180 / 30)); |
IKobayashi | 0:c88c3b616c00 | 323 | servoRight.pulsewidth(y); |
IKobayashi | 0:c88c3b616c00 | 324 | } |
IKobayashi | 0:c88c3b616c00 | 325 | else { |
IKobayashi | 0:c88c3b616c00 | 326 | servoRight.pulsewidth(y); |
IKobayashi | 0:c88c3b616c00 | 327 | } |
IKobayashi | 0:c88c3b616c00 | 328 | |
IKobayashi | 0:c88c3b616c00 | 329 | } |
IKobayashi | 0:c88c3b616c00 | 330 | void dev_calc(double exam[], double *s, double *t) { |
IKobayashi | 0:c88c3b616c00 | 331 | double nowdir; |
IKobayashi | 0:c88c3b616c00 | 332 | nowdir = atan(exam[1] / exam[0]); |
IKobayashi | 0:c88c3b616c00 | 333 | if(nowdir < 0)nowdir += 2*PI; |
IKobayashi | 0:c88c3b616c00 | 334 | if(nowdir > 2*PI)nowdir -= 2*PI; |
IKobayashi | 0:c88c3b616c00 | 335 | nowdir = nowdir * 180 / PI; |
IKobayashi | 0:c88c3b616c00 | 336 | if (*s > nowdir) { |
IKobayashi | 0:c88c3b616c00 | 337 | if ((180 - (*s - nowdir)) < 0) { |
IKobayashi | 0:c88c3b616c00 | 338 | *t = *s - nowdir - 360; //dir_lati_longi:*s dev;*t |
IKobayashi | 0:c88c3b616c00 | 339 | } |
IKobayashi | 0:c88c3b616c00 | 340 | else { |
IKobayashi | 0:c88c3b616c00 | 341 | *t = *s - nowdir; |
IKobayashi | 0:c88c3b616c00 | 342 | } |
IKobayashi | 0:c88c3b616c00 | 343 | } |
IKobayashi | 0:c88c3b616c00 | 344 | else { |
IKobayashi | 0:c88c3b616c00 | 345 | if ((180 - (nowdir - *s)) < 0) { |
IKobayashi | 0:c88c3b616c00 | 346 | *t = 360 - nowdir + *s; |
IKobayashi | 0:c88c3b616c00 | 347 | } |
IKobayashi | 0:c88c3b616c00 | 348 | else { |
IKobayashi | 0:c88c3b616c00 | 349 | *t = *s - nowdir; |
IKobayashi | 0:c88c3b616c00 | 350 | } |
IKobayashi | 0:c88c3b616c00 | 351 | } |
IKobayashi | 0:c88c3b616c00 | 352 | pc.printf("%lf\r\n",*t); |
IKobayashi | 0:c88c3b616c00 | 353 | } |
IKobayashi | 0:c88c3b616c00 | 354 | void calc_dir_lati_longi(double newl[], double *result) { |
IKobayashi | 0:c88c3b616c00 | 355 | double diflongi, diflati; //difference |
IKobayashi | 0:c88c3b616c00 | 356 | diflati = (goallat) - newl[1]; //difference |
IKobayashi | 0:c88c3b616c00 | 357 | diflongi = (goallon) - newl[2]; |
IKobayashi | 0:c88c3b616c00 | 358 | if(diflongi == 0 && diflati >= 0)*result = 0; |
IKobayashi | 0:c88c3b616c00 | 359 | else if(diflongi == 0 && diflati < 0)*result = 180; |
IKobayashi | 0:c88c3b616c00 | 360 | else if(diflongi > 0 && diflati == 0)*result = 90; |
IKobayashi | 0:c88c3b616c00 | 361 | else if(diflongi < 0 && diflati == 0)*result = 270; |
IKobayashi | 0:c88c3b616c00 | 362 | else if (diflongi >= 0 && diflati >= 0) { //1 |
IKobayashi | 0:c88c3b616c00 | 363 | *result = atan(diflongi / diflati) * 180 / PI; |
IKobayashi | 0:c88c3b616c00 | 364 | } |
IKobayashi | 0:c88c3b616c00 | 365 | else if (diflongi >= 0 && diflati < 0) { //4 |
IKobayashi | 0:c88c3b616c00 | 366 | *result = atan(diflongi / diflati) * 180 / PI + 180; |
IKobayashi | 0:c88c3b616c00 | 367 | } |
IKobayashi | 0:c88c3b616c00 | 368 | else if (diflongi < 0 && diflati >= 0) { //2 |
IKobayashi | 0:c88c3b616c00 | 369 | *result = atan(diflongi / diflati) * 180 / PI + 360; |
IKobayashi | 0:c88c3b616c00 | 370 | } |
IKobayashi | 0:c88c3b616c00 | 371 | else if (diflongi < 0 && diflati < 0) { //3 |
IKobayashi | 0:c88c3b616c00 | 372 | *result = atan(diflongi / diflati) * 180 / PI + 180; |
IKobayashi | 0:c88c3b616c00 | 373 | } |
IKobayashi | 0:c88c3b616c00 | 374 | } |