GPSは500秒過ぎたらスキップされます. xbeeで送信するコメントを増やしました。

Dependencies:   mbed

Committer:
YUPPY
Date:
Sat Dec 14 13:27:51 2019 +0000
Revision:
15:1deffcfa5b1a
Parent:
14:228a35fcb323
Child:
16:429f6ad98e90
s

Who changed what in which revision?

UserRevisionLine numberNew 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
seijakunouenimutou 13:63746a793db9 19 Timer time_gps;
YUPPY 4:1354e56c7dd3 20
YUPPY 2:e2b803e3bcbc 21 DigitalOut FET(p21); //FET
YUPPY 7:fae874e898b3 22 DigitalOut myled(LED1);
YUPPY 7:fae874e898b3 23 US015 hs(p12,p11);
YUPPY 7:fae874e898b3 24 DigitalIn thermo(p20);
YUPPY 7:fae874e898b3 25 DigitalOut Sb612switch(p15); //焦電スイッチ
YUPPY 4:1354e56c7dd3 26 DigitalOut Ultra(p12);
YUPPY 7:fae874e898b3 27 Serial pc(USBTX,USBRX); // tx, rx
YUPPY 7:fae874e898b3 28 JPEGCamera camera(p9, p10); // TX, RX
YUPPY 7:fae874e898b3 29 TB6612 left1(p25,p17,p16); //モーターピン
YUPPY 7:fae874e898b3 30 TB6612 right1(p26,p19,p18); //モーターピン
YUPPY 7:fae874e898b3 31 Serial xbee(p13,p14); //xbee
saeichi 10:6e02396abaf5 32 DigitalIn flight(p23); //フライトピン(in)
saeichi 10:6e02396abaf5 33 DigitalOut SW(p24); //フライトピン(out)
YUPPY 5:5aa7223226df 34
YUPPY 7:fae874e898b3 35 int main()
YUPPY 7:fae874e898b3 36 {
YUPPY 7:fae874e898b3 37
YUPPY 7:fae874e898b3 38
sasaokayuzen 11:6f553aa95d08 39 Sb612switch=0; //焦電off
YUPPY 7:fae874e898b3 40 wait(1);
YUPPY 7:fae874e898b3 41 Ultra=0;//超音波off
saeichi 10:6e02396abaf5 42 SW=1;
saeichi 10:6e02396abaf5 43 flight==1;//flight pin ついてる
YUPPY 15:1deffcfa5b1a 44 FET=0;//FET off
YUPPY 15:1deffcfa5b1a 45 myled=1;
YUPPY 15:1deffcfa5b1a 46 printf("CanSat-B_Start!\r\n");
saeichi 10:6e02396abaf5 47
YUPPY 7:fae874e898b3 48 //FET
seijakunouenimutou 14:228a35fcb323 49 while(1){
saeichi 10:6e02396abaf5 50 if(flight==1) {
YUPPY 15:1deffcfa5b1a 51 myled=1;
saeichi 10:6e02396abaf5 52 wait(10);
saeichi 10:6e02396abaf5 53 printf("mada\r\n");
saeichi 10:6e02396abaf5 54 }
saeichi 10:6e02396abaf5 55 else{
saeichi 10:6e02396abaf5 56 if(flight==1) {
YUPPY 15:1deffcfa5b1a 57 myled=1;
saeichi 10:6e02396abaf5 58 wait(10);
saeichi 10:6e02396abaf5 59 printf("madamada\r\n");
saeichi 10:6e02396abaf5 60 }
saeichi 10:6e02396abaf5 61 else{
YUPPY 15:1deffcfa5b1a 62 myled=0;
saeichi 10:6e02396abaf5 63 printf("yattar\r\n");
YUPPY 15:1deffcfa5b1a 64 FET=1;
YUPPY 15:1deffcfa5b1a 65 wait(10);
saeichi 10:6e02396abaf5 66 FET=0;
saeichi 10:6e02396abaf5 67 wait(10);
saeichi 10:6e02396abaf5 68 printf("FET End!\r\n");
saeichi 10:6e02396abaf5 69 SW=0;
saeichi 10:6e02396abaf5 70
saeichi 10:6e02396abaf5 71 break;
saeichi 10:6e02396abaf5 72 }
saeichi 10:6e02396abaf5 73 }
seijakunouenimutou 14:228a35fcb323 74 }
YUPPY 7:fae874e898b3 75
YUPPY 7:fae874e898b3 76
YUPPY 5:5aa7223226df 77 //以下GPS
seijakunouenimutou 13:63746a793db9 78 double a=0;
seijakunouenimutou 13:63746a793db9 79 double b=0;
YUPPY 2:e2b803e3bcbc 80 double distance;
seijakunouenimutou 13:63746a793db9 81 double timeout_flag=0;
saeichi 10:6e02396abaf5 82 int k = 0;
saeichi 10:6e02396abaf5 83 int j = 0;
saeichi 10:6e02396abaf5 84
saeichi 10:6e02396abaf5 85 pc.printf("GPS Start\n");
seijakunouenimutou 14:228a35fcb323 86 xbee.printf("start\n");//printf("1");
seijakunouenimutou 13:63746a793db9 87 time_gps.start();
seijakunouenimutou 13:63746a793db9 88 while(a==0)
seijakunouenimutou 13:63746a793db9 89 {
seijakunouenimutou 13:63746a793db9 90 if(gps.getgps()){
seijakunouenimutou 13:63746a793db9 91 a=gps.latitude;
seijakunouenimutou 13:63746a793db9 92 b=gps.longitude;
seijakunouenimutou 13:63746a793db9 93 }
saeichi 10:6e02396abaf5 94
seijakunouenimutou 13:63746a793db9 95 pc.printf("%lf,%lf\n",a,b);
seijakunouenimutou 13:63746a793db9 96 if(time_gps.read()>30){
seijakunouenimutou 13:63746a793db9 97 xbee.printf("timeout!!\n");
seijakunouenimutou 13:63746a793db9 98 timeout_flag=1;
seijakunouenimutou 13:63746a793db9 99 break;
saeichi 10:6e02396abaf5 100 }
seijakunouenimutou 13:63746a793db9 101 }
seijakunouenimutou 13:63746a793db9 102 printf("moter on%lf",a);
saeichi 10:6e02396abaf5 103 left1 = 100; //左モーター100%
saeichi 10:6e02396abaf5 104 right1 = 100;//右モーター100%
saeichi 10:6e02396abaf5 105
seijakunouenimutou 12:eb4befc8d2c4 106 wait(10);
saeichi 10:6e02396abaf5 107 printf("moter off");
saeichi 10:6e02396abaf5 108 left1 = 0; //左モーター0%
saeichi 10:6e02396abaf5 109 right1 = 0;//右モーター0%
saeichi 10:6e02396abaf5 110 printf("moter off");
saeichi 10:6e02396abaf5 111 wait(15);
saeichi 10:6e02396abaf5 112
seijakunouenimutou 13:63746a793db9 113 while(!timeout_flag) {
seijakunouenimutou 13:63746a793db9 114 printf("GPS restart\n");
saeichi 10:6e02396abaf5 115 if(gps.getgps()){
YUPPY 2:e2b803e3bcbc 116
saeichi 10:6e02396abaf5 117 pc.printf("(%lf,%lf)\r\n",gps.latitude,gps.longitude);//緯度と経度を表示
saeichi 10:6e02396abaf5 118 j ++;
seijakunouenimutou 13:63746a793db9 119 if(j<10){
saeichi 10:6e02396abaf5 120 }else{
saeichi 10:6e02396abaf5 121 // 球面三角法により、大円距離(メートル)を求める
seijakunouenimutou 13:63746a793db9 122 double lat2;
seijakunouenimutou 13:63746a793db9 123 double lon2;
seijakunouenimutou 13:63746a793db9 124 lat2 = gps.latitude;
seijakunouenimutou 13:63746a793db9 125 lon2 = gps.longitude;
YUPPY 2:e2b803e3bcbc 126
saeichi 10:6e02396abaf5 127 pc.printf("(%lf,%lf)\n\r",gps.latitude,gps.longitude);//c,dを表示
saeichi 10:6e02396abaf5 128 const double pi = 3.14159265359; // 円周率
YUPPY 2:e2b803e3bcbc 129
saeichi 10:6e02396abaf5 130 double ra = a * pi / 180;
saeichi 10:6e02396abaf5 131 double rb = b * pi / 180; // 緯度経度をラジアンに変換
seijakunouenimutou 13:63746a793db9 132 double rc = lat2 * pi / 180;
seijakunouenimutou 13:63746a793db9 133 double rd = lon2 * pi / 180;
YUPPY 2:e2b803e3bcbc 134
seijakunouenimutou 13:63746a793db9 135 double e = sin(ra) * sin(rc) + cos(ra) * cos(rc) * cos(rd - rb); // 2点の中心角(ラジアン)を求める
saeichi 10:6e02396abaf5 136 double rr = acos(e);
YUPPY 2:e2b803e3bcbc 137
saeichi 10:6e02396abaf5 138 const double earth_radius = 6378140; // 地球赤道半径(m)
YUPPY 2:e2b803e3bcbc 139
saeichi 10:6e02396abaf5 140 distance = earth_radius * rr; // 2点間の距離(m)
seijakunouenimutou 13:63746a793db9 141 printf("distance=%f\ne=%lf\nrr=%lf\n",distance,e,rr);
saeichi 10:6e02396abaf5 142 if (distance<5){
YUPPY 2:e2b803e3bcbc 143 }else{
seijakunouenimutou 13:63746a793db9 144 pc.printf("(a =%lf,b =%lf)\n\r",a,b);
saeichi 10:6e02396abaf5 145 pc.printf("(c =%lf,d =%lf)\n\r",gps.latitude,gps.longitude);//c,dを表示
YUPPY 2:e2b803e3bcbc 146 pc.printf("5m clear!");
saeichi 10:6e02396abaf5 147 xbee.printf("5m clear!");
saeichi 10:6e02396abaf5 148 break;
saeichi 10:6e02396abaf5 149 }
saeichi 10:6e02396abaf5 150 }
saeichi 10:6e02396abaf5 151 }else{
saeichi 10:6e02396abaf5 152 printf("No data");
saeichi 10:6e02396abaf5 153 }
saeichi 10:6e02396abaf5 154 } //GPS End */
YUPPY 5:5aa7223226df 155
YUPPY 7:fae874e898b3 156 int i=1;
saeichi 10:6e02396abaf5 157 float th;
saeichi 10:6e02396abaf5 158 Timer tm;
saeichi 10:6e02396abaf5 159 for(i=0;i<3;i++){
saeichi 10:6e02396abaf5 160 pc.printf("start\r\n");
YUPPY 6:db1a62608047 161
saeichi 10:6e02396abaf5 162 left1 = 100; //左モーター100%
saeichi 10:6e02396abaf5 163 right1 = 100;//右モーター100%
saeichi 10:6e02396abaf5 164
saeichi 10:6e02396abaf5 165 printf("Restart\r\n" );
saeichi 10:6e02396abaf5 166
saeichi 10:6e02396abaf5 167 wait(4);
saeichi 10:6e02396abaf5 168 left1=50;
saeichi 10:6e02396abaf5 169 right1=50;
saeichi 10:6e02396abaf5 170 wait(1);
saeichi 10:6e02396abaf5 171 left1=0;
saeichi 10:6e02396abaf5 172 right1=0;
saeichi 10:6e02396abaf5 173 wait(1);
saeichi 10:6e02396abaf5 174
saeichi 10:6e02396abaf5 175 printf("停止\n\r");
saeichi 10:6e02396abaf5 176
saeichi 10:6e02396abaf5 177 Sb612switch=0; //焦電off
saeichi 10:6e02396abaf5 178 wait(1);
saeichi 10:6e02396abaf5 179 Ultra=1;//超音波on
saeichi 10:6e02396abaf5 180 wait(1);
saeichi 10:6e02396abaf5 181
saeichi 10:6e02396abaf5 182 while(1) {
saeichi 10:6e02396abaf5 183 left1 = 0;
saeichi 10:6e02396abaf5 184 right1 = 0;
saeichi 10:6e02396abaf5 185
saeichi 10:6e02396abaf5 186 printf("超音波on\r\n 焦電off\r\n" ) ;
saeichi 10:6e02396abaf5 187
saeichi 10:6e02396abaf5 188 hs.TrigerOut();
saeichi 10:6e02396abaf5 189 wait(1);
saeichi 10:6e02396abaf5 190 int distance;
saeichi 10:6e02396abaf5 191 distance = hs.GetDistance();
saeichi 10:6e02396abaf5 192
saeichi 10:6e02396abaf5 193 printf("distance=%dmm\r\n",distance);//距離出力
saeichi 10:6e02396abaf5 194
saeichi 10:6e02396abaf5 195 if(distance<=2000){//超音波反応
saeichi 10:6e02396abaf5 196 Ultra=0;//超音波off
saeichi 10:6e02396abaf5 197 wait(1);
saeichi 10:6e02396abaf5 198 Sb612switch=1; //焦電on
saeichi 10:6e02396abaf5 199 wait(1);
saeichi 10:6e02396abaf5 200
saeichi 10:6e02396abaf5 201 printf("焦電On!\r\n ");
saeichi 10:6e02396abaf5 202
saeichi 10:6e02396abaf5 203 bool detected=false;
saeichi 10:6e02396abaf5 204 th = thermo;
saeichi 10:6e02396abaf5 205
saeichi 10:6e02396abaf5 206 if(th==1 && !detected) {//焦電反応ありの場合
saeichi 10:6e02396abaf5 207 i++;
saeichi 10:6e02396abaf5 208 detected=true;
saeichi 10:6e02396abaf5 209 pc.printf("human\r\n");
saeichi 10:6e02396abaf5 210 tm.reset();
saeichi 10:6e02396abaf5 211 tm.start();
saeichi 10:6e02396abaf5 212
saeichi 10:6e02396abaf5 213 LocalFileSystem local("local");
saeichi 10:6e02396abaf5 214 Timer timer;
saeichi 10:6e02396abaf5 215 timer.start();
saeichi 10:6e02396abaf5 216 camera.setPictureSize(JPEGCamera::SIZE320x240);
saeichi 10:6e02396abaf5 217
saeichi 10:6e02396abaf5 218 FILE *fp;
saeichi 10:6e02396abaf5 219 base64 *bs;
saeichi 10:6e02396abaf5 220 int c;
saeichi 10:6e02396abaf5 221
saeichi 10:6e02396abaf5 222 for (int r = 0; r < 1; r++) {
saeichi 10:6e02396abaf5 223 if (camera.isReady()) {
saeichi 10:6e02396abaf5 224 char filename[25];
saeichi 10:6e02396abaf5 225 snprintf(filename,25,"%s%03d%s","/local/pict",r,".jpg");
saeichi 10:6e02396abaf5 226 printf("Picture: %s ", filename);
saeichi 10:6e02396abaf5 227 if (camera.takePicture(filename)) {
saeichi 10:6e02396abaf5 228 while (camera.isProcessing()) {
saeichi 10:6e02396abaf5 229 camera.processPicture();
saeichi 10:6e02396abaf5 230
saeichi 10:6e02396abaf5 231 printf("take pictuer!");
saeichi 10:6e02396abaf5 232
saeichi 10:6e02396abaf5 233 xbee.printf("xbee connected!!\r\n");
saeichi 10:6e02396abaf5 234
saeichi 10:6e02396abaf5 235 bs = new base64();
saeichi 10:6e02396abaf5 236 bs->Encode(filename,"/local/data.txt");
saeichi 10:6e02396abaf5 237
saeichi 10:6e02396abaf5 238 printf("time = %f\n", timer.read());
saeichi 10:6e02396abaf5 239
saeichi 10:6e02396abaf5 240
saeichi 10:6e02396abaf5 241 if((fp=fopen("/local/d.txt","r"))!=NULL){
saeichi 10:6e02396abaf5 242 pc.printf("ok\r\n");
saeichi 10:6e02396abaf5 243 while((c=fgetc(fp))!=EOF){
saeichi 10:6e02396abaf5 244 xbee.printf("%c",c);
saeichi 10:6e02396abaf5 245 }
saeichi 10:6e02396abaf5 246 fclose(fp);
saeichi 10:6e02396abaf5 247 }
saeichi 10:6e02396abaf5 248 }
saeichi 10:6e02396abaf5 249 }else{
saeichi 10:6e02396abaf5 250 printf("take picture failed\r\n");
saeichi 10:6e02396abaf5 251 }
saeichi 10:6e02396abaf5 252 }else{
saeichi 10:6e02396abaf5 253 printf("camera is not ready\r\n");
saeichi 10:6e02396abaf5 254 }
saeichi 10:6e02396abaf5 255 while(1){
saeichi 10:6e02396abaf5 256
saeichi 10:6e02396abaf5 257 int received_data = xbee.getc();
saeichi 10:6e02396abaf5 258
saeichi 10:6e02396abaf5 259 if (received_data == 82 || received_data == 114){ //Rまたはr
saeichi 10:6e02396abaf5 260
saeichi 10:6e02396abaf5 261 xbee.printf("_________________________________________________________________________________________________________________________________\r\n");
saeichi 10:6e02396abaf5 262 if((fp=fopen("/local/d.txt","r"))!=NULL) {
saeichi 10:6e02396abaf5 263 while ((c=fgetc(fp))!=EOF){
saeichi 10:6e02396abaf5 264
saeichi 10:6e02396abaf5 265 xbee.printf("%c",c); //再送
saeichi 10:6e02396abaf5 266 }
saeichi 10:6e02396abaf5 267 fclose(fp);
saeichi 10:6e02396abaf5 268 }
saeichi 10:6e02396abaf5 269 }else{
saeichi 10:6e02396abaf5 270 break;
saeichi 10:6e02396abaf5 271 }
saeichi 10:6e02396abaf5 272 }
saeichi 10:6e02396abaf5 273
saeichi 10:6e02396abaf5 274 Sb612switch=0; //焦電off
saeichi 10:6e02396abaf5 275 wait(1);
saeichi 10:6e02396abaf5 276 }
saeichi 10:6e02396abaf5 277 }else{//焦電反応なしの場合
saeichi 10:6e02396abaf5 278 printf("not found!\r\n");
saeichi 10:6e02396abaf5 279 Sb612switch=0;
saeichi 10:6e02396abaf5 280 wait(1);
saeichi 10:6e02396abaf5 281 Ultra=0;
saeichi 10:6e02396abaf5 282 wait(1);
saeichi 10:6e02396abaf5 283 detected=false;
saeichi 10:6e02396abaf5 284 printf("後退\r\n");
saeichi 10:6e02396abaf5 285 left1 = -100; //左モーター-50%
saeichi 10:6e02396abaf5 286 right1 = -100;//右モーター-50%
saeichi 10:6e02396abaf5 287 wait(2.0);
saeichi 10:6e02396abaf5 288 left1=-50;
saeichi 10:6e02396abaf5 289 right1=-50;
YUPPY 7:fae874e898b3 290 wait(1);
YUPPY 7:fae874e898b3 291 left1=0;
YUPPY 7:fae874e898b3 292 right1=0;
YUPPY 7:fae874e898b3 293 wait(1);
YUPPY 7:fae874e898b3 294
saeichi 10:6e02396abaf5 295 printf("右折\n\r");
saeichi 10:6e02396abaf5 296 left1 = 60; //左モーター100%
saeichi 10:6e02396abaf5 297 right1 = 100;//右モーター100%
saeichi 10:6e02396abaf5 298 wait(2.0);
saeichi 10:6e02396abaf5 299 }
saeichi 10:6e02396abaf5 300 }else{//超音波distance>2000
saeichi 10:6e02396abaf5 301 printf("safety zone\r\n");
saeichi 10:6e02396abaf5 302 Ultra=0;
saeichi 10:6e02396abaf5 303 wait(1);
saeichi 10:6e02396abaf5 304 left1 = 60; //左モーター50%
saeichi 10:6e02396abaf5 305 right1 = 100;//右モーター50%
saeichi 10:6e02396abaf5 306 printf("右折\r\n");
saeichi 10:6e02396abaf5 307 wait(3);
saeichi 10:6e02396abaf5 308 left1 = 100;
saeichi 10:6e02396abaf5 309 right1 = 100;
saeichi 10:6e02396abaf5 310 wait(5);
saeichi 10:6e02396abaf5 311 left1 = 0;
saeichi 10:6e02396abaf5 312 right1 = 0;
saeichi 10:6e02396abaf5 313 wait(5);
saeichi 10:6e02396abaf5 314 }
YUPPY 4:1354e56c7dd3 315
YUPPY 5:5aa7223226df 316 }
YUPPY 7:fae874e898b3 317
saeichi 10:6e02396abaf5 318 }
YUPPY 7:fae874e898b3 319 }