kyunsat / Mbed 2 deprecated MAG3110test

Dependencies:   MotionSensor SDFileSystem mbed

Fork of TanecCon by hswell and nike

Committer:
Nike3221
Date:
Tue Feb 28 15:54:53 2017 +0000
Revision:
3:8d904225adfd
Parent:
2:6f9881435f17
Child:
4:1fdffa2e6312
TaneCon_mbedLPC1768 1/3/2017

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Nike3221 0:029ef267b1bc 1 /*
Nike3221 0:029ef267b1bc 2 * MAG3110 Sensor Library for mbed
Nike3221 0:029ef267b1bc 3 * TODO: Add proper header
Nike3221 0:029ef267b1bc 4 */
Nike3221 0:029ef267b1bc 5
Nike3221 0:029ef267b1bc 6
Nike3221 0:029ef267b1bc 7 #include "mbed.h"
Nike3221 0:029ef267b1bc 8 #include "MotionSensor.h"
Nike3221 0:029ef267b1bc 9 #include "MAG3110.h"
Nike3221 0:029ef267b1bc 10 #include "math.h"
Nike3221 0:029ef267b1bc 11 //#include "SDFileSystem.h"
Nike3221 0:029ef267b1bc 12
Nike3221 0:029ef267b1bc 13 //SDFileSystem sd(p5, p6, p7, p8, "sd");
Nike3221 1:2992de38cf3e 14 Serial pc(USBTX,USBRX);
Nike3221 1:2992de38cf3e 15 //Serial pc(p9,p10);
Nike3221 0:029ef267b1bc 16
Nike3221 1:2992de38cf3e 17 int16_t con_x,con_y,con_z;
Nike3221 0:029ef267b1bc 18 LocalFileSystem local("local");
Nike3221 1:2992de38cf3e 19 //MAG3110 mag(p9,p10);
Nike3221 0:029ef267b1bc 20 MAG3110 mag(p28,p27);
Nike3221 0:029ef267b1bc 21 Serial gps(p13,p14);
Nike3221 0:029ef267b1bc 22
Nike3221 1:2992de38cf3e 23 DigitalIn local_on(p17);
Nike3221 1:2992de38cf3e 24 //DigitalIn local_del(p19);
Nike3221 1:2992de38cf3e 25 //DigitalIn cds(p29);
Nike3221 1:2992de38cf3e 26 Timer ActiveTime; //タイマー
Nike3221 1:2992de38cf3e 27 //DigitalOut trg(p29);
Nike3221 1:2992de38cf3e 28 //DigitalOut sig(p28);
Nike3221 1:2992de38cf3e 29 //InterruptIn distance(p27);
Nike3221 0:029ef267b1bc 30
Nike3221 0:029ef267b1bc 31 DigitalOut bit1(LED4);
Nike3221 0:029ef267b1bc 32 DigitalOut bit2(LED3);
Nike3221 0:029ef267b1bc 33 DigitalOut bit3(LED2);
Nike3221 0:029ef267b1bc 34 DigitalOut bit4(LED1);
Nike3221 2:6f9881435f17 35 //DigitalOut bit5(p16);
Nike3221 2:6f9881435f17 36 DigitalIn local_on2(p16);
Nike3221 1:2992de38cf3e 37 DigitalOut stby(p11);
Nike3221 1:2992de38cf3e 38 DigitalOut motor_io(p12);
Nike3221 1:2992de38cf3e 39 PwmOut servo(p24);
Nike3221 1:2992de38cf3e 40 PwmOut motor_r(p21);
Nike3221 1:2992de38cf3e 41 PwmOut motor_l(p22);
Nike3221 1:2992de38cf3e 42 DigitalOut muda(p15);
Nike3221 1:2992de38cf3e 43 InterruptIn cds(p29);
Nike3221 1:2992de38cf3e 44 //DigitalIn cds(p29);
Nike3221 0:029ef267b1bc 45
Nike3221 1:2992de38cf3e 46 char gps_s[256];
Nike3221 1:2992de38cf3e 47 char gps_c[256];
Nike3221 1:2992de38cf3e 48 float palse=0.02;
Nike3221 1:2992de38cf3e 49 float servo_palse=0.002;
Nike3221 2:6f9881435f17 50 float motor_palse=0.02;
Nike3221 1:2992de38cf3e 51 float sig_time;
Nike3221 2:6f9881435f17 52 float offset_x,offset_y;
Nike3221 1:2992de38cf3e 53 float cds_on,x_max,y_max,x_min,y_min;
Nike3221 1:2992de38cf3e 54 float count_offset,count_gps;
Nike3221 1:2992de38cf3e 55 int a,b,gp,gga,rmc,gll,flag,count2,count_move,quadrant;
Nike3221 1:2992de38cf3e 56 float x_target,y_target,d_target,sita,angle_caly,angle_calx,direction_target;
Nike3221 3:8d904225adfd 57 float longitude_target = 36.115986;//36.11707
Nike3221 3:8d904225adfd 58 float latitude_target = 139.456207;//139.4720
Nike3221 1:2992de38cf3e 59 float utc_time,latitude1,latitude2,longitude1,longitude2,speed,course,utc_date,gps_magnetic;
Nike3221 0:029ef267b1bc 60 char pos_status;
Nike3221 1:2992de38cf3e 61 float direction,x_dat,y_dat,longitudegosa,latitudegosa;
Nike3221 0:029ef267b1bc 62 char angle_c;
Nike3221 0:029ef267b1bc 63
Nike3221 0:029ef267b1bc 64
Nike3221 1:2992de38cf3e 65 void init()
Nike3221 1:2992de38cf3e 66 {
Nike3221 1:2992de38cf3e 67 muda=0;
Nike3221 1:2992de38cf3e 68 cds_on = 0;
Nike3221 1:2992de38cf3e 69 count_move = 0;
Nike3221 1:2992de38cf3e 70 stby = 1;
Nike3221 1:2992de38cf3e 71 motor_io = 1;
Nike3221 1:2992de38cf3e 72 motor_r.period(0.02);
Nike3221 1:2992de38cf3e 73 motor_l.period(0.02);
Nike3221 1:2992de38cf3e 74 servo.period(0.02);
Nike3221 1:2992de38cf3e 75 x_max = -1000.0;//x,yの最大値を初期化
Nike3221 1:2992de38cf3e 76 y_max = -1000.0;
Nike3221 1:2992de38cf3e 77 x_min = 1000.0;
Nike3221 1:2992de38cf3e 78 y_min = 1000.0;
Nike3221 1:2992de38cf3e 79
Nike3221 1:2992de38cf3e 80 }
Nike3221 1:2992de38cf3e 81
Nike3221 1:2992de38cf3e 82 void cal_l()
Nike3221 1:2992de38cf3e 83 {
Nike3221 1:2992de38cf3e 84 latitude1 = latitude1/100;
Nike3221 1:2992de38cf3e 85 latitude2 = (fmod(latitude1,1)/60)*100;
Nike3221 1:2992de38cf3e 86 latitude1 = floor(latitude1);
Nike3221 1:2992de38cf3e 87 latitude1 = latitude1+latitude2;
Nike3221 1:2992de38cf3e 88
Nike3221 1:2992de38cf3e 89 longitude1 = longitude1/100;
Nike3221 1:2992de38cf3e 90 longitude2 = fmod(longitude1,1)/60*100;
Nike3221 1:2992de38cf3e 91 longitude1 = floor(longitude1);
Nike3221 1:2992de38cf3e 92 longitude1 = longitude1+longitude2;
Nike3221 1:2992de38cf3e 93
Nike3221 1:2992de38cf3e 94 }
Nike3221 1:2992de38cf3e 95
Nike3221 1:2992de38cf3e 96 void gps_read()
Nike3221 1:2992de38cf3e 97 {
Nike3221 1:2992de38cf3e 98 __disable_irq();//割り込み禁止
Nike3221 0:029ef267b1bc 99
Nike3221 1:2992de38cf3e 100 bit4=1;
Nike3221 1:2992de38cf3e 101 pc.printf("gps_read\n");
Nike3221 3:8d904225adfd 102 for(count2=0; count2 < 200 ; count2++) {
Nike3221 1:2992de38cf3e 103 gps_s[count2] = gps.getc();
Nike3221 1:2992de38cf3e 104 pc.printf("%c",gps_s[count2]);
Nike3221 1:2992de38cf3e 105 }
Nike3221 1:2992de38cf3e 106 bit4=0;
Nike3221 1:2992de38cf3e 107 if(count_move==0 || count_move==3)
Nike3221 1:2992de38cf3e 108 {__enable_irq();}//割り込み許可
Nike3221 1:2992de38cf3e 109 }
Nike3221 1:2992de38cf3e 110
Nike3221 1:2992de38cf3e 111 int gps_save()
Nike3221 1:2992de38cf3e 112 {
Nike3221 1:2992de38cf3e 113 a=0;
Nike3221 3:8d904225adfd 114 gp = 2;//1回目の$は無視(flug=1を無視)
Nike3221 1:2992de38cf3e 115 count_gps = 0;
Nike3221 1:2992de38cf3e 116
Nike3221 1:2992de38cf3e 117 pc.printf("\ngps_save\n");
Nike3221 1:2992de38cf3e 118
Nike3221 3:8d904225adfd 119 while(a <= 250 && count_gps < 4) {
Nike3221 1:2992de38cf3e 120
Nike3221 3:8d904225adfd 121 for(a=0,b=0,flag=0; flag <= gp && flag < 4 && gp < 4 && a < 200; a++,b++)//"lag<4" "gp<4" "a<200"は無限ループ対策
Nike3221 3:8d904225adfd 122 {
Nike3221 1:2992de38cf3e 123 bit3=1;
Nike3221 1:2992de38cf3e 124 gps_c[a] = gps_s[b];
Nike3221 1:2992de38cf3e 125 pc.printf("%d %c \n",a,gps_c[a]);
Nike3221 1:2992de38cf3e 126
Nike3221 3:8d904225adfd 127 if(gps_c[a] == '$')
Nike3221 3:8d904225adfd 128 {
Nike3221 1:2992de38cf3e 129 gps_c[0] = '$';
Nike3221 1:2992de38cf3e 130 a=0;
Nike3221 3:8d904225adfd 131 flag++;//1回目の$は無視(flug=1を無視)
Nike3221 1:2992de38cf3e 132 pc.printf("%d %c flag:%d gp:%d\n",a,gps_c[a],flag,gp);
Nike3221 3:8d904225adfd 133 }
Nike3221 1:2992de38cf3e 134
Nike3221 1:2992de38cf3e 135 else if(gps_c[a-1] == '\r' && gps_c[a] == '\n' && flag == gp)
Nike3221 3:8d904225adfd 136 {
Nike3221 1:2992de38cf3e 137 gps_c[a+1]='\0';
Nike3221 1:2992de38cf3e 138 flag = 10;
Nike3221 3:8d904225adfd 139 }
Nike3221 3:8d904225adfd 140
Nike3221 3:8d904225adfd 141
Nike3221 3:8d904225adfd 142 else if(a > 256)//aが256を超えたとき、ループを強制脱出(whileから)
Nike3221 3:8d904225adfd 143 {
Nike3221 1:2992de38cf3e 144 count_gps = 5;
Nike3221 1:2992de38cf3e 145 flag = 10;
Nike3221 3:8d904225adfd 146 }
Nike3221 1:2992de38cf3e 147
Nike3221 1:2992de38cf3e 148 }
Nike3221 1:2992de38cf3e 149
Nike3221 1:2992de38cf3e 150 bit3=0;
Nike3221 1:2992de38cf3e 151 bit2=1;
Nike3221 1:2992de38cf3e 152 wait(0.5);
Nike3221 1:2992de38cf3e 153
Nike3221 1:2992de38cf3e 154 if(memcmp(gps_c,"$GPRMC",6) == 0) {
Nike3221 1:2992de38cf3e 155 sscanf(gps_c,"$GPRMC,%f,%c,%f,N,%f,E,%f,%f,%f,%f,W",&utc_time,&pos_status,&latitude1,&longitude1,&speed,&course,&utc_date,&gps_magnetic);
Nike3221 1:2992de38cf3e 156 //latitude = strncpy(latitude1,latitude1,2);
Nike3221 1:2992de38cf3e 157 cal_l();
Nike3221 1:2992de38cf3e 158 pc.printf("$GPRMC,time[%f],%c,%f,N,%f,E,%f,%f,%f,%f,W \n",utc_time,pos_status,latitude1,longitude1,speed,course,utc_date,gps_magnetic);
Nike3221 1:2992de38cf3e 159 gp++;
Nike3221 1:2992de38cf3e 160
Nike3221 1:2992de38cf3e 161 if(latitude1!=0) {
Nike3221 1:2992de38cf3e 162 bit1=1;
Nike3221 1:2992de38cf3e 163 }
Nike3221 1:2992de38cf3e 164 //mkdir("/sd/gps", 0777);
Nike3221 1:2992de38cf3e 165
Nike3221 1:2992de38cf3e 166 if(local_on == 1) {
Nike3221 1:2992de38cf3e 167 FILE *fp = fopen("/local/gps.txt", "a");
Nike3221 1:2992de38cf3e 168 if(fp == NULL) {
Nike3221 1:2992de38cf3e 169 error("Could not open file for write\n");
Nike3221 1:2992de38cf3e 170 }
Nike3221 1:2992de38cf3e 171
Nike3221 1:2992de38cf3e 172 fprintf(fp,"$GPRMC,%f,%c,%f,N,%f,E,%f,%f,%f,%f,W \n",utc_time,pos_status,latitude1,longitude1,speed,course,utc_date,gps_magnetic);
Nike3221 1:2992de38cf3e 173 fclose(fp);
Nike3221 1:2992de38cf3e 174 }
Nike3221 1:2992de38cf3e 175 bit1=0;
Nike3221 1:2992de38cf3e 176 count_gps++;
Nike3221 1:2992de38cf3e 177 pc.printf("count_gps:%.1f\n",count_gps);
Nike3221 1:2992de38cf3e 178 }
Nike3221 1:2992de38cf3e 179
Nike3221 1:2992de38cf3e 180 else if(memcmp(gps_c,"$GPGGA",6) == 0) {
Nike3221 1:2992de38cf3e 181 sscanf(gps_c,"$GPGGA,%f,%f,N,%f,E",&utc_time,&latitude1,&longitude1);
Nike3221 1:2992de38cf3e 182 cal_l();
Nike3221 1:2992de38cf3e 183 pc.printf("$GPGGA,time[%f],%f,N,%f,E \n",utc_time,latitude1,longitude1);
Nike3221 1:2992de38cf3e 184 gp++;
Nike3221 1:2992de38cf3e 185
Nike3221 1:2992de38cf3e 186 if(latitude1!=0) {
Nike3221 1:2992de38cf3e 187 bit1=1;
Nike3221 1:2992de38cf3e 188 }
Nike3221 1:2992de38cf3e 189 // mkdir("/sd/gps", 0777);
Nike3221 1:2992de38cf3e 190 if(local_on == 1) {
Nike3221 1:2992de38cf3e 191 FILE *fp = fopen("/local/gps.txt", "a");
Nike3221 1:2992de38cf3e 192 if(fp == NULL) {
Nike3221 1:2992de38cf3e 193 error("Could not open file for write\n");
Nike3221 1:2992de38cf3e 194 }
Nike3221 1:2992de38cf3e 195
Nike3221 1:2992de38cf3e 196 fprintf(fp,"$GPGGA,%f,%f,N,%f,E \n",utc_time,latitude1,longitude1);
Nike3221 1:2992de38cf3e 197 fclose(fp);
Nike3221 1:2992de38cf3e 198 }
Nike3221 1:2992de38cf3e 199 bit1=0;
Nike3221 1:2992de38cf3e 200 count_gps++;
Nike3221 1:2992de38cf3e 201 pc.printf("count_gps:%.1f\n",count_gps);
Nike3221 1:2992de38cf3e 202 }
Nike3221 1:2992de38cf3e 203
Nike3221 1:2992de38cf3e 204 else if(memcmp(gps_c,"$GPGLL",6) == 0) {
Nike3221 1:2992de38cf3e 205 sscanf(gps_c,"$GPGLL,%f,N,%f,E \n",&latitude1,&longitude1);
Nike3221 1:2992de38cf3e 206 cal_l();
Nike3221 1:2992de38cf3e 207 pc.printf("$GPGLL,%f,N,%f,E \n",latitude1,longitude1);
Nike3221 1:2992de38cf3e 208 gp++;
Nike3221 1:2992de38cf3e 209
Nike3221 1:2992de38cf3e 210 if(latitude1!=0) {
Nike3221 1:2992de38cf3e 211 bit1=1;
Nike3221 1:2992de38cf3e 212 }
Nike3221 1:2992de38cf3e 213 //mkdir("/sd/gps", 0777);
Nike3221 1:2992de38cf3e 214
Nike3221 1:2992de38cf3e 215 if(local_on == 1) {
Nike3221 1:2992de38cf3e 216 FILE *fp = fopen("/local/gps.txt", "a");
Nike3221 1:2992de38cf3e 217 if(fp == NULL) {
Nike3221 1:2992de38cf3e 218 error("Could not open file for write\n");
Nike3221 1:2992de38cf3e 219 }
Nike3221 1:2992de38cf3e 220
Nike3221 1:2992de38cf3e 221 fprintf(fp,"$GPGLL,%f,N,%f,E \n",latitude1,longitude1);
Nike3221 1:2992de38cf3e 222 fclose(fp);
Nike3221 1:2992de38cf3e 223 }
Nike3221 1:2992de38cf3e 224 bit1=0;
Nike3221 1:2992de38cf3e 225 count_gps++;
Nike3221 1:2992de38cf3e 226 pc.printf("count_gps:%.1f\n",count_gps);
Nike3221 1:2992de38cf3e 227 }
Nike3221 1:2992de38cf3e 228
Nike3221 1:2992de38cf3e 229 else
Nike3221 1:2992de38cf3e 230 {
Nike3221 1:2992de38cf3e 231 count_gps++;
Nike3221 1:2992de38cf3e 232 gp++;
Nike3221 1:2992de38cf3e 233 pc.printf("gps_c is not match count_gps:%.1f\n",count_gps);
Nike3221 1:2992de38cf3e 234 }
Nike3221 1:2992de38cf3e 235 bit2=0;
Nike3221 1:2992de38cf3e 236 }
Nike3221 1:2992de38cf3e 237
Nike3221 1:2992de38cf3e 238
Nike3221 1:2992de38cf3e 239 return 0;
Nike3221 1:2992de38cf3e 240 }
Nike3221 1:2992de38cf3e 241
Nike3221 1:2992de38cf3e 242 int offset(float x_rd,float y_rd)
Nike3221 1:2992de38cf3e 243 {
Nike3221 1:2992de38cf3e 244
Nike3221 1:2992de38cf3e 245 if(x_max == 0 || y_max == 0 || x_min == 0 || y_min == 0) {
Nike3221 1:2992de38cf3e 246 x_max = -1000.0;//x,yの最大値を初期化 +-32500
Nike3221 1:2992de38cf3e 247 y_max = -1000.0;
Nike3221 1:2992de38cf3e 248 x_min = 1000.0;
Nike3221 1:2992de38cf3e 249 y_min = 1000.0;
Nike3221 1:2992de38cf3e 250 }//最大値、最小値に0が入った時初期化
Nike3221 1:2992de38cf3e 251
Nike3221 1:2992de38cf3e 252 if(x_max<x_rd && x_rd != 0) {
Nike3221 1:2992de38cf3e 253 x_max=x_rd;
Nike3221 1:2992de38cf3e 254 }
Nike3221 1:2992de38cf3e 255
Nike3221 1:2992de38cf3e 256 if(y_max<y_rd && y_rd != 0) {
Nike3221 1:2992de38cf3e 257 y_max=y_rd;
Nike3221 1:2992de38cf3e 258 }
Nike3221 1:2992de38cf3e 259
Nike3221 1:2992de38cf3e 260 if(x_min>x_rd && x_rd != 0) {
Nike3221 1:2992de38cf3e 261 x_min=x_rd;
Nike3221 1:2992de38cf3e 262 }
Nike3221 1:2992de38cf3e 263
Nike3221 1:2992de38cf3e 264 if(y_min>y_rd && y_rd != 0) {
Nike3221 1:2992de38cf3e 265 y_min=y_rd;
Nike3221 1:2992de38cf3e 266 }
Nike3221 3:8d904225adfd 267
Nike3221 3:8d904225adfd 268 if(count_offset > 300)
Nike3221 3:8d904225adfd 269 {
Nike3221 2:6f9881435f17 270 offset_x = (x_min+x_max)/2;
Nike3221 2:6f9881435f17 271 offset_y = (y_min+y_max)/2;
Nike3221 1:2992de38cf3e 272
Nike3221 2:6f9881435f17 273 if(0 < offset_x)
Nike3221 3:8d904225adfd 274 { x_dat = con_x + offset_x; }
Nike3221 3:8d904225adfd 275 else if(0 > offset_x)
Nike3221 3:8d904225adfd 276 { x_dat = con_x - offset_x; }
Nike3221 3:8d904225adfd 277
Nike3221 3:8d904225adfd 278 if(0 < offset_y)
Nike3221 3:8d904225adfd 279 { y_dat = con_y - offset_y; }
Nike3221 3:8d904225adfd 280 else if(0 > offset_y)
Nike3221 3:8d904225adfd 281 { y_dat = con_y + offset_y; }
Nike3221 3:8d904225adfd 282
Nike3221 3:8d904225adfd 283 /*
Nike3221 3:8d904225adfd 284 if(0 < offset_x)
Nike3221 2:6f9881435f17 285 { x_dat = con_x + offset_x*1.3; }
Nike3221 2:6f9881435f17 286 else if(0 > offset_x)
Nike3221 2:6f9881435f17 287 { x_dat = con_x - offset_x*1.3; }
Nike3221 2:6f9881435f17 288
Nike3221 2:6f9881435f17 289 if(0 < offset_y)
Nike3221 2:6f9881435f17 290 { y_dat = con_y + offset_y*1.3; }
Nike3221 2:6f9881435f17 291 else if(0 > offset_y)
Nike3221 3:8d904225adfd 292 { y_dat = con_y - offset_y*1.3; }*/
Nike3221 3:8d904225adfd 293 }
Nike3221 1:2992de38cf3e 294
Nike3221 1:2992de38cf3e 295 pc.printf("x: %d , y: %d , x_dat: %f , y_dat: %f , x_max: %.5f , x_min: %.5f , direction: %f \n",con_x, con_y, x_rd, y_rd, x_max, x_min, direction);
Nike3221 1:2992de38cf3e 296 return 0;
Nike3221 1:2992de38cf3e 297 }
Nike3221 1:2992de38cf3e 298
Nike3221 1:2992de38cf3e 299 void cal_gps()
Nike3221 1:2992de38cf3e 300 {
Nike3221 3:8d904225adfd 301 /*if(latitude_target > latitude1 && longitude_target > longitude1)//第1象限
Nike3221 1:2992de38cf3e 302 {quadrant = 1;}
Nike3221 1:2992de38cf3e 303 if(latitude_target > latitude1 && longitude_target < longitude1)
Nike3221 1:2992de38cf3e 304 {quadrant = 2;}
Nike3221 1:2992de38cf3e 305 if(latitude_target < latitude1 && longitude_target < longitude1)
Nike3221 1:2992de38cf3e 306 {quadrant = 3;}
Nike3221 1:2992de38cf3e 307 if(latitude_target < latitude1 && longitude_target < longitude1)
Nike3221 3:8d904225adfd 308 {quadrant = 4;}*/
Nike3221 1:2992de38cf3e 309
Nike3221 1:2992de38cf3e 310 y_target = (latitude_target-latitude1)*111319.49;
Nike3221 1:2992de38cf3e 311 x_target = (longitude_target-longitude1)*cos(latitude1*(3.1415926535/180))*111319.49;
Nike3221 1:2992de38cf3e 312 d_target = sqrt(pow(con_x,2.0)*pow(con_y,2.0));//目的地までの距離
Nike3221 1:2992de38cf3e 313
Nike3221 1:2992de38cf3e 314 angle_caly = cos(latitude_target)*sin(longitude_target-longitude1);
Nike3221 2:6f9881435f17 315 angle_calx = cos(latitude1)*(sin(latitude_target)-sin(latitude1))*cos(latitude_target)*cos(longitude_target-longitude1);
Nike3221 1:2992de38cf3e 316 sita = atan2(angle_caly,angle_calx);
Nike3221 1:2992de38cf3e 317 if(sita < 0)
Nike3221 1:2992de38cf3e 318 {sita = sita + 2*3.1415926535;}
Nike3221 2:6f9881435f17 319 direction_target = sita*57.29578;
Nike3221 1:2992de38cf3e 320 }
Nike3221 1:2992de38cf3e 321
Nike3221 1:2992de38cf3e 322 void cal_con()
Nike3221 1:2992de38cf3e 323 {
Nike3221 1:2992de38cf3e 324
Nike3221 2:6f9881435f17 325 direction = atan2(y_dat,x_dat);
Nike3221 1:2992de38cf3e 326 if(direction < 0)
Nike3221 1:2992de38cf3e 327 {direction = direction + 2*3.1415926535;}
Nike3221 2:6f9881435f17 328 direction = direction*57.29578; //ラジアンに変換
Nike3221 2:6f9881435f17 329 //direction = (atan(y_cal/x_cal))*57.29578;
Nike3221 1:2992de38cf3e 330
Nike3221 1:2992de38cf3e 331 if(0 < direction && 89 > direction){
Nike3221 1:2992de38cf3e 332 angle_c = 'N';}
Nike3221 1:2992de38cf3e 333
Nike3221 1:2992de38cf3e 334 else if(90 < direction && 179 > direction){
Nike3221 1:2992de38cf3e 335 angle_c = 'E';}
Nike3221 1:2992de38cf3e 336
Nike3221 1:2992de38cf3e 337 else if(180 < direction && 269 > direction || -180 < direction && -91 > direction){
Nike3221 1:2992de38cf3e 338 angle_c = 'S';}
Nike3221 1:2992de38cf3e 339
Nike3221 1:2992de38cf3e 340 else if(270 < direction && 359 > direction || -90 < direction && -1 > direction){
Nike3221 1:2992de38cf3e 341 angle_c = 'W';}
Nike3221 1:2992de38cf3e 342
Nike3221 1:2992de38cf3e 343 else{ angle_c = '?';}
Nike3221 1:2992de38cf3e 344
Nike3221 1:2992de38cf3e 345 }
Nike3221 1:2992de38cf3e 346
Nike3221 1:2992de38cf3e 347 void trigger()
Nike3221 1:2992de38cf3e 348 {
Nike3221 1:2992de38cf3e 349 //trg = 1;
Nike3221 1:2992de38cf3e 350 bit2 = 1;
Nike3221 1:2992de38cf3e 351 wait_us(10);
Nike3221 1:2992de38cf3e 352 //trg = 0;
Nike3221 1:2992de38cf3e 353 bit2 = 0;
Nike3221 1:2992de38cf3e 354 }
Nike3221 1:2992de38cf3e 355
Nike3221 1:2992de38cf3e 356 void rise_echo()//立ち上がり割り込み
Nike3221 1:2992de38cf3e 357 {
Nike3221 1:2992de38cf3e 358 //sig=1;
Nike3221 1:2992de38cf3e 359 ActiveTime.start();
Nike3221 1:2992de38cf3e 360 __disable_irq();
Nike3221 1:2992de38cf3e 361 }
Nike3221 1:2992de38cf3e 362
Nike3221 1:2992de38cf3e 363 void fall_echo()//落ち込み割り込み
Nike3221 1:2992de38cf3e 364 {
Nike3221 1:2992de38cf3e 365 //sig=0;
Nike3221 1:2992de38cf3e 366 ActiveTime.stop();
Nike3221 1:2992de38cf3e 367 if(ActiveTime.read_us() > 0.00002){
Nike3221 1:2992de38cf3e 368 sig_time = ActiveTime.read_us()/6.169;}
Nike3221 1:2992de38cf3e 369 ActiveTime.reset();
Nike3221 1:2992de38cf3e 370
Nike3221 1:2992de38cf3e 371 if(local_on == 1){
Nike3221 1:2992de38cf3e 372 bit1=1;
Nike3221 1:2992de38cf3e 373 FILE *fp = fopen("/local/ultra.txt","a");
Nike3221 1:2992de38cf3e 374 fprintf(fp,"%f\n",sig_time);
Nike3221 1:2992de38cf3e 375 fclose(fp);
Nike3221 1:2992de38cf3e 376 bit1=0;}
Nike3221 1:2992de38cf3e 377 }
Nike3221 1:2992de38cf3e 378
Nike3221 1:2992de38cf3e 379
Nike3221 1:2992de38cf3e 380 void first_sequence()
Nike3221 1:2992de38cf3e 381 {
Nike3221 1:2992de38cf3e 382 if(count_move==0)
Nike3221 1:2992de38cf3e 383 {count_move=1;}
Nike3221 1:2992de38cf3e 384 }
Nike3221 1:2992de38cf3e 385
Nike3221 2:6f9881435f17 386 void turn_sequence()
Nike3221 2:6f9881435f17 387 {
Nike3221 2:6f9881435f17 388 __disable_irq();
Nike3221 2:6f9881435f17 389 pc.printf("************turn_sequence*************\n");
Nike3221 2:6f9881435f17 390 pc.printf("direction: %f direction_target: %f\n",direction,direction_target);
Nike3221 2:6f9881435f17 391 longitudegosa = longitude_target-longitude1;
Nike3221 2:6f9881435f17 392 latitudegosa = latitude_target-latitude1;
Nike3221 2:6f9881435f17 393
Nike3221 2:6f9881435f17 394 if(direction > direction_target+2.0)
Nike3221 2:6f9881435f17 395 { while(direction > direction_target+2.0)
Nike3221 2:6f9881435f17 396 {
Nike3221 2:6f9881435f17 397 pc.printf("turn clockwise \ndirection: %f direction_target: %f\n",direction,direction_target);
Nike3221 2:6f9881435f17 398
Nike3221 2:6f9881435f17 399 FILE *fp = fopen("/local/turn.txt","a");
Nike3221 2:6f9881435f17 400 fprintf(fp,"%c,%d,%d,%f,%f,%f,%f\n",angle_c,con_x,con_y,x_dat,y_dat,direction_target,direction);
Nike3221 2:6f9881435f17 401 fclose(fp);
Nike3221 2:6f9881435f17 402
Nike3221 2:6f9881435f17 403 mag.getX(&con_x);//コンパス読み込み
Nike3221 2:6f9881435f17 404 mag.getY(&con_y);
Nike3221 2:6f9881435f17 405 offset(con_x,con_y);//x,y オフセット計算
Nike3221 2:6f9881435f17 406 cal_con();
Nike3221 3:8d904225adfd 407
Nike3221 3:8d904225adfd 408 motor_l.pulsewidth(motor_palse*0.7);
Nike3221 3:8d904225adfd 409 motor_r.pulsewidth(motor_palse*0.35);
Nike3221 2:6f9881435f17 410 }}
Nike3221 2:6f9881435f17 411
Nike3221 2:6f9881435f17 412 else if(direction < direction_target-2.0)
Nike3221 2:6f9881435f17 413 { while(direction < direction_target-2.0)
Nike3221 2:6f9881435f17 414 {
Nike3221 2:6f9881435f17 415 pc.printf("turn anti clockwise \ndirection: %f direction_target: %f\n",direction,direction_target);
Nike3221 2:6f9881435f17 416
Nike3221 2:6f9881435f17 417 FILE *fp = fopen("/local/turn2.txt","a");
Nike3221 2:6f9881435f17 418 fprintf(fp,"%c,%d,%d,%f,%f,%f,%f\n",angle_c,con_x,con_y,x_dat,y_dat,direction_target,direction);
Nike3221 2:6f9881435f17 419 fclose(fp);
Nike3221 2:6f9881435f17 420
Nike3221 2:6f9881435f17 421 mag.getX(&con_x);//コンパス読み込み
Nike3221 2:6f9881435f17 422 mag.getY(&con_y);
Nike3221 2:6f9881435f17 423 offset(con_x,con_y);//x,y オフセット計算
Nike3221 2:6f9881435f17 424 cal_con();
Nike3221 3:8d904225adfd 425
Nike3221 3:8d904225adfd 426 motor_r.pulsewidth(motor_palse*0.7);
Nike3221 3:8d904225adfd 427 motor_l.pulsewidth(motor_palse*0.35);
Nike3221 3:8d904225adfd 428 }}
Nike3221 3:8d904225adfd 429
Nike3221 2:6f9881435f17 430 motor_r.pulsewidth(motor_palse*0.8);
Nike3221 3:8d904225adfd 431 motor_l.pulsewidth(motor_palse*0.8);
Nike3221 2:6f9881435f17 432
Nike3221 2:6f9881435f17 433 pc.printf("direction: %f direction_target: %f\n",direction,direction_target);
Nike3221 2:6f9881435f17 434
Nike3221 2:6f9881435f17 435 pc.printf("************turn_sequence end*************\n");
Nike3221 2:6f9881435f17 436
Nike3221 2:6f9881435f17 437 }
Nike3221 2:6f9881435f17 438
Nike3221 1:2992de38cf3e 439 void move()
Nike3221 1:2992de38cf3e 440 {
Nike3221 1:2992de38cf3e 441 switch(count_move)
Nike3221 1:2992de38cf3e 442 {
Nike3221 1:2992de38cf3e 443 case 1:
Nike3221 2:6f9881435f17 444
Nike3221 1:2992de38cf3e 445 pc.printf("*************case1**************\n");
Nike3221 2:6f9881435f17 446 motor_l.pulsewidth(0.01); //パルス幅
Nike3221 2:6f9881435f17 447 motor_r.pulsewidth(0.01);
Nike3221 1:2992de38cf3e 448 wait(10);//落下時間
Nike3221 1:2992de38cf3e 449
Nike3221 1:2992de38cf3e 450 servo.pulsewidth(servo_palse);
Nike3221 1:2992de38cf3e 451
Nike3221 1:2992de38cf3e 452 /*if(direction <= direction_target+3 && direction >= direction_target-3)
Nike3221 1:2992de38cf3e 453 {count_move++;}*/
Nike3221 1:2992de38cf3e 454 count_move++;
Nike3221 1:2992de38cf3e 455 pc.printf("*************case1 end**************\n");
Nike3221 1:2992de38cf3e 456 break;
Nike3221 2:6f9881435f17 457
Nike3221 1:2992de38cf3e 458 case 2:
Nike3221 2:6f9881435f17 459 __disable_irq();
Nike3221 1:2992de38cf3e 460 pc.printf("*************case2**************\n");
Nike3221 1:2992de38cf3e 461 pc.printf("direction: %f direction_target: %f\n",direction,direction_target);
Nike3221 1:2992de38cf3e 462 longitudegosa = longitude_target-longitude1;
Nike3221 1:2992de38cf3e 463 latitudegosa = latitude_target-latitude1;
Nike3221 2:6f9881435f17 464
Nike3221 2:6f9881435f17 465 if(direction > direction_target+2.0)
Nike3221 2:6f9881435f17 466 { while(direction > direction_target+2.0)
Nike3221 1:2992de38cf3e 467 {
Nike3221 2:6f9881435f17 468 pc.printf("turn clockwise \ndirection: %f direction_target: %f\n",direction,direction_target);
Nike3221 2:6f9881435f17 469
Nike3221 2:6f9881435f17 470 FILE *fp = fopen("/local/turn.txt","a");
Nike3221 2:6f9881435f17 471 fprintf(fp,"%c,%d,%d,%f,%f,%f,%f\n",angle_c,con_x,con_y,x_dat,y_dat,direction_target,direction);
Nike3221 2:6f9881435f17 472 fclose(fp);
Nike3221 2:6f9881435f17 473
Nike3221 1:2992de38cf3e 474 mag.getX(&con_x);//コンパス読み込み
Nike3221 1:2992de38cf3e 475 mag.getY(&con_y);
Nike3221 1:2992de38cf3e 476 offset(con_x,con_y);//x,y オフセット計算
Nike3221 1:2992de38cf3e 477 cal_con();
Nike3221 2:6f9881435f17 478
Nike3221 2:6f9881435f17 479 /*gps_read();
Nike3221 2:6f9881435f17 480 gps_save();
Nike3221 2:6f9881435f17 481 cal_gps();回転しすぎる*/
Nike3221 2:6f9881435f17 482 motor_l.pulsewidth(motor_palse*0.7);
Nike3221 2:6f9881435f17 483 motor_r.pulsewidth(motor_palse*0.35);}
Nike3221 2:6f9881435f17 484 motor_r.pulsewidth(motor_palse);
Nike3221 2:6f9881435f17 485 motor_l.pulsewidth(motor_palse);
Nike3221 2:6f9881435f17 486 }
Nike3221 1:2992de38cf3e 487
Nike3221 2:6f9881435f17 488 else if(direction < direction_target-2.0)
Nike3221 2:6f9881435f17 489 { while(direction < direction_target-2.0)
Nike3221 1:2992de38cf3e 490 {
Nike3221 2:6f9881435f17 491 pc.printf("turn anti clockwise \ndirection: %f direction_target: %f\n",direction,direction_target);
Nike3221 2:6f9881435f17 492
Nike3221 2:6f9881435f17 493 FILE *fp = fopen("/local/turn2.txt","a");
Nike3221 2:6f9881435f17 494 fprintf(fp,"%c,%d,%d,%f,%f,%f,%f\n",angle_c,con_x,con_y,x_dat,y_dat,direction_target,direction);
Nike3221 2:6f9881435f17 495 fclose(fp);
Nike3221 2:6f9881435f17 496
Nike3221 1:2992de38cf3e 497 mag.getX(&con_x);//コンパス読み込み
Nike3221 1:2992de38cf3e 498 mag.getY(&con_y);
Nike3221 1:2992de38cf3e 499 offset(con_x,con_y);//x,y オフセット計算
Nike3221 1:2992de38cf3e 500 cal_con();
Nike3221 1:2992de38cf3e 501
Nike3221 2:6f9881435f17 502 /*gps_read();
Nike3221 2:6f9881435f17 503 gps_save();
Nike3221 2:6f9881435f17 504 cal_gps();回転しすぎる*/
Nike3221 2:6f9881435f17 505 motor_r.pulsewidth(motor_palse*0.7);
Nike3221 2:6f9881435f17 506 motor_l.pulsewidth(motor_palse*0.35);}
Nike3221 2:6f9881435f17 507 motor_r.pulsewidth(motor_palse);
Nike3221 2:6f9881435f17 508 motor_l.pulsewidth(motor_palse);
Nike3221 2:6f9881435f17 509 }
Nike3221 2:6f9881435f17 510
Nike3221 3:8d904225adfd 511 if(direction <= direction_target+2.0 && direction >= direction_target-2.0)
Nike3221 2:6f9881435f17 512 { pc.printf("front \n");
Nike3221 2:6f9881435f17 513 motor_l.pulsewidth(motor_palse); //パルス幅
Nike3221 2:6f9881435f17 514 motor_r.pulsewidth(motor_palse);
Nike3221 2:6f9881435f17 515 count_move++;}
Nike3221 1:2992de38cf3e 516
Nike3221 1:2992de38cf3e 517 pc.printf("direction: %f direction_target: %f\n",direction,direction_target);
Nike3221 1:2992de38cf3e 518
Nike3221 1:2992de38cf3e 519 pc.printf("*************case2 end**************\n");
Nike3221 1:2992de38cf3e 520
Nike3221 1:2992de38cf3e 521 break;
Nike3221 2:6f9881435f17 522 case 3:
Nike3221 3:8d904225adfd 523 motor_l.pulsewidth(0.0); //パルス幅
Nike3221 3:8d904225adfd 524 motor_r.pulsewidth(0.0);
Nike3221 1:2992de38cf3e 525
Nike3221 2:6f9881435f17 526 gps_read();
Nike3221 2:6f9881435f17 527 gps_save();
Nike3221 2:6f9881435f17 528 cal_gps();
Nike3221 3:8d904225adfd 529
Nike3221 3:8d904225adfd 530 mag.getX(&con_x);//コンパス読み込み
Nike3221 3:8d904225adfd 531 mag.getY(&con_y);
Nike3221 3:8d904225adfd 532 offset(con_x,con_y);//x,y オフセット計算
Nike3221 3:8d904225adfd 533 cal_con();
Nike3221 3:8d904225adfd 534
Nike3221 3:8d904225adfd 535 turn_sequence();
Nike3221 3:8d904225adfd 536
Nike3221 3:8d904225adfd 537 motor_l.pulsewidth(motor_palse*0.8); //パルス幅
Nike3221 3:8d904225adfd 538 motor_r.pulsewidth(motor_palse*0.8);
Nike3221 3:8d904225adfd 539
Nike3221 2:6f9881435f17 540
Nike3221 2:6f9881435f17 541 longitudegosa = longitude_target-longitude1;
Nike3221 2:6f9881435f17 542 latitudegosa = latitude_target-latitude1;
Nike3221 2:6f9881435f17 543
Nike3221 2:6f9881435f17 544 if( abs(longitudegosa)<=0.1 && abs(latitudegosa)<=0.1 )
Nike3221 2:6f9881435f17 545 { pc.printf("front \n");
Nike3221 2:6f9881435f17 546 count_move++; }
Nike3221 2:6f9881435f17 547
Nike3221 2:6f9881435f17 548 break;
Nike3221 2:6f9881435f17 549 case 4:
Nike3221 1:2992de38cf3e 550 pc.printf("*************case3**************\n");
Nike3221 2:6f9881435f17 551
Nike3221 2:6f9881435f17 552 __enable_irq();
Nike3221 1:2992de38cf3e 553 trigger();
Nike3221 1:2992de38cf3e 554 //distance.rise(rise_echo);
Nike3221 1:2992de38cf3e 555 //distance.fall(fall_echo);
Nike3221 1:2992de38cf3e 556
Nike3221 2:6f9881435f17 557 pc.printf("sig_time: %f\n",sig_time);
Nike3221 1:2992de38cf3e 558
Nike3221 2:6f9881435f17 559 if(sig_time <= 100.0)//100mm以下に近づいたとき停止
Nike3221 2:6f9881435f17 560 { pc.printf("sig_time is 100mm or under: %f\n",sig_time);
Nike3221 2:6f9881435f17 561 count_move++;}
Nike3221 1:2992de38cf3e 562 else
Nike3221 1:2992de38cf3e 563 {
Nike3221 3:8d904225adfd 564 turn_sequence();
Nike3221 1:2992de38cf3e 565 motor_l.pulsewidth(motor_palse/2); //パルス幅
Nike3221 1:2992de38cf3e 566 motor_r.pulsewidth(motor_palse/2);
Nike3221 1:2992de38cf3e 567 }
Nike3221 1:2992de38cf3e 568
Nike3221 1:2992de38cf3e 569 break;
Nike3221 1:2992de38cf3e 570
Nike3221 1:2992de38cf3e 571 default:
Nike3221 1:2992de38cf3e 572 motor_l.pulsewidth(0.0);
Nike3221 1:2992de38cf3e 573 motor_r.pulsewidth(0.0);
Nike3221 2:6f9881435f17 574
Nike3221 1:2992de38cf3e 575 break;
Nike3221 1:2992de38cf3e 576
Nike3221 1:2992de38cf3e 577 }
Nike3221 0:029ef267b1bc 578
Nike3221 0:029ef267b1bc 579 }
Nike3221 0:029ef267b1bc 580
Nike3221 0:029ef267b1bc 581
Nike3221 1:2992de38cf3e 582 void con_save()
Nike3221 1:2992de38cf3e 583 {
Nike3221 0:029ef267b1bc 584
Nike3221 0:029ef267b1bc 585 bit1=1;//led4を1にしてデータを保存
Nike3221 0:029ef267b1bc 586 FILE *fp = fopen("/local/commpas_new.txt","a");
Nike3221 1:2992de38cf3e 587 fprintf(fp,"%c,%f,%f,%f,%f\n",angle_c,d_target,x_dat,y_dat,direction);
Nike3221 1:2992de38cf3e 588 //fprintf(fp,"%d,%d,%d,%d,%d\n",x,y,z,offset_x,offset_y);
Nike3221 1:2992de38cf3e 589 fclose(fp);
Nike3221 1:2992de38cf3e 590 bit1=0;
Nike3221 0:029ef267b1bc 591 }
Nike3221 0:029ef267b1bc 592
Nike3221 1:2992de38cf3e 593 void dele()
Nike3221 1:2992de38cf3e 594 {
Nike3221 1:2992de38cf3e 595
Nike3221 0:029ef267b1bc 596 bit2=1;//led3を1
Nike3221 1:2992de38cf3e 597
Nike3221 0:029ef267b1bc 598 remove("/local/commpas_new.txt");
Nike3221 0:029ef267b1bc 599 remove("/local/gps.txt");
Nike3221 1:2992de38cf3e 600
Nike3221 0:029ef267b1bc 601 bit2=0;
Nike3221 0:029ef267b1bc 602 }
Nike3221 0:029ef267b1bc 603
Nike3221 1:2992de38cf3e 604 int main()
Nike3221 1:2992de38cf3e 605 {
Nike3221 1:2992de38cf3e 606 bit1 = 1;
Nike3221 1:2992de38cf3e 607 pc.printf("start\n");
Nike3221 1:2992de38cf3e 608 //__disable_irq();//割り込み禁止
Nike3221 1:2992de38cf3e 609 init(); //初期化
Nike3221 1:2992de38cf3e 610 //cds.rise(first_sequence);//cds立ち上がり割り込み
Nike3221 1:2992de38cf3e 611 cds.fall(&first_sequence);//cds落ち込み割り込み
Nike3221 1:2992de38cf3e 612 mag.sampleRate(0x40);
Nike3221 0:029ef267b1bc 613 mag.enable();//コンパス有効化
Nike3221 1:2992de38cf3e 614 mag.getX(&con_x);//コンパス読み込み
Nike3221 1:2992de38cf3e 615 mag.getY(&con_y);
Nike3221 1:2992de38cf3e 616 mag.getZ(&con_z);
Nike3221 3:8d904225adfd 617
Nike3221 3:8d904225adfd 618 motor_r.pulsewidth(motor_palse*0.7);
Nike3221 3:8d904225adfd 619 motor_l.pulsewidth(motor_palse*0.35);
Nike3221 3:8d904225adfd 620
Nike3221 2:6f9881435f17 621 for(count_offset=0; count_offset < 300; count_offset++)//300個分のサンプ取得
Nike3221 2:6f9881435f17 622 {
Nike3221 2:6f9881435f17 623 mag.getX(&con_x);//コンパス読み込み
Nike3221 2:6f9881435f17 624 mag.getY(&con_y);
Nike3221 2:6f9881435f17 625 mag.getZ(&con_z);
Nike3221 2:6f9881435f17 626 offset(con_x,con_y);
Nike3221 2:6f9881435f17 627 cal_con();
Nike3221 2:6f9881435f17 628
Nike3221 2:6f9881435f17 629 if(local_on2==1)
Nike3221 2:6f9881435f17 630 {
Nike3221 2:6f9881435f17 631 FILE *fp = fopen("/local/first_con.txt","a");
Nike3221 2:6f9881435f17 632 fprintf(fp,"%c,%d,%d,%f,%f,%f,%f\n",angle_c,con_x,con_y,x_dat,y_dat,direction_target,direction);
Nike3221 2:6f9881435f17 633 fclose(fp);
Nike3221 2:6f9881435f17 634 }
Nike3221 2:6f9881435f17 635 }
Nike3221 3:8d904225adfd 636 motor_r.pulsewidth(motor_palse*0.0);
Nike3221 3:8d904225adfd 637 motor_l.pulsewidth(motor_palse*0.0);
Nike3221 1:2992de38cf3e 638 bit1 = 0;
Nike3221 0:029ef267b1bc 639
Nike3221 1:2992de38cf3e 640 while(1) {
Nike3221 1:2992de38cf3e 641
Nike3221 1:2992de38cf3e 642 __enable_irq();//割り込み許可
Nike3221 1:2992de38cf3e 643 mag.getX(&con_x);//コンパス読み込み
Nike3221 1:2992de38cf3e 644 mag.getY(&con_y);
Nike3221 1:2992de38cf3e 645 offset(con_x,con_y);//x,y オフセット計算
Nike3221 1:2992de38cf3e 646 cal_con();
Nike3221 1:2992de38cf3e 647
Nike3221 1:2992de38cf3e 648 gps_read();
Nike3221 1:2992de38cf3e 649 gps_save();
Nike3221 1:2992de38cf3e 650 cal_gps();
Nike3221 1:2992de38cf3e 651
Nike3221 1:2992de38cf3e 652 /*if(cds == 0)
Nike3221 1:2992de38cf3e 653 {first_sequence();
Nike3221 1:2992de38cf3e 654 bit5=1;}*/
Nike3221 1:2992de38cf3e 655
Nike3221 1:2992de38cf3e 656 move();
Nike3221 1:2992de38cf3e 657
Nike3221 1:2992de38cf3e 658 if(local_on == 1)
Nike3221 1:2992de38cf3e 659 { con_save(); } //pin20がhighの時、データ保存
Nike3221 1:2992de38cf3e 660 /*if(local_del == 1)
Nike3221 1:2992de38cf3e 661 { dele(); }*/ //pin19がhighの時、保存したデータを消去
Nike3221 1:2992de38cf3e 662
Nike3221 1:2992de38cf3e 663 }
Nike3221 0:029ef267b1bc 664 }