修正済みby皆川
Dependencies: mbed Servo cansat_integrated_2 BMP180
Dependents: cansat_integrated_2
main.cpp@0:e7b7def631c2, 2021-10-21 (annotated)
- Committer:
- minanao
- Date:
- Thu Oct 21 01:58:35 2021 +0000
- Revision:
- 0:e7b7def631c2
- Child:
- 1:bb89b58cfa0e
integrated program
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
minanao | 0:e7b7def631c2 | 1 | #include "mbed.h" |
minanao | 0:e7b7def631c2 | 2 | #include "BMP180.h" |
minanao | 0:e7b7def631c2 | 3 | #include "getGPS.h" |
minanao | 0:e7b7def631c2 | 4 | #include "Servo.h" |
minanao | 0:e7b7def631c2 | 5 | #include "calculate.h" |
minanao | 0:e7b7def631c2 | 6 | #include "MPU9250.h" |
minanao | 0:e7b7def631c2 | 7 | #define PIN_SDA D4 |
minanao | 0:e7b7def631c2 | 8 | #define PIN_SCL D5 |
minanao | 0:e7b7def631c2 | 9 | #define STOPTIME 1 |
minanao | 0:e7b7def631c2 | 10 | #define GOTIME 5 |
minanao | 0:e7b7def631c2 | 11 | #define ROTATETIME 1 |
minanao | 0:e7b7def631c2 | 12 | |
minanao | 0:e7b7def631c2 | 13 | |
minanao | 0:e7b7def631c2 | 14 | Serial xbee(PA_9, PA_10); |
minanao | 0:e7b7def631c2 | 15 | GPS gps(PA_2,PA_3); |
minanao | 0:e7b7def631c2 | 16 | DigitalOut Nichrome(A6); |
minanao | 0:e7b7def631c2 | 17 | BMP180 bmp180(PIN_SDA,PIN_SCL); |
minanao | 0:e7b7def631c2 | 18 | MPU9250 mpu9250(D4, D5); |
minanao | 0:e7b7def631c2 | 19 | Servo myservo1(D7); |
minanao | 0:e7b7def631c2 | 20 | Servo myservo2(A3); |
minanao | 0:e7b7def631c2 | 21 | Servo myservo3(A1); |
minanao | 0:e7b7def631c2 | 22 | Servo myservo4(D12); |
minanao | 0:e7b7def631c2 | 23 | Servo myservo5(D10); |
minanao | 0:e7b7def631c2 | 24 | Servo myservo6(A5); |
minanao | 0:e7b7def631c2 | 25 | double bias_la=0,bias_lo=0; |
minanao | 0:e7b7def631c2 | 26 | |
minanao | 0:e7b7def631c2 | 27 | int landing_judgement(){ |
minanao | 0:e7b7def631c2 | 28 | bmp180.Initialize(27,0); |
minanao | 0:e7b7def631c2 | 29 | int i,n1,n2,landing_judgement; |
minanao | 0:e7b7def631c2 | 30 | float dt,dp,h,dp0,a,b,dt_ave,dp_ave; |
minanao | 0:e7b7def631c2 | 31 | for(i=0;i<15;i++){ |
minanao | 0:e7b7def631c2 | 32 | if(bmp180.ReadData(&dt,&dp)){ |
minanao | 0:e7b7def631c2 | 33 | a = a + dp; |
minanao | 0:e7b7def631c2 | 34 | b = b + dt; |
minanao | 0:e7b7def631c2 | 35 | n1 = n1 + 1; |
minanao | 0:e7b7def631c2 | 36 | n2 = n2 + 1; |
minanao | 0:e7b7def631c2 | 37 | wait(1); |
minanao | 0:e7b7def631c2 | 38 | } |
minanao | 0:e7b7def631c2 | 39 | } |
minanao | 0:e7b7def631c2 | 40 | |
minanao | 0:e7b7def631c2 | 41 | dp_ave = a / n1; |
minanao | 0:e7b7def631c2 | 42 | dt_ave = b / n2; |
minanao | 0:e7b7def631c2 | 43 | dp0 = calculate_dp0(dp_ave,dt_ave); |
minanao | 0:e7b7def631c2 | 44 | int x,y; |
minanao | 0:e7b7def631c2 | 45 | while(x<10){ |
minanao | 0:e7b7def631c2 | 46 | if(bmp180.ReadData(&dt,&dp)){ |
minanao | 0:e7b7def631c2 | 47 | h = calculate_h(dp0,dp,dt); |
minanao | 0:e7b7def631c2 | 48 | if(h >= 30){ |
minanao | 0:e7b7def631c2 | 49 | x = x + 1; |
minanao | 0:e7b7def631c2 | 50 | } |
minanao | 0:e7b7def631c2 | 51 | wait(1); |
minanao | 0:e7b7def631c2 | 52 | } |
minanao | 0:e7b7def631c2 | 53 | } |
minanao | 0:e7b7def631c2 | 54 | //10秒以上高度30mにいた場合離陸判定 |
minanao | 0:e7b7def631c2 | 55 | |
minanao | 0:e7b7def631c2 | 56 | wait(10); |
minanao | 0:e7b7def631c2 | 57 | |
minanao | 0:e7b7def631c2 | 58 | while(y<10){ |
minanao | 0:e7b7def631c2 | 59 | if(bmp180.ReadData(&dt,&dp)){ |
minanao | 0:e7b7def631c2 | 60 | h = calculate_h(dp0,dp,dt); |
minanao | 0:e7b7def631c2 | 61 | if(h <= 10){ |
minanao | 0:e7b7def631c2 | 62 | y = y + 1; |
minanao | 0:e7b7def631c2 | 63 | } |
minanao | 0:e7b7def631c2 | 64 | wait(1); |
minanao | 0:e7b7def631c2 | 65 | } |
minanao | 0:e7b7def631c2 | 66 | } |
minanao | 0:e7b7def631c2 | 67 | |
minanao | 0:e7b7def631c2 | 68 | wait(5); |
minanao | 0:e7b7def631c2 | 69 | |
minanao | 0:e7b7def631c2 | 70 | landing_judgement = landing_judgement + 1; |
minanao | 0:e7b7def631c2 | 71 | return landing_judgement; |
minanao | 0:e7b7def631c2 | 72 | |
minanao | 0:e7b7def631c2 | 73 | //離陸判定後、10秒以上高度10m以下にいた場合着地判定 |
minanao | 0:e7b7def631c2 | 74 | |
minanao | 0:e7b7def631c2 | 75 | } |
minanao | 0:e7b7def631c2 | 76 | |
minanao | 0:e7b7def631c2 | 77 | |
minanao | 0:e7b7def631c2 | 78 | //止まる |
minanao | 0:e7b7def631c2 | 79 | void stop() |
minanao | 0:e7b7def631c2 | 80 | { |
minanao | 0:e7b7def631c2 | 81 | myservo1 = 0.5; |
minanao | 0:e7b7def631c2 | 82 | myservo2 = 0.5; |
minanao | 0:e7b7def631c2 | 83 | myservo3 = 0.5; |
minanao | 0:e7b7def631c2 | 84 | myservo4 = 0.5; |
minanao | 0:e7b7def631c2 | 85 | myservo5 = 0.5; |
minanao | 0:e7b7def631c2 | 86 | myservo6 = 0.5; |
minanao | 0:e7b7def631c2 | 87 | wait(STOPTIME); |
minanao | 0:e7b7def631c2 | 88 | } |
minanao | 0:e7b7def631c2 | 89 | |
minanao | 0:e7b7def631c2 | 90 | //前進 |
minanao | 0:e7b7def631c2 | 91 | void move_forward() |
minanao | 0:e7b7def631c2 | 92 | { |
minanao | 0:e7b7def631c2 | 93 | myservo1 = 0; |
minanao | 0:e7b7def631c2 | 94 | myservo2 = 0; |
minanao | 0:e7b7def631c2 | 95 | myservo3 = 0; |
minanao | 0:e7b7def631c2 | 96 | myservo4 = 0; |
minanao | 0:e7b7def631c2 | 97 | myservo5 = 0; |
minanao | 0:e7b7def631c2 | 98 | myservo6 = 0; |
minanao | 0:e7b7def631c2 | 99 | wait(GOTIME); |
minanao | 0:e7b7def631c2 | 100 | } |
minanao | 0:e7b7def631c2 | 101 | |
minanao | 0:e7b7def631c2 | 102 | //後退 |
minanao | 0:e7b7def631c2 | 103 | void move_backward() |
minanao | 0:e7b7def631c2 | 104 | { |
minanao | 0:e7b7def631c2 | 105 | myservo1 = 1; |
minanao | 0:e7b7def631c2 | 106 | myservo2 = 1; |
minanao | 0:e7b7def631c2 | 107 | myservo3 = 1; |
minanao | 0:e7b7def631c2 | 108 | myservo4 = 1; |
minanao | 0:e7b7def631c2 | 109 | myservo5 = 1; |
minanao | 0:e7b7def631c2 | 110 | myservo6 = 1; |
minanao | 0:e7b7def631c2 | 111 | wait(GOTIME); |
minanao | 0:e7b7def631c2 | 112 | } |
minanao | 0:e7b7def631c2 | 113 | |
minanao | 0:e7b7def631c2 | 114 | //右に曲がる |
minanao | 0:e7b7def631c2 | 115 | void turn_right() |
minanao | 0:e7b7def631c2 | 116 | { |
minanao | 0:e7b7def631c2 | 117 | myservo1 = 1; |
minanao | 0:e7b7def631c2 | 118 | myservo2 = 1; |
minanao | 0:e7b7def631c2 | 119 | myservo3 = 1; |
minanao | 0:e7b7def631c2 | 120 | myservo4 = 0; |
minanao | 0:e7b7def631c2 | 121 | myservo5 = 0; |
minanao | 0:e7b7def631c2 | 122 | myservo6 = 0; |
minanao | 0:e7b7def631c2 | 123 | wait(ROTATETIME); |
minanao | 0:e7b7def631c2 | 124 | } |
minanao | 0:e7b7def631c2 | 125 | |
minanao | 0:e7b7def631c2 | 126 | //左に曲がる |
minanao | 0:e7b7def631c2 | 127 | void turn_left() |
minanao | 0:e7b7def631c2 | 128 | { |
minanao | 0:e7b7def631c2 | 129 | myservo1 = 0; |
minanao | 0:e7b7def631c2 | 130 | myservo2 = 0; |
minanao | 0:e7b7def631c2 | 131 | myservo3 = 0; |
minanao | 0:e7b7def631c2 | 132 | myservo4 = 1; |
minanao | 0:e7b7def631c2 | 133 | myservo5 = 1; |
minanao | 0:e7b7def631c2 | 134 | myservo6 = 1; |
minanao | 0:e7b7def631c2 | 135 | wait(ROTATETIME); |
minanao | 0:e7b7def631c2 | 136 | } |
minanao | 0:e7b7def631c2 | 137 | |
minanao | 0:e7b7def631c2 | 138 | //倒れているときの処理 |
minanao | 0:e7b7def631c2 | 139 | void wakeup(int time) |
minanao | 0:e7b7def631c2 | 140 | { |
minanao | 0:e7b7def631c2 | 141 | int i; |
minanao | 0:e7b7def631c2 | 142 | for(i=1;i<=time;i++) |
minanao | 0:e7b7def631c2 | 143 | { |
minanao | 0:e7b7def631c2 | 144 | move_forward() |
minanao | 0:e7b7def631c2 | 145 | move_backward() |
minanao | 0:e7b7def631c2 | 146 | turn_right() |
minanao | 0:e7b7def631c2 | 147 | turn_left() |
minanao | 0:e7b7def631c2 | 148 | } |
minanao | 0:e7b7def631c2 | 149 | } |
minanao | 0:e7b7def631c2 | 150 | |
minanao | 0:e7b7def631c2 | 151 | |
minanao | 0:e7b7def631c2 | 152 | |
minanao | 0:e7b7def631c2 | 153 | float calculation_sita(float x_0,float y_0,float x_1,float y_1,float x,float y){ |
minanao | 0:e7b7def631c2 | 154 | //x,yは地磁気センサの値で北の方角の角度を90度、東の方角を0度とする。 |
minanao | 0:e7b7def631c2 | 155 | float sita_0 = atan((y_0 - y_1)/(x_0 - x_1)); //目的地の角度 |
minanao | 0:e7b7def631c2 | 156 | |
minanao | 0:e7b7def631c2 | 157 | if(y_0 - y_1 > 0 && x_0 - x_1 < 0){ |
minanao | 0:e7b7def631c2 | 158 | sita_0 = sita_0 - 180; |
minanao | 0:e7b7def631c2 | 159 | } |
minanao | 0:e7b7def631c2 | 160 | if(y_0 - y_1 < 0 && x_0 - x_1 < 0){ |
minanao | 0:e7b7def631c2 | 161 | sita_0 = sita_0 + 180; |
minanao | 0:e7b7def631c2 | 162 | } |
minanao | 0:e7b7def631c2 | 163 | |
minanao | 0:e7b7def631c2 | 164 | float Omag_x=0,Omag_y=0; //地磁気センサのxy平面が描く円の中点 |
minanao | 0:e7b7def631c2 | 165 | float sita_1 = atan((y - Omag_y)/(x- Omag_x)); //CanSatの角度 |
minanao | 0:e7b7def631c2 | 166 | |
minanao | 0:e7b7def631c2 | 167 | if(y - Omag_y > 0 && x- Omag_x < 0){ |
minanao | 0:e7b7def631c2 | 168 | sita_1 = sita_1 - 180; |
minanao | 0:e7b7def631c2 | 169 | } |
minanao | 0:e7b7def631c2 | 170 | if(y - Omag_y < 0 && x - Omag_x < 0){ |
minanao | 0:e7b7def631c2 | 171 | sita_1 = sita_1 + 180; |
minanao | 0:e7b7def631c2 | 172 | } |
minanao | 0:e7b7def631c2 | 173 | float sita |
minanao | 0:e7b7def631c2 | 174 | sita= sita_0 - sita_1; //CanSatから見た目的地の角度 |
minanao | 0:e7b7def631c2 | 175 | return sita |
minanao | 0:e7b7def631c2 | 176 | } |
minanao | 0:e7b7def631c2 | 177 | |
minanao | 0:e7b7def631c2 | 178 | |
minanao | 0:e7b7def631c2 | 179 | |
minanao | 0:e7b7def631c2 | 180 | int parachute_separation() |
minanao | 0:e7b7def631c2 | 181 | { |
minanao | 0:e7b7def631c2 | 182 | Nichrome=1; |
minanao | 0:e7b7def631c2 | 183 | wait(10); |
minanao | 0:e7b7def631c2 | 184 | Nichrome=0; |
minanao | 0:e7b7def631c2 | 185 | return 0; |
minanao | 0:e7b7def631c2 | 186 | } |
minanao | 0:e7b7def631c2 | 187 | |
minanao | 0:e7b7def631c2 | 188 | int end_flag=0; |
minanao | 0:e7b7def631c2 | 189 | double bias_la=0,bias_lo=0; |
minanao | 0:e7b7def631c2 | 190 | |
minanao | 0:e7b7def631c2 | 191 | |
minanao | 0:e7b7def631c2 | 192 | |
minanao | 0:e7b7def631c2 | 193 | int main(void) |
minanao | 0:e7b7def631c2 | 194 | { |
minanao | 0:e7b7def631c2 | 195 | int land_judgement_1=0,sep_judge=1; |
minanao | 0:e7b7def631c2 | 196 | //着地判定 |
minanao | 0:e7b7def631c2 | 197 | while(1) |
minanao | 0:e7b7def631c2 | 198 | { |
minanao | 0:e7b7def631c2 | 199 | land_judgement=landing_judgement() |
minanao | 0:e7b7def631c2 | 200 | if(land_judgement_1==1) |
minanao | 0:e7b7def631c2 | 201 | { |
minanao | 0:e7b7def631c2 | 202 | xbee.printf("landing\r\n"); |
minanao | 0:e7b7def631c2 | 203 | break; |
minanao | 0:e7b7def631c2 | 204 | } |
minanao | 0:e7b7def631c2 | 205 | } |
minanao | 0:e7b7def631c2 | 206 | wait(30); |
minanao | 0:e7b7def631c2 | 207 | //パラシュート切り離し |
minanao | 0:e7b7def631c2 | 208 | while(1) |
minanao | 0:e7b7def631c2 | 209 | { |
minanao | 0:e7b7def631c2 | 210 | sep_judge==1; |
minanao | 0:e7b7def631c2 | 211 | sep_judge=parachute_separation(); |
minanao | 0:e7b7def631c2 | 212 | if(sep_judge==0) |
minanao | 0:e7b7def631c2 | 213 | { |
minanao | 0:e7b7def631c2 | 214 | xbee.printf("did separation\r\n"); |
minanao | 0:e7b7def631c2 | 215 | xbee.printf("separation complleted?\ty/n") |
minanao | 0:e7b7def631c2 | 216 | int received_data = xbee.getc(); |
minanao | 0:e7b7def631c2 | 217 | if(received_data==89||received_data==121) |
minanao | 0:e7b7def631c2 | 218 | { |
minanao | 0:e7b7def631c2 | 219 | xbee.printf("separation complieted\n\r"); |
minanao | 0:e7b7def631c2 | 220 | break; |
minanao | 0:e7b7def631c2 | 221 | } |
minanao | 0:e7b7def631c2 | 222 | if(received_data==78||received_data==110) |
minanao | 0:e7b7def631c2 | 223 | { |
minanao | 0:e7b7def631c2 | 224 | xbee.printf("try again now\n\r"); |
minanao | 0:e7b7def631c2 | 225 | } |
minanao | 0:e7b7def631c2 | 226 | } |
minanao | 0:e7b7def631c2 | 227 | } |
minanao | 0:e7b7def631c2 | 228 | //中間座標の取得 |
minanao | 0:e7b7def631c2 | 229 | double midpoint_latitude,midpoint_longtitude; |
minanao | 0:e7b7def631c2 | 230 | xbee.printf("\r\n-----------------------\r\n"); |
minanao | 0:e7b7def631c2 | 231 | xbee.printf("midpoint latitude:"); |
minanao | 0:e7b7def631c2 | 232 | xbee.scanf("%lf",&midpoint_latitude); |
minanao | 0:e7b7def631c2 | 233 | xbee.printf("\r\nmidpoint longtitude:"); |
minanao | 0:e7b7def631c2 | 234 | xbee.scanf("%lf",&midpoint_longtitude); |
minanao | 0:e7b7def631c2 | 235 | xbee.printf("\r\n-----------------------\r\n"); |
minanao | 0:e7b7def631c2 | 236 | //倒れているかの判定 |
minanao | 0:e7b7def631c2 | 237 | int i; |
minanao | 0:e7b7def631c2 | 238 | gps |
minanao | 0:e7b7def631c2 | 239 | for(i=1;i<=2;i++) |
minanao | 0:e7b7def631c2 | 240 | { |
minanao | 0:e7b7def631c2 | 241 | move_forward(); |
minanao | 0:e7b7def631c2 | 242 | } |
minanao | 0:e7b7def631c2 | 243 | |
minanao | 0:e7b7def631c2 | 244 | |
minanao | 0:e7b7def631c2 | 245 | move_forward(); |
minanao | 0:e7b7def631c2 | 246 | |
minanao | 0:e7b7def631c2 | 247 | //倒れているときの処理 |
minanao | 0:e7b7def631c2 | 248 | wakeup(2) |
minanao | 0:e7b7def631c2 | 249 | |
minanao | 0:e7b7def631c2 | 250 | |
minanao | 0:e7b7def631c2 | 251 | # |
minanao | 0:e7b7def631c2 | 252 | } |
minanao | 0:e7b7def631c2 | 253 | |
minanao | 0:e7b7def631c2 | 254 | |
minanao | 0:e7b7def631c2 | 255 |