Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
main.cpp@9:ec770f68440e, 2019-12-08 (annotated)
- Committer:
- KINU
- Date:
- Sun Dec 08 13:38:35 2019 +0000
- Revision:
- 9:ec770f68440e
- Parent:
- 8:765a73e21907
- Child:
- 10:b190babac114
CanSatB_main_1208
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
YUPPY | 0:6212b283430c | 1 | #define cansatB |
YUPPY | 7:fae874e898b3 | 2 | #include "mbed.h" |
YUPPY | 7:fae874e898b3 | 3 | //mbed |
YUPPY | 7:fae874e898b3 | 4 | #include "getGPS.h" |
YUPPY | 7:fae874e898b3 | 5 | #include "math.h" |
YUPPY | 7:fae874e898b3 | 6 | //GPS |
YUPPY | 7:fae874e898b3 | 7 | #include "TB6612.h" |
YUPPY | 7:fae874e898b3 | 8 | //motorDriver |
YUPPY | 7:fae874e898b3 | 9 | #include "JPEGCamera.h" |
YUPPY | 7:fae874e898b3 | 10 | //カメラ |
YUPPY | 0:6212b283430c | 11 | #include <stdio.h> |
YUPPY | 7:fae874e898b3 | 12 | #include <base64.h> |
YUPPY | 7:fae874e898b3 | 13 | //XBee |
YUPPY | 7:fae874e898b3 | 14 | #include "us015.h" |
YUPPY | 7:fae874e898b3 | 15 | // 超音波センサ |
YUPPY | 7:fae874e898b3 | 16 | |
YUPPY | 7:fae874e898b3 | 17 | |
YUPPY | 2:e2b803e3bcbc | 18 | GPS gps (p28,p27); //GPS |
YUPPY | 4:1354e56c7dd3 | 19 | |
YUPPY | 2:e2b803e3bcbc | 20 | DigitalOut FET(p21); //FET |
YUPPY | 7:fae874e898b3 | 21 | DigitalOut myled(LED1); |
YUPPY | 7:fae874e898b3 | 22 | US015 hs(p12,p11); |
YUPPY | 7:fae874e898b3 | 23 | DigitalIn thermo(p20); |
YUPPY | 7:fae874e898b3 | 24 | DigitalOut Sb612switch(p15); //焦電スイッチ |
YUPPY | 4:1354e56c7dd3 | 25 | DigitalOut Ultra(p12); |
YUPPY | 7:fae874e898b3 | 26 | Serial pc(USBTX,USBRX); // tx, rx |
YUPPY | 7:fae874e898b3 | 27 | JPEGCamera camera(p9, p10); // TX, RX |
YUPPY | 7:fae874e898b3 | 28 | TB6612 left1(p25,p17,p16); //モーターピン |
YUPPY | 7:fae874e898b3 | 29 | TB6612 right1(p26,p19,p18); //モーターピン |
YUPPY | 7:fae874e898b3 | 30 | Serial xbee(p13,p14); //xbee |
YUPPY | 2:e2b803e3bcbc | 31 | |
YUPPY | 7:fae874e898b3 | 32 | |
YUPPY | 7:fae874e898b3 | 33 | |
YUPPY | 5:5aa7223226df | 34 | |
YUPPY | 7:fae874e898b3 | 35 | int main() |
YUPPY | 7:fae874e898b3 | 36 | { |
YUPPY | 7:fae874e898b3 | 37 | |
YUPPY | 7:fae874e898b3 | 38 | |
YUPPY | 7:fae874e898b3 | 39 | Sb612switch=0; //焦電off |
YUPPY | 7:fae874e898b3 | 40 | wait(1); |
YUPPY | 7:fae874e898b3 | 41 | Ultra=0;//超音波off |
YUPPY | 7:fae874e898b3 | 42 | |
YUPPY | 5:5aa7223226df | 43 | printf("CanSat-B_Start!\r\n"); |
YUPPY | 5:5aa7223226df | 44 | |
YUPPY | 7:fae874e898b3 | 45 | //FET |
YUPPY | 7:fae874e898b3 | 46 | |
YUPPY | 7:fae874e898b3 | 47 | FET=1; |
YUPPY | 7:fae874e898b3 | 48 | wait(10); |
YUPPY | 7:fae874e898b3 | 49 | FET=0; |
YUPPY | 7:fae874e898b3 | 50 | wait(10); |
YUPPY | 7:fae874e898b3 | 51 | |
YUPPY | 7:fae874e898b3 | 52 | |
YUPPY | 7:fae874e898b3 | 53 | |
YUPPY | 5:5aa7223226df | 54 | //以下GPS |
YUPPY | 2:e2b803e3bcbc | 55 | double a; |
YUPPY | 2:e2b803e3bcbc | 56 | double b; |
YUPPY | 2:e2b803e3bcbc | 57 | double distance; |
KINU | 9:ec770f68440e | 58 | int k = 0; |
KINU | 9:ec770f68440e | 59 | int j = 0; |
KINU | 9:ec770f68440e | 60 | |
YUPPY | 2:e2b803e3bcbc | 61 | pc.printf("GPS Start\r\n"); |
KINU | 9:ec770f68440e | 62 | xbee.printf("s\n"); |
KINU | 9:ec770f68440e | 63 | if(gps.getgps()){ |
KINU | 9:ec770f68440e | 64 | |
KINU | 9:ec770f68440e | 65 | pc.printf("(%lf,%lf)\r\n",gps.latitude,gps.longitude);//緯度と経度を表示 |
KINU | 9:ec770f68440e | 66 | i ++; |
KINU | 9:ec770f68440e | 67 | if(k<59){ |
KINU | 9:ec770f68440e | 68 | }else{ |
YUPPY | 2:e2b803e3bcbc | 69 | a = gps.latitude; |
YUPPY | 2:e2b803e3bcbc | 70 | b = gps.longitude; |
KINU | 9:ec770f68440e | 71 | printf("(a =%lf,b =%lf)\r\n",gps.latitude,gps.longitude);//a,bを表示 |
YUPPY | 2:e2b803e3bcbc | 72 | break; |
KINU | 9:ec770f68440e | 73 | } |
YUPPY | 2:e2b803e3bcbc | 74 | }else{ |
KINU | 9:ec770f68440e | 75 | pc.printf("NO DATA\r\n");//データ取得失敗 |
KINU | 9:ec770f68440e | 76 | wait(1); |
KINU | 9:ec770f68440e | 77 | } |
KINU | 9:ec770f68440e | 78 | } |
KINU | 9:ec770f68440e | 79 | printf("moter on"); |
KINU | 9:ec770f68440e | 80 | left = 100; //左モーター100% |
KINU | 9:ec770f68440e | 81 | right = 100;//右モーター100% |
KINU | 9:ec770f68440e | 82 | |
KINU | 9:ec770f68440e | 83 | wait(30); |
KINU | 9:ec770f68440e | 84 | printf("moter off"); |
KINU | 9:ec770f68440e | 85 | left = 0; //左モーター10% |
KINU | 9:ec770f68440e | 86 | right = 0;//右モーター10%(左折) |
KINU | 9:ec770f68440e | 87 | printf("moter off"); |
KINU | 9:ec770f68440e | 88 | wait(15); |
KINU | 9:ec770f68440e | 89 | printf("GPS restart\n"); |
KINU | 9:ec770f68440e | 90 | |
KINU | 9:ec770f68440e | 91 | while(1) { |
KINU | 9:ec770f68440e | 92 | if(gps.getgps()){ |
YUPPY | 2:e2b803e3bcbc | 93 | |
KINU | 9:ec770f68440e | 94 | pc.printf("(%lf,%lf)\r\n",gps.latitude,gps.longitude);//緯度と経度を表示 |
KINU | 9:ec770f68440e | 95 | j ++; |
KINU | 9:ec770f68440e | 96 | if(j<29){ |
KINU | 9:ec770f68440e | 97 | }else{ |
KINU | 9:ec770f68440e | 98 | // 球面三角法により、大円距離(メートル)を求める |
KINU | 9:ec770f68440e | 99 | double c; |
KINU | 9:ec770f68440e | 100 | double d; |
KINU | 9:ec770f68440e | 101 | c = gps.latitude; |
KINU | 9:ec770f68440e | 102 | d = gps.longitude; |
YUPPY | 2:e2b803e3bcbc | 103 | |
KINU | 9:ec770f68440e | 104 | pc.printf("(%lf,%lf)\n\r",gps.latitude,gps.longitude);//c,dを表示 |
KINU | 9:ec770f68440e | 105 | const double pi = 3.14159265359; // 円周率 |
YUPPY | 2:e2b803e3bcbc | 106 | |
KINU | 9:ec770f68440e | 107 | double ra = a * pi / 180; |
KINU | 9:ec770f68440e | 108 | double rb = b * pi / 180; // 緯度経度をラジアンに変換 |
KINU | 9:ec770f68440e | 109 | double rc = c * pi / 180; |
KINU | 9:ec770f68440e | 110 | double rd = d * pi / 180; |
YUPPY | 2:e2b803e3bcbc | 111 | |
KINU | 9:ec770f68440e | 112 | double e = sin(ra) * sin(rc) + cos(ra) * cos(rc) * cos(rb - rd); // 2点の中心角(ラジアン)を求める |
KINU | 9:ec770f68440e | 113 | double rr = acos(e); |
YUPPY | 2:e2b803e3bcbc | 114 | |
KINU | 9:ec770f68440e | 115 | const double earth_radius = 6378140; // 地球赤道半径(m) |
YUPPY | 2:e2b803e3bcbc | 116 | |
KINU | 9:ec770f68440e | 117 | distance = earth_radius * rr; // 2点間の距離(m) |
YUPPY | 2:e2b803e3bcbc | 118 | |
KINU | 9:ec770f68440e | 119 | if (distance<5){ |
YUPPY | 2:e2b803e3bcbc | 120 | }else{ |
KINU | 9:ec770f68440e | 121 | pc.printf("(c =%lf,d =%lf)\n\r",gps.latitude,gps.longitude);//c,dを表示 |
YUPPY | 2:e2b803e3bcbc | 122 | pc.printf("5m clear!"); |
KINU | 9:ec770f68440e | 123 | xbee.printf("5m clear!"); |
KINU | 9:ec770f68440e | 124 | break; |
KINU | 9:ec770f68440e | 125 | } |
KINU | 9:ec770f68440e | 126 | } |
KINU | 9:ec770f68440e | 127 | }else{ |
KINU | 9:ec770f68440e | 128 | printf("No data"); |
KINU | 9:ec770f68440e | 129 | } |
KINU | 9:ec770f68440e | 130 | } //GPS End |
YUPPY | 5:5aa7223226df | 131 | |
YUPPY | 7:fae874e898b3 | 132 | int i=1; |
YUPPY | 4:1354e56c7dd3 | 133 | float th; |
YUPPY | 4:1354e56c7dd3 | 134 | Timer tm; |
YUPPY | 7:fae874e898b3 | 135 | for(i=0;i<3;i++){ |
YUPPY | 4:1354e56c7dd3 | 136 | pc.printf("start\r\n"); |
YUPPY | 6:db1a62608047 | 137 | |
YUPPY | 7:fae874e898b3 | 138 | left1 = 100; //左モーター100% |
YUPPY | 7:fae874e898b3 | 139 | right1 = 100;//右モーター100% |
YUPPY | 7:fae874e898b3 | 140 | printf("Restart\r\n" ); |
YUPPY | 7:fae874e898b3 | 141 | wait(4); |
YUPPY | 7:fae874e898b3 | 142 | left1=50; |
YUPPY | 7:fae874e898b3 | 143 | right1=50; |
YUPPY | 7:fae874e898b3 | 144 | wait(1); |
YUPPY | 7:fae874e898b3 | 145 | left1=0; |
YUPPY | 7:fae874e898b3 | 146 | right1=0; |
YUPPY | 7:fae874e898b3 | 147 | wait(1); |
YUPPY | 7:fae874e898b3 | 148 | printf("停止\n\r"); |
YUPPY | 7:fae874e898b3 | 149 | Sb612switch=0; //焦電off |
YUPPY | 7:fae874e898b3 | 150 | wait(1); |
YUPPY | 4:1354e56c7dd3 | 151 | Ultra=1;//超音波on |
YUPPY | 7:fae874e898b3 | 152 | wait(1); |
YUPPY | 5:5aa7223226df | 153 | |
YUPPY | 7:fae874e898b3 | 154 | while(1) { |
YUPPY | 7:fae874e898b3 | 155 | printf("超音波on\r\n 焦電off\r\n" ) ; |
YUPPY | 7:fae874e898b3 | 156 | hs.TrigerOut(); |
YUPPY | 5:5aa7223226df | 157 | wait(1); |
YUPPY | 5:5aa7223226df | 158 | int distance; |
YUPPY | 5:5aa7223226df | 159 | distance = hs.GetDistance(); |
YUPPY | 7:fae874e898b3 | 160 | printf("distance=%dmm\r\n",distance);//距離出力 |
YUPPY | 7:fae874e898b3 | 161 | |
YUPPY | 7:fae874e898b3 | 162 | if(distance<=2000){//超音波反応 |
YUPPY | 7:fae874e898b3 | 163 | |
YUPPY | 7:fae874e898b3 | 164 | Ultra=0;//超音波off |
YUPPY | 7:fae874e898b3 | 165 | wait(1); |
YUPPY | 7:fae874e898b3 | 166 | Sb612switch=1; //焦電on |
YUPPY | 7:fae874e898b3 | 167 | wait(1); |
YUPPY | 7:fae874e898b3 | 168 | printf("焦電On!\r\n "); |
YUPPY | 7:fae874e898b3 | 169 | bool detected=false; |
YUPPY | 7:fae874e898b3 | 170 | th = thermo; |
YUPPY | 7:fae874e898b3 | 171 | if(th==1 && !detected) {//焦電反応ありの場合 |
YUPPY | 7:fae874e898b3 | 172 | i++; |
YUPPY | 7:fae874e898b3 | 173 | detected=true; |
YUPPY | 7:fae874e898b3 | 174 | pc.printf("human\r\n"); |
YUPPY | 7:fae874e898b3 | 175 | tm.reset(); |
YUPPY | 7:fae874e898b3 | 176 | tm.start(); |
YUPPY | 7:fae874e898b3 | 177 | |
YUPPY | 7:fae874e898b3 | 178 | LocalFileSystem local("local"); |
YUPPY | 7:fae874e898b3 | 179 | Timer timer; |
YUPPY | 7:fae874e898b3 | 180 | timer.start(); |
YUPPY | 7:fae874e898b3 | 181 | camera.setPictureSize(JPEGCamera::SIZE320x240); |
YUPPY | 7:fae874e898b3 | 182 | |
YUPPY | 7:fae874e898b3 | 183 | FILE *fp; |
YUPPY | 7:fae874e898b3 | 184 | base64 *bs; |
YUPPY | 7:fae874e898b3 | 185 | int c; |
YUPPY | 7:fae874e898b3 | 186 | |
YUPPY | 7:fae874e898b3 | 187 | for (int r = 0; r < 1; r++) { |
YUPPY | 7:fae874e898b3 | 188 | if (camera.isReady()) { |
YUPPY | 7:fae874e898b3 | 189 | char filename[32]; |
YUPPY | 7:fae874e898b3 | 190 | sprintf(filename, "/local/pict%03d.jpg",r); |
YUPPY | 7:fae874e898b3 | 191 | printf("Picture: %s ", filename); |
YUPPY | 7:fae874e898b3 | 192 | if (camera.takePicture(filename)) { |
YUPPY | 7:fae874e898b3 | 193 | while (camera.isProcessing()) { |
YUPPY | 7:fae874e898b3 | 194 | camera.processPicture(); |
YUPPY | 7:fae874e898b3 | 195 | printf("take pictuer!"); |
YUPPY | 7:fae874e898b3 | 196 | } |
YUPPY | 7:fae874e898b3 | 197 | }else{ |
YUPPY | 7:fae874e898b3 | 198 | printf("take picture failed\r\n"); |
YUPPY | 7:fae874e898b3 | 199 | } |
YUPPY | 7:fae874e898b3 | 200 | }else{ |
YUPPY | 7:fae874e898b3 | 201 | printf("camera is not ready\r\n"); |
YUPPY | 7:fae874e898b3 | 202 | } |
YUPPY | 7:fae874e898b3 | 203 | |
YUPPY | 7:fae874e898b3 | 204 | printf("time = %f\n", timer.read()); |
YUPPY | 7:fae874e898b3 | 205 | |
YUPPY | 7:fae874e898b3 | 206 | |
YUPPY | 7:fae874e898b3 | 207 | |
YUPPY | 7:fae874e898b3 | 208 | xbee.printf("xbee connected!\r\n"); |
YUPPY | 7:fae874e898b3 | 209 | bs = new base64(); |
YUPPY | 7:fae874e898b3 | 210 | bs->Encode("/local/pict000.jpg","/local/data000.txt"); |
YUPPY | 7:fae874e898b3 | 211 | |
YUPPY | 7:fae874e898b3 | 212 | if((fp=fopen("/local/data000.txt","r"))!=NULL) |
YUPPY | 7:fae874e898b3 | 213 | { |
YUPPY | 7:fae874e898b3 | 214 | pc.printf("ok\r\n"); |
YUPPY | 7:fae874e898b3 | 215 | while((c=fgetc(fp))!=EOF){ |
YUPPY | 7:fae874e898b3 | 216 | xbee.printf("%c",c); |
YUPPY | 7:fae874e898b3 | 217 | } |
YUPPY | 7:fae874e898b3 | 218 | fclose(fp); |
YUPPY | 7:fae874e898b3 | 219 | } |
YUPPY | 7:fae874e898b3 | 220 | } |
YUPPY | 7:fae874e898b3 | 221 | while(1){ |
YUPPY | 7:fae874e898b3 | 222 | |
YUPPY | 7:fae874e898b3 | 223 | int received_data = xbee.getc(); |
YUPPY | 7:fae874e898b3 | 224 | |
YUPPY | 7:fae874e898b3 | 225 | if (received_data == 82 || received_data == 114){ //Rまたはr |
YUPPY | 7:fae874e898b3 | 226 | xbee.printf("_________________________________________________________________________________________________________________________________\r\n"); |
YUPPY | 7:fae874e898b3 | 227 | if((fp=fopen("/local/data000.txt","r"))!=NULL) |
YUPPY | 7:fae874e898b3 | 228 | { |
YUPPY | 7:fae874e898b3 | 229 | while ((c=fgetc(fp))!=EOF){ |
YUPPY | 7:fae874e898b3 | 230 | xbee.printf("%c",c); //再送 |
YUPPY | 7:fae874e898b3 | 231 | } |
YUPPY | 7:fae874e898b3 | 232 | fclose(fp); |
YUPPY | 7:fae874e898b3 | 233 | } |
YUPPY | 7:fae874e898b3 | 234 | } |
YUPPY | 7:fae874e898b3 | 235 | else{ |
YUPPY | 7:fae874e898b3 | 236 | break; |
YUPPY | 7:fae874e898b3 | 237 | } |
YUPPY | 7:fae874e898b3 | 238 | } |
YUPPY | 7:fae874e898b3 | 239 | |
YUPPY | 7:fae874e898b3 | 240 | Sb612switch=0; //焦電off |
YUPPY | 7:fae874e898b3 | 241 | wait(1); |
YUPPY | 7:fae874e898b3 | 242 | }else{//焦電反応なしの場合 |
YUPPY | 7:fae874e898b3 | 243 | printf("not found!\r\n"); |
YUPPY | 7:fae874e898b3 | 244 | |
YUPPY | 7:fae874e898b3 | 245 | |
YUPPY | 7:fae874e898b3 | 246 | Sb612switch=0; |
YUPPY | 7:fae874e898b3 | 247 | wait(1); |
YUPPY | 7:fae874e898b3 | 248 | Ultra=0; |
YUPPY | 7:fae874e898b3 | 249 | wait(1); |
YUPPY | 7:fae874e898b3 | 250 | detected=false; |
YUPPY | 7:fae874e898b3 | 251 | printf("後退\r\n"); |
YUPPY | 7:fae874e898b3 | 252 | left1 = -100; //左モーター-50% |
YUPPY | 7:fae874e898b3 | 253 | right1 = -100;//右モーター-50% |
YUPPY | 7:fae874e898b3 | 254 | wait(2.0); |
YUPPY | 7:fae874e898b3 | 255 | left1=-50; |
YUPPY | 7:fae874e898b3 | 256 | right1=-50; |
YUPPY | 7:fae874e898b3 | 257 | wait(1); |
YUPPY | 7:fae874e898b3 | 258 | left1=0; |
YUPPY | 7:fae874e898b3 | 259 | right1=0; |
YUPPY | 7:fae874e898b3 | 260 | wait(1); |
YUPPY | 7:fae874e898b3 | 261 | |
YUPPY | 7:fae874e898b3 | 262 | printf("右折\n\r"); |
YUPPY | 7:fae874e898b3 | 263 | |
YUPPY | 7:fae874e898b3 | 264 | left1 = 60; //左モーター100% |
YUPPY | 7:fae874e898b3 | 265 | right1 = 100;//右モーター100% |
YUPPY | 7:fae874e898b3 | 266 | wait(2.0); |
YUPPY | 7:fae874e898b3 | 267 | } |
YUPPY | 7:fae874e898b3 | 268 | }else{//超音波distance>2000 |
YUPPY | 7:fae874e898b3 | 269 | printf("safety zone\r\n"); |
YUPPY | 7:fae874e898b3 | 270 | Ultra=0; |
YUPPY | 7:fae874e898b3 | 271 | wait(1); |
YUPPY | 7:fae874e898b3 | 272 | left1 = 60; //左モーター50% |
YUPPY | 7:fae874e898b3 | 273 | right1 = 100;//右モーター50% |
YUPPY | 7:fae874e898b3 | 274 | printf("右折\r\n"); |
YUPPY | 5:5aa7223226df | 275 | } |
YUPPY | 4:1354e56c7dd3 | 276 | |
YUPPY | 5:5aa7223226df | 277 | } |
YUPPY | 7:fae874e898b3 | 278 | |
YUPPY | 7:fae874e898b3 | 279 | } |
YUPPY | 7:fae874e898b3 | 280 | } |