Zack Motter
/
Circuit
mbed Code for Multi-Waypoint Tests
main.cpp
- Committer:
- landnavvest
- Date:
- 2014-04-29
- Revision:
- 0:a955f7fabdf5
File content as of revision 0:a955f7fabdf5:
#include "mbed.h" Serial pc(USBTX, USBRX); // tx, rx for PC Serial mag(p28, p27); // tx,rx for Magnetometer Serial gps(p9, p10); //tx, rx for GPS // GPS is 9,10; MAG is 28,27 DigitalOut on(LED1); // running lights DigitalOut test_led(LED2); // extra for testing DigitalOut front(p21); /// Connect LED cathode to pin 21 DigitalOut frontR(p22); DigitalOut R(p23); DigitalOut back(p24); DigitalOut L(p25); DigitalOut frontL(p26); float dir_m,dir_t,rel,decl,latitude,longitude,lock,degrees,minutes,uttime,old_lat,old_long; float san_coop_lat,san_coop_long; float lat_1,long_1,lat_2,long_2,lat_3,long_3; int waypoint; int wait_front,wait_front_cycle; char ns,ew; bool there,gps_lock; float PI = 3.1415926535; float course_to,gps_t,gps_m; double meters_to; /* Instructions: 1) f10 to download to mbed, save it. 2) TeraTerm, serial, port 6 (MBED) 3) Tera Term, setup>serialport>baudrate (921600), setup>terminal>newline (LF) */ int main() { //Declarations gps.baud(4800); pc.baud(9600); mag.baud(19200); pc.printf("Starting...\n"); lat_1=38.983148; long_1= -76.484680; lat_2=38.984525; long_2=-76.483457; lat_3=38.984045; long_3=-76.484192; waypoint=1; there = 0; gps_lock = 0; wait_front_cycle=3; wait_front=wait_front_cycle; decl = -11.11; //11.11 WEST while(1) { // Read Serial //pc.printf("^1"); if(mag.readable()) { while (mag.getc() != '$'); { //mag.scanf("HCHDT,%f,T*%c%c",&dir,&cs1,&cs2); //pc.printf("MAG dir = %f, cs = %c%c\n", dir, cs1,cs2); mag.scanf("HCHDT,%f,",&dir_m); //pc.printf("_read_mag"); dir_t=dir_m+decl; } } //pc.printf("^2"); if(gps.readable()){ gps.getc();} //pc.printf("_buffer"); if(gps.readable()){ while (gps.getc()!='$');{ if(gps.scanf("GPGGA,%f,%f,%c,%f,%c",&uttime, &latitude, &ns, &longitude, &ew)) { //pc.printf("_read_gps"); gps_lock=1; } } } //pc.printf("_%c",ew); degrees = floor(latitude / 100.0); minutes = latitude - (degrees * 100.0); latitude = degrees + minutes / 60.0; degrees = floor(longitude / 100.0); minutes = longitude - (degrees * 100.0); longitude = degrees + minutes / 60.0; //pc.printf("_b_%f",longitude); if(ns == 'S') { latitude *= -1.0;} if(ew == 'W') { longitude *= -1.0;} //pc.printf("_a_%f",longitude); if(gps_lock==0) { longitude=old_long; latitude=old_lat; } old_lat=latitude; old_long=longitude; gps_lock=0; //pc.printf("^3"); if(waypoint==1){ san_coop_lat=lat_1; san_coop_long=long_1; } else if (waypoint ==2){ san_coop_lat=lat_2; san_coop_long=long_2; } else if (waypoint ==3){ san_coop_lat=lat_3; san_coop_long=long_3; } const double d2r = PI / 180.0; const double r2d = 180.0 / PI; double dlat = abs(san_coop_lat - latitude) * d2r; double dlong = abs(san_coop_long - longitude) * d2r; double x_sign = san_coop_long-longitude; double y = sin(dlong) * cos(san_coop_lat * d2r); double x = cos(latitude*d2r)*sin(san_coop_lat*d2r) - sin(latitude*d2r)*cos(san_coop_lat*d2r)*cos(dlong); course_to = atan2(y,x)*r2d; if (x_sign<0){ course_to=-course_to+360;} // calculate range/bearing /*float deltalat = abs(san_coop_lat - latitude); float deltalon = abs(san_coop_long - longitude); float deltalatr = deltalat *(PI/180); float deltalonr = deltalon *(PI/180); //float d = sin(deltalatr/2.0); //float x = pow(d,2.0); //float y = cos(latitude*(PI/180))*cos(san_coop_lat*(PI/180))*(sin(deltalonr/2.0f)^2.0f); */ float a = pow(sin(dlat/2.0),2.0) + cos(latitude*(PI/180)) * cos(san_coop_lat*(PI/180)) * pow(sin(dlong/2.0),2.0); float c = 2*atan2(sqrt(a),sqrt(1-a)); float distft = (3956*c)*5280; //pc.printf("^4"); //course_to = (atan2(sin(-1*deltalonr)*cos(san_coop_lat*(PI/180)),cos(latitude*(PI/180))*sin(san_coop_lat*(PI/180))-sin(latitude*(PI/180))*cos(san_coop_lat*(PI/180))*cos(-1*deltalonr)))*(180/PI); //course_to = gps.calc_course_to(san_coop_lat,san_coop_long); //meters_to = gps.calc_dist_to_m(san_coop_lat,san_coop_long); rel = course_to-dir_t; if (rel<0) { rel=rel+360;} if (distft<30){ there=1;} //pc.printf("^5"); pc.printf("mag_%f,lat_%f,long_%f,c2_%f,d2_%f,rel_%f,urhere_%d\n",dir_t,latitude,longitude,course_to,distft,rel,there); //pc.printf("^6"); // LED or Motor if (rel<10||rel>350) { if (wait_front>=wait_front_cycle){ front = 1; wait_front=0;} wait_front++; } if (rel>10&&rel<35){ front = 1; frontR =1;} if (rel>35&&rel<55) { frontR=1;} if (rel>55&&rel<80) { frontR=1; R=1;} if (rel>80&&rel<100){ R=1;} if (rel>100&&rel<150){ R=1; back=1;} if (rel>150&&rel<210){ back=1;} if (rel>210&&rel<260){ back=1; L=1;} if(rel>260&&rel<280){ L=1;} if(rel>280&&rel<305){ L=1; frontL=1;} if(rel>305&&rel<325){ frontL=1;} if(rel>325&&rel<350){ frontL=1; front=1;} if(there){ front = 1; frontR = 1; R=1; back=1; L=1; frontL=1; wait(0.5); front = 0; frontR = 0; R=0; back=0; L=0; frontL=0; wait(0.5); front = 1; frontR = 1; R=1; back=1; L=1; frontL=1; wait(0.5); front = 0; frontR = 0; R=0; back=0; L=0; frontL=0; wait(0.5); front = 1; frontR = 1; R=1; back=1; L=1; frontL=1; wait(0.5); there = 0; waypoint=waypoint+1; } //pc.printf("^7"); wait(.5); front = 0; frontR = 0; R=0; back=0; L=0; frontL=0; //pc.printf("^8"); } }