This program is made for the GPS Robot Car contest 2014
Dependencies: Servo TextLCD USBHost mbed
Presentation for Geospatial EXPO 2014. /media/uploads/hayama/presen.pdf
main.cpp@0:c2262bac9aa6, 2014-11-13 (annotated)
- Committer:
- hayama
- Date:
- Thu Nov 13 15:33:47 2014 +0000
- Revision:
- 0:c2262bac9aa6
GPSrobotCar
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hayama | 0:c2262bac9aa6 | 1 | #include "mbed.h" |
hayama | 0:c2262bac9aa6 | 2 | #include "TextLCD.h" |
hayama | 0:c2262bac9aa6 | 3 | #include "Servo.h" |
hayama | 0:c2262bac9aa6 | 4 | #include "USBHostSerial.h" |
hayama | 0:c2262bac9aa6 | 5 | |
hayama | 0:c2262bac9aa6 | 6 | #define POSC 0.5 |
hayama | 0:c2262bac9aa6 | 7 | #define KANG 5 // factor of gyro output to angle rot right + val |
hayama | 0:c2262bac9aa6 | 8 | #define GYROADJ (-0.0001) |
hayama | 0:c2262bac9aa6 | 9 | #define FSMTHS 1 // smoothing factor for sensors |
hayama | 0:c2262bac9aa6 | 10 | |
hayama | 0:c2262bac9aa6 | 11 | // 各種定数または初期値の設定 |
hayama | 0:c2262bac9aa6 | 12 | #define PI 3.14159 // pai |
hayama | 0:c2262bac9aa6 | 13 | #define DEF_TNUM 1 |
hayama | 0:c2262bac9aa6 | 14 | |
hayama | 0:c2262bac9aa6 | 15 | // メニュー関係 |
hayama | 0:c2262bac9aa6 | 16 | int nmenu=36; |
hayama | 0:c2262bac9aa6 | 17 | const char *menuS[36]={ // メニューの文字列 |
hayama | 0:c2262bac9aa6 | 18 | "Disp GPS ","Set way point ","Disp way point ","Clear way point ","Read way point ", |
hayama | 0:c2262bac9aa6 | 19 | "Write way point ","Set team number ","Set QZSS Wp ","Read QZSS Wp ","Write QZSS Wp ", |
hayama | 0:c2262bac9aa6 | 20 | "Disp QZSS Msg ","Clear QZSS Msg ","Read QZSS Msg ","Write QZSS Msg ","Run GPS no Gyro ", |
hayama | 0:c2262bac9aa6 | 21 | "Run GPS use Gyro","Run QZSS no Gyro","Run QZSS use Gyr","Test servo ","Test motor ", |
hayama | 0:c2262bac9aa6 | 22 | "Init neutral ","Init steer min ","Set steer max ","Init WP radius ","Init Ks ", |
hayama | 0:c2262bac9aa6 | 23 | "Init KsGyro ","Init PosH ","Init PosL ","Init Speed H ","Init Speed L ", |
hayama | 0:c2262bac9aa6 | 24 | "Test Run ","Write parameter ","Read Parameter ","Test encoder ","Test Gyro ", |
hayama | 0:c2262bac9aa6 | 25 | "Test Compus " |
hayama | 0:c2262bac9aa6 | 26 | }; |
hayama | 0:c2262bac9aa6 | 27 | |
hayama | 0:c2262bac9aa6 | 28 | const double arrayCompus[]={180,225,45,0,135,270,90,315}; |
hayama | 0:c2262bac9aa6 | 29 | volatile double dirCompus; |
hayama | 0:c2262bac9aa6 | 30 | double rdCpy, dirCompusCpy; |
hayama | 0:c2262bac9aa6 | 31 | |
hayama | 0:c2262bac9aa6 | 32 | int pmode=0; |
hayama | 0:c2262bac9aa6 | 33 | volatile int recvGPS=0; |
hayama | 0:c2262bac9aa6 | 34 | volatile int recvQZSS=0; |
hayama | 0:c2262bac9aa6 | 35 | volatile long encR=0, encRB=0; |
hayama | 0:c2262bac9aa6 | 36 | volatile long encL=0, encLB=0; |
hayama | 0:c2262bac9aa6 | 37 | volatile int cntR=0; |
hayama | 0:c2262bac9aa6 | 38 | volatile int cntL=0; |
hayama | 0:c2262bac9aa6 | 39 | volatile int cntC=0; // center both cntR and cntL |
hayama | 0:c2262bac9aa6 | 40 | volatile int cntE=0; // timing counter for cntR/L read |
hayama | 0:c2262bac9aa6 | 41 | |
hayama | 0:c2262bac9aa6 | 42 | // gyro sensor |
hayama | 0:c2262bac9aa6 | 43 | volatile float gyro, gyItg, gyOff; |
hayama | 0:c2262bac9aa6 | 44 | volatile float angle; |
hayama | 0:c2262bac9aa6 | 45 | |
hayama | 0:c2262bac9aa6 | 46 | // ウェイポイント設定(基準点からのN,E方向への座標)、最高16ポイント |
hayama | 0:c2262bac9aa6 | 47 | int np=0; // soukoutyuu目標ポイントナンバー |
hayama | 0:c2262bac9aa6 | 48 | int wp=0; // number of waypoint, initial value read from file of "waypoint.txt" |
hayama | 0:c2262bac9aa6 | 49 | double wy[16]={0}; // latitude of waypoints |
hayama | 0:c2262bac9aa6 | 50 | double wx[16]={0}; // longitude of waypoints |
hayama | 0:c2262bac9aa6 | 51 | |
hayama | 0:c2262bac9aa6 | 52 | // QZSS-ウェイポイント設定(基準点からのN,E方向への座標)、最高16ポイント |
hayama | 0:c2262bac9aa6 | 53 | int npQ=0; // 目標ポイントナンバー |
hayama | 0:c2262bac9aa6 | 54 | int wpQ=0; // wp:0-15まで,ウェイポイントの数 -1 |
hayama | 0:c2262bac9aa6 | 55 | double wyQ11,wxQ11; |
hayama | 0:c2262bac9aa6 | 56 | double wyQ[8][8]={0}; // index 1 to 7, wyQ[A],[B] |
hayama | 0:c2262bac9aa6 | 57 | double wxQ[8][8]={0}; // index 1 to 7, wxQ[A],[B] |
hayama | 0:c2262bac9aa6 | 58 | |
hayama | 0:c2262bac9aa6 | 59 | double xQ11,yQ11,xQ71,yQ71,xQ17,yQ17,xQ77,yQ77,dxQ71,dyQ71,dxQ17,dyQ17; |
hayama | 0:c2262bac9aa6 | 60 | double theta; |
hayama | 0:c2262bac9aa6 | 61 | double magx,magy; |
hayama | 0:c2262bac9aa6 | 62 | |
hayama | 0:c2262bac9aa6 | 63 | |
hayama | 0:c2262bac9aa6 | 64 | // 走行処理関係変数 |
hayama | 0:c2262bac9aa6 | 65 | double gy, gx; // 北緯,東経を原点からの距離(メートル)に数値化 |
hayama | 0:c2262bac9aa6 | 66 | double ry, rx, rv, rd; // 北緯(正規化),東経(正規化),速度(ノット),方向(単位:度)の数値化 |
hayama | 0:c2262bac9aa6 | 67 | double dy, dx, dr, dd; // ウェイポイントに対する北緯,東経の差分(m),距離の差分,方位の差分 |
hayama | 0:c2262bac9aa6 | 68 | double ddCpy; // 走行中にddの保存 |
hayama | 0:c2262bac9aa6 | 69 | |
hayama | 0:c2262bac9aa6 | 70 | double wr; // ウェイポイントの半径 |
hayama | 0:c2262bac9aa6 | 71 | double ks; // ステアリング切れ角比例係数 |
hayama | 0:c2262bac9aa6 | 72 | double ksg; // ステアリング切れ角比例係数, with gyro |
hayama | 0:c2262bac9aa6 | 73 | |
hayama | 0:c2262bac9aa6 | 74 | float strn; // ニュートラルの位置 |
hayama | 0:c2262bac9aa6 | 75 | float posSteer; // ステアリングの位置 |
hayama | 0:c2262bac9aa6 | 76 | float strmin; // ステアリングの最小値 |
hayama | 0:c2262bac9aa6 | 77 | float strmax; // ステアリングの最大値 |
hayama | 0:c2262bac9aa6 | 78 | float posH, posL; // servo position for high/low speed of motor |
hayama | 0:c2262bac9aa6 | 79 | int spdH,spdL; // スピード, count of encoder per 100ms |
hayama | 0:c2262bac9aa6 | 80 | |
hayama | 0:c2262bac9aa6 | 81 | |
hayama | 0:c2262bac9aa6 | 82 | // GPS受信用変数,ポインタ |
hayama | 0:c2262bac9aa6 | 83 | char str[200]; // GPSほか読み取りのための文字列バッファ |
hayama | 0:c2262bac9aa6 | 84 | char *header; |
hayama | 0:c2262bac9aa6 | 85 | char *latitude, *longitude, *knot, *direct; |
hayama | 0:c2262bac9aa6 | 86 | double latit, longit, kn; // 緯度,経度,ノット保存用の変数 |
hayama | 0:c2262bac9aa6 | 87 | double latitB, longitB, rdB; // 差分で方位計算する時に前の座標保持用, 方位保管用 |
hayama | 0:c2262bac9aa6 | 88 | double dy2, dx2, rd2; // 一つ前の値との北緯,東経の差分(m),差分で求めた方位 |
hayama | 0:c2262bac9aa6 | 89 | |
hayama | 0:c2262bac9aa6 | 90 | // QZSS |
hayama | 0:c2262bac9aa6 | 91 | char strtmp[10]; |
hayama | 0:c2262bac9aa6 | 92 | char *messages; |
hayama | 0:c2262bac9aa6 | 93 | long teamNum,year,numA,sizeA,numB,sizeB,numT; |
hayama | 0:c2262bac9aa6 | 94 | long startA, startB; |
hayama | 0:c2262bac9aa6 | 95 | long targetA[20]; |
hayama | 0:c2262bac9aa6 | 96 | long targetB[20]; |
hayama | 0:c2262bac9aa6 | 97 | long tNum=0; |
hayama | 0:c2262bac9aa6 | 98 | |
hayama | 0:c2262bac9aa6 | 99 | InterruptIn ptR(p5); |
hayama | 0:c2262bac9aa6 | 100 | InterruptIn ptL(p6); |
hayama | 0:c2262bac9aa6 | 101 | //DigitalIn S3(p7)-S4(p8); |
hayama | 0:c2262bac9aa6 | 102 | |
hayama | 0:c2262bac9aa6 | 103 | DigitalIn resetSW(p13); |
hayama | 0:c2262bac9aa6 | 104 | DigitalIn setSW(p14); |
hayama | 0:c2262bac9aa6 | 105 | DigitalIn startSW(p9); |
hayama | 0:c2262bac9aa6 | 106 | DigitalOut led(p21); |
hayama | 0:c2262bac9aa6 | 107 | |
hayama | 0:c2262bac9aa6 | 108 | AnalogIn gyroOut(p15); |
hayama | 0:c2262bac9aa6 | 109 | //AnalogIn A2(p16)-(p20); |
hayama | 0:c2262bac9aa6 | 110 | |
hayama | 0:c2262bac9aa6 | 111 | Servo strServo(p26); |
hayama | 0:c2262bac9aa6 | 112 | Servo motorAmp(p25); |
hayama | 0:c2262bac9aa6 | 113 | //Servo servoC3(p24)-(p21); |
hayama | 0:c2262bac9aa6 | 114 | |
hayama | 0:c2262bac9aa6 | 115 | BusIn compus(p18, p19, p20); // compus, 3bit 8 direction |
hayama | 0:c2262bac9aa6 | 116 | BusOut leds( LED3, LED2, LED1); // for LED display |
hayama | 0:c2262bac9aa6 | 117 | TextLCD lcd(p11, p12, p27, p28, p29, p30); // rs, e, d4-d7 |
hayama | 0:c2262bac9aa6 | 118 | Ticker timerS; // defince interval timer |
hayama | 0:c2262bac9aa6 | 119 | Timer timer; |
hayama | 0:c2262bac9aa6 | 120 | Serial pc(USBTX, USBRX); |
hayama | 0:c2262bac9aa6 | 121 | LocalFileSystem local("local"); |
hayama | 0:c2262bac9aa6 | 122 | |
hayama | 0:c2262bac9aa6 | 123 | |
hayama | 0:c2262bac9aa6 | 124 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 125 | // 走行パラメータを読み書き |
hayama | 0:c2262bac9aa6 | 126 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 127 | void writeParam(){ |
hayama | 0:c2262bac9aa6 | 128 | FILE *fp = fopen("/local/param.txt","w"); |
hayama | 0:c2262bac9aa6 | 129 | fprintf(fp, "%f\n",wr); |
hayama | 0:c2262bac9aa6 | 130 | fprintf(fp, "%f\n",ks); |
hayama | 0:c2262bac9aa6 | 131 | fprintf(fp, "%f\n",ksg); |
hayama | 0:c2262bac9aa6 | 132 | fprintf(fp, "%f\n",strmin); |
hayama | 0:c2262bac9aa6 | 133 | fprintf(fp, "%f\n",strmax); |
hayama | 0:c2262bac9aa6 | 134 | fprintf(fp, "%f\n",strn); |
hayama | 0:c2262bac9aa6 | 135 | fprintf(fp, "%f\n",posH); |
hayama | 0:c2262bac9aa6 | 136 | fprintf(fp, "%f\n",posL); |
hayama | 0:c2262bac9aa6 | 137 | fprintf(fp, "%d\n",spdH); |
hayama | 0:c2262bac9aa6 | 138 | fprintf(fp, "%d\n",spdL); |
hayama | 0:c2262bac9aa6 | 139 | fclose(fp); |
hayama | 0:c2262bac9aa6 | 140 | lcd.locate(0,1); lcd.printf("Completed! "); |
hayama | 0:c2262bac9aa6 | 141 | Thread::wait(1000); |
hayama | 0:c2262bac9aa6 | 142 | } |
hayama | 0:c2262bac9aa6 | 143 | |
hayama | 0:c2262bac9aa6 | 144 | void readParam(){ |
hayama | 0:c2262bac9aa6 | 145 | char st[20]; |
hayama | 0:c2262bac9aa6 | 146 | FILE *fp = fopen("/local/param.txt","r"); |
hayama | 0:c2262bac9aa6 | 147 | fgets(st,20,fp); wr=atof(st); |
hayama | 0:c2262bac9aa6 | 148 | fgets(st,20,fp); ks=atof(st); |
hayama | 0:c2262bac9aa6 | 149 | fgets(st,20,fp); ksg=atof(st); |
hayama | 0:c2262bac9aa6 | 150 | fgets(st,20,fp); strmin=atof(st); |
hayama | 0:c2262bac9aa6 | 151 | fgets(st,20,fp); strmax=atof(st); |
hayama | 0:c2262bac9aa6 | 152 | fgets(st,20,fp); strn=atof(st); |
hayama | 0:c2262bac9aa6 | 153 | fgets(st,20,fp); posH=atof(st); |
hayama | 0:c2262bac9aa6 | 154 | fgets(st,20,fp); posL=atof(st); |
hayama | 0:c2262bac9aa6 | 155 | fgets(st,20,fp); spdH=atoi(st); |
hayama | 0:c2262bac9aa6 | 156 | fgets(st,20,fp); spdL=atoi(st); |
hayama | 0:c2262bac9aa6 | 157 | fclose(fp); |
hayama | 0:c2262bac9aa6 | 158 | lcd.locate(0,1); lcd.printf("Completed! "); |
hayama | 0:c2262bac9aa6 | 159 | Thread::wait(1000); |
hayama | 0:c2262bac9aa6 | 160 | } |
hayama | 0:c2262bac9aa6 | 161 | |
hayama | 0:c2262bac9aa6 | 162 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 163 | // ウェイポイントの保管と読み出し |
hayama | 0:c2262bac9aa6 | 164 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 165 | void writeWp(){ |
hayama | 0:c2262bac9aa6 | 166 | FILE *fp = fopen("/local/waypoint.txt","w"); |
hayama | 0:c2262bac9aa6 | 167 | fprintf(fp, "%d\n",wp); |
hayama | 0:c2262bac9aa6 | 168 | for(int i=0;i<wp;i++){ |
hayama | 0:c2262bac9aa6 | 169 | fprintf(fp,"%f\n",wy[i]); |
hayama | 0:c2262bac9aa6 | 170 | fprintf(fp,"%f\n",wx[i]); |
hayama | 0:c2262bac9aa6 | 171 | } |
hayama | 0:c2262bac9aa6 | 172 | fclose(fp); |
hayama | 0:c2262bac9aa6 | 173 | |
hayama | 0:c2262bac9aa6 | 174 | lcd.locate(0,1); lcd.printf("Completed! "); |
hayama | 0:c2262bac9aa6 | 175 | Thread::wait(1000); |
hayama | 0:c2262bac9aa6 | 176 | } |
hayama | 0:c2262bac9aa6 | 177 | |
hayama | 0:c2262bac9aa6 | 178 | void readWp(){ |
hayama | 0:c2262bac9aa6 | 179 | char st[20]; |
hayama | 0:c2262bac9aa6 | 180 | FILE *fp = fopen("/local/waypoint.txt","r"); |
hayama | 0:c2262bac9aa6 | 181 | fgets(st,20,fp); wp=atof(st); |
hayama | 0:c2262bac9aa6 | 182 | for(int i=0;i<wp;i++){ |
hayama | 0:c2262bac9aa6 | 183 | fgets(st,20,fp); wy[i]=atof(st); |
hayama | 0:c2262bac9aa6 | 184 | fgets(st,20,fp); wx[i]=atof(st); |
hayama | 0:c2262bac9aa6 | 185 | } |
hayama | 0:c2262bac9aa6 | 186 | fclose(fp); |
hayama | 0:c2262bac9aa6 | 187 | |
hayama | 0:c2262bac9aa6 | 188 | lcd.locate(0,1); lcd.printf("Completed! "); |
hayama | 0:c2262bac9aa6 | 189 | Thread::wait(1000); |
hayama | 0:c2262bac9aa6 | 190 | } |
hayama | 0:c2262bac9aa6 | 191 | |
hayama | 0:c2262bac9aa6 | 192 | // QZSS message file out |
hayama | 0:c2262bac9aa6 | 193 | void writeQmsg(){ |
hayama | 0:c2262bac9aa6 | 194 | FILE *fp = fopen("/local/QZmsg.txt","w"); |
hayama | 0:c2262bac9aa6 | 195 | fprintf(fp, "%d\n",year); |
hayama | 0:c2262bac9aa6 | 196 | fprintf(fp, "%d\n",teamNum); |
hayama | 0:c2262bac9aa6 | 197 | fprintf(fp, "%d\n",numA); |
hayama | 0:c2262bac9aa6 | 198 | fprintf(fp, "%d\n",sizeA); |
hayama | 0:c2262bac9aa6 | 199 | fprintf(fp, "%d\n",numB); |
hayama | 0:c2262bac9aa6 | 200 | fprintf(fp, "%d\n",sizeB); |
hayama | 0:c2262bac9aa6 | 201 | fprintf(fp, "%d\n",numT); |
hayama | 0:c2262bac9aa6 | 202 | fprintf(fp, "%d\n",startA); |
hayama | 0:c2262bac9aa6 | 203 | fprintf(fp, "%d\n",startB); |
hayama | 0:c2262bac9aa6 | 204 | for(int i=0; i<numT; i++){ |
hayama | 0:c2262bac9aa6 | 205 | fprintf(fp,"%d\n",targetA[i]); // 座標のインデックスは1から、配列のインデックスは0から |
hayama | 0:c2262bac9aa6 | 206 | fprintf(fp,"%d\n",targetB[i]); |
hayama | 0:c2262bac9aa6 | 207 | } |
hayama | 0:c2262bac9aa6 | 208 | fprintf(fp, "%d\n",recvQZSS); |
hayama | 0:c2262bac9aa6 | 209 | fclose(fp); |
hayama | 0:c2262bac9aa6 | 210 | |
hayama | 0:c2262bac9aa6 | 211 | lcd.locate(0,1); lcd.printf("Completed! "); |
hayama | 0:c2262bac9aa6 | 212 | Thread::wait(1000); |
hayama | 0:c2262bac9aa6 | 213 | } |
hayama | 0:c2262bac9aa6 | 214 | |
hayama | 0:c2262bac9aa6 | 215 | // QZSS message file in |
hayama | 0:c2262bac9aa6 | 216 | void readQmsg(){ |
hayama | 0:c2262bac9aa6 | 217 | char st[20]; |
hayama | 0:c2262bac9aa6 | 218 | FILE *fp = fopen("/local/QZmsg.txt","r"); |
hayama | 0:c2262bac9aa6 | 219 | fgets(st,20,fp); year=atoi(st); |
hayama | 0:c2262bac9aa6 | 220 | fgets(st,20,fp); teamNum=atoi(st); |
hayama | 0:c2262bac9aa6 | 221 | fgets(st,20,fp); numA=atoi(st); |
hayama | 0:c2262bac9aa6 | 222 | fgets(st,20,fp); sizeA=atoi(st); |
hayama | 0:c2262bac9aa6 | 223 | fgets(st,20,fp); numB=atoi(st); |
hayama | 0:c2262bac9aa6 | 224 | fgets(st,20,fp); sizeB=atoi(st); |
hayama | 0:c2262bac9aa6 | 225 | fgets(st,20,fp); numT=atoi(st); |
hayama | 0:c2262bac9aa6 | 226 | fgets(st,20,fp); startA=atoi(st); |
hayama | 0:c2262bac9aa6 | 227 | fgets(st,20,fp); startB=atoi(st); |
hayama | 0:c2262bac9aa6 | 228 | for(int i=0; i<numT; i++){ |
hayama | 0:c2262bac9aa6 | 229 | fgets(st,20,fp); targetA[i]=atof(st); // 座標のインデックスは1から、配列のインデックスは0から |
hayama | 0:c2262bac9aa6 | 230 | fgets(st,20,fp); targetB[i]=atof(st); |
hayama | 0:c2262bac9aa6 | 231 | } |
hayama | 0:c2262bac9aa6 | 232 | fgets(st,20,fp); recvQZSS=atoi(st); |
hayama | 0:c2262bac9aa6 | 233 | if (recvQZSS==1) tNum=teamNum; |
hayama | 0:c2262bac9aa6 | 234 | fclose(fp); |
hayama | 0:c2262bac9aa6 | 235 | |
hayama | 0:c2262bac9aa6 | 236 | lcd.locate(0,1); lcd.printf("Completed! "); |
hayama | 0:c2262bac9aa6 | 237 | Thread::wait(1000); |
hayama | 0:c2262bac9aa6 | 238 | } |
hayama | 0:c2262bac9aa6 | 239 | |
hayama | 0:c2262bac9aa6 | 240 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 241 | // ウェイポイントの設定 |
hayama | 0:c2262bac9aa6 | 242 | // (GPSが受信できてない時はポイント追加できない) |
hayama | 0:c2262bac9aa6 | 243 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 244 | void setWp(){ |
hayama | 0:c2262bac9aa6 | 245 | lcd.locate(0,1); lcd.printf("present WP: %d ",wp); // ウェイポイント番号を進表示 |
hayama | 0:c2262bac9aa6 | 246 | while (resetSW==1){ // STARTスイッチが押されたら抜ける |
hayama | 0:c2262bac9aa6 | 247 | |
hayama | 0:c2262bac9aa6 | 248 | // start-swが押されたらウェイポイントを記録 |
hayama | 0:c2262bac9aa6 | 249 | if (startSW==0) { |
hayama | 0:c2262bac9aa6 | 250 | Thread::wait(10); |
hayama | 0:c2262bac9aa6 | 251 | while(startSW==0); // チャタリング防止 |
hayama | 0:c2262bac9aa6 | 252 | Thread::wait(10); |
hayama | 0:c2262bac9aa6 | 253 | |
hayama | 0:c2262bac9aa6 | 254 | // GPRMCを受信できて値が正常であるまで待つ |
hayama | 0:c2262bac9aa6 | 255 | while(recvGPS==0 || (latit==0) || (longit==0)); |
hayama | 0:c2262bac9aa6 | 256 | |
hayama | 0:c2262bac9aa6 | 257 | wy[wp] = latit; |
hayama | 0:c2262bac9aa6 | 258 | wx[wp] = longit; |
hayama | 0:c2262bac9aa6 | 259 | lcd.locate(0,1); lcd.printf("set WP: %d ",wp); |
hayama | 0:c2262bac9aa6 | 260 | Thread::wait(2000); |
hayama | 0:c2262bac9aa6 | 261 | lcd.locate(0,0); lcd.printf("wy[%d]=%f \n", wp, wy[wp]); |
hayama | 0:c2262bac9aa6 | 262 | lcd.locate(0,1); lcd.printf("wx[%d]=%f \n", wp, wx[wp]); |
hayama | 0:c2262bac9aa6 | 263 | Thread::wait(2000); |
hayama | 0:c2262bac9aa6 | 264 | wp++; if (wp>15) wp=15; // 次のウェイポイント入力状態にするウェイポイントの追加は15まで、0からで計16個 |
hayama | 0:c2262bac9aa6 | 265 | // ウェイポイント追加 |
hayama | 0:c2262bac9aa6 | 266 | } |
hayama | 0:c2262bac9aa6 | 267 | |
hayama | 0:c2262bac9aa6 | 268 | // set-swが押されたらウェイポイントdecrement |
hayama | 0:c2262bac9aa6 | 269 | if (setSW==0) { |
hayama | 0:c2262bac9aa6 | 270 | Thread::wait(10); |
hayama | 0:c2262bac9aa6 | 271 | while(setSW==0); // チャタリング防止 |
hayama | 0:c2262bac9aa6 | 272 | Thread::wait(10); |
hayama | 0:c2262bac9aa6 | 273 | wp--; if (wp<0) wp=0; |
hayama | 0:c2262bac9aa6 | 274 | wy[wp] =0; |
hayama | 0:c2262bac9aa6 | 275 | wx[wp] =0; |
hayama | 0:c2262bac9aa6 | 276 | lcd.locate(0,1); lcd.printf("delete WP: %d ",wp); |
hayama | 0:c2262bac9aa6 | 277 | Thread::wait(2000); |
hayama | 0:c2262bac9aa6 | 278 | lcd.locate(0,0); lcd.printf("wy[%d]=%f \n", wp, wy[wp]); |
hayama | 0:c2262bac9aa6 | 279 | lcd.locate(0,1); lcd.printf("wx[%d]=%f \n", wp, wx[wp]); |
hayama | 0:c2262bac9aa6 | 280 | Thread::wait(2000); |
hayama | 0:c2262bac9aa6 | 281 | } |
hayama | 0:c2262bac9aa6 | 282 | |
hayama | 0:c2262bac9aa6 | 283 | lcd.cls(); |
hayama | 0:c2262bac9aa6 | 284 | lcd.printf("LA=%f \n", latit); |
hayama | 0:c2262bac9aa6 | 285 | lcd.printf("LO=%f \n", longit); |
hayama | 0:c2262bac9aa6 | 286 | Thread::wait(200); |
hayama | 0:c2262bac9aa6 | 287 | } |
hayama | 0:c2262bac9aa6 | 288 | } |
hayama | 0:c2262bac9aa6 | 289 | |
hayama | 0:c2262bac9aa6 | 290 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 291 | // display way point |
hayama | 0:c2262bac9aa6 | 292 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 293 | void dispWp(){ |
hayama | 0:c2262bac9aa6 | 294 | if(wp==0){ |
hayama | 0:c2262bac9aa6 | 295 | lcd.locate(0,1); lcd.printf("no way point !! "); |
hayama | 0:c2262bac9aa6 | 296 | return; |
hayama | 0:c2262bac9aa6 | 297 | } |
hayama | 0:c2262bac9aa6 | 298 | int i=0; |
hayama | 0:c2262bac9aa6 | 299 | lcd.cls(); |
hayama | 0:c2262bac9aa6 | 300 | while(resetSW==1){ |
hayama | 0:c2262bac9aa6 | 301 | if (setSW==0){ |
hayama | 0:c2262bac9aa6 | 302 | Thread::wait(10); |
hayama | 0:c2262bac9aa6 | 303 | while (setSW==0); |
hayama | 0:c2262bac9aa6 | 304 | Thread::wait(10); |
hayama | 0:c2262bac9aa6 | 305 | i--; if (i<0) i=wp-1; |
hayama | 0:c2262bac9aa6 | 306 | } |
hayama | 0:c2262bac9aa6 | 307 | if (startSW==0){ |
hayama | 0:c2262bac9aa6 | 308 | Thread::wait(10); |
hayama | 0:c2262bac9aa6 | 309 | while (startSW==0); |
hayama | 0:c2262bac9aa6 | 310 | Thread::wait(10); |
hayama | 0:c2262bac9aa6 | 311 | i++; if (i==wp) i=0; |
hayama | 0:c2262bac9aa6 | 312 | } |
hayama | 0:c2262bac9aa6 | 313 | lcd.locate(0,0); lcd.printf("wy[%d]=%f \n", i, wy[i]); |
hayama | 0:c2262bac9aa6 | 314 | lcd.locate(0,1); lcd.printf("wx[%d]=%f \n", i, wx[i]); |
hayama | 0:c2262bac9aa6 | 315 | Thread::wait(200); |
hayama | 0:c2262bac9aa6 | 316 | } |
hayama | 0:c2262bac9aa6 | 317 | Thread::wait(200); |
hayama | 0:c2262bac9aa6 | 318 | } |
hayama | 0:c2262bac9aa6 | 319 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 320 | // ウェイポイントの消去 |
hayama | 0:c2262bac9aa6 | 321 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 322 | void clearWp(){ |
hayama | 0:c2262bac9aa6 | 323 | wp=0; |
hayama | 0:c2262bac9aa6 | 324 | for(int i=0;i<16;i++){ wy[i]=0; wx[i]=0; } |
hayama | 0:c2262bac9aa6 | 325 | lcd.locate(0,1); lcd.printf("Completed! "); |
hayama | 0:c2262bac9aa6 | 326 | Thread::wait(1000); |
hayama | 0:c2262bac9aa6 | 327 | } |
hayama | 0:c2262bac9aa6 | 328 | |
hayama | 0:c2262bac9aa6 | 329 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 330 | // QZSS display way point |
hayama | 0:c2262bac9aa6 | 331 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 332 | void dispQmsg(){ |
hayama | 0:c2262bac9aa6 | 333 | int i=0; |
hayama | 0:c2262bac9aa6 | 334 | |
hayama | 0:c2262bac9aa6 | 335 | if (recvQZSS==1){ |
hayama | 0:c2262bac9aa6 | 336 | lcd.locate(0,1); lcd.printf("QZSS message OK!"); |
hayama | 0:c2262bac9aa6 | 337 | } else { |
hayama | 0:c2262bac9aa6 | 338 | lcd.locate(0,1); lcd.printf("QZSS no message "); |
hayama | 0:c2262bac9aa6 | 339 | } |
hayama | 0:c2262bac9aa6 | 340 | Thread::wait(3000); |
hayama | 0:c2262bac9aa6 | 341 | |
hayama | 0:c2262bac9aa6 | 342 | while(resetSW==1){ |
hayama | 0:c2262bac9aa6 | 343 | if (setSW==0){ |
hayama | 0:c2262bac9aa6 | 344 | Thread::wait(10); |
hayama | 0:c2262bac9aa6 | 345 | while (setSW==0); |
hayama | 0:c2262bac9aa6 | 346 | Thread::wait(10); |
hayama | 0:c2262bac9aa6 | 347 | i--; if (i<0) i=24; |
hayama | 0:c2262bac9aa6 | 348 | } |
hayama | 0:c2262bac9aa6 | 349 | if (startSW==0){ |
hayama | 0:c2262bac9aa6 | 350 | Thread::wait(10); |
hayama | 0:c2262bac9aa6 | 351 | while (startSW==0); |
hayama | 0:c2262bac9aa6 | 352 | Thread::wait(10); |
hayama | 0:c2262bac9aa6 | 353 | i++; if (i>24) i=0; |
hayama | 0:c2262bac9aa6 | 354 | } |
hayama | 0:c2262bac9aa6 | 355 | switch (i){ |
hayama | 0:c2262bac9aa6 | 356 | case 0: lcd.locate(0,1); lcd.printf("year=%d \n", year); break; |
hayama | 0:c2262bac9aa6 | 357 | case 1: lcd.locate(0,1); lcd.printf("teamNum=%d \n", teamNum); break; |
hayama | 0:c2262bac9aa6 | 358 | case 2: lcd.locate(0,1); lcd.printf("numA=%d \n", numA); break; |
hayama | 0:c2262bac9aa6 | 359 | case 3: lcd.locate(0,1); lcd.printf("sizeA=%d \n", sizeA); break; |
hayama | 0:c2262bac9aa6 | 360 | case 4: lcd.locate(0,1); lcd.printf("numB=%d \n", numB); break; |
hayama | 0:c2262bac9aa6 | 361 | case 5: lcd.locate(0,1); lcd.printf("sizeB=%d \n", sizeB); break; |
hayama | 0:c2262bac9aa6 | 362 | case 6: lcd.locate(0,1); lcd.printf("numT=%d \n", numT); break; |
hayama | 0:c2262bac9aa6 | 363 | case 7: lcd.locate(0,1); lcd.printf("startA=%d \n", startA); break; |
hayama | 0:c2262bac9aa6 | 364 | case 8: lcd.locate(0,1); lcd.printf("startB=%d \n", startB); break; |
hayama | 0:c2262bac9aa6 | 365 | case 9: lcd.locate(0,1); lcd.printf("targetA[1]=%d \n", targetA[0]); break; // 座標のインデックスは1から、配列のインデックスは0から |
hayama | 0:c2262bac9aa6 | 366 | case 10: lcd.locate(0,1); lcd.printf("targetB[1]=%d \n", targetB[0]); break; |
hayama | 0:c2262bac9aa6 | 367 | case 11: lcd.locate(0,1); lcd.printf("targetA[2]=%d \n", targetA[1]); break; |
hayama | 0:c2262bac9aa6 | 368 | case 12: lcd.locate(0,1); lcd.printf("targetB[2]=%d \n", targetB[1]); break; |
hayama | 0:c2262bac9aa6 | 369 | case 13: lcd.locate(0,1); lcd.printf("targetA[3]=%d \n", targetA[2]); break; |
hayama | 0:c2262bac9aa6 | 370 | case 14: lcd.locate(0,1); lcd.printf("targetB[3]=%d \n", targetB[2]); break; |
hayama | 0:c2262bac9aa6 | 371 | case 15: lcd.locate(0,1); lcd.printf("targetA[4]=%d \n", targetA[3]); break; |
hayama | 0:c2262bac9aa6 | 372 | case 16: lcd.locate(0,1); lcd.printf("targetB[4]=%d \n", targetB[3]); break; |
hayama | 0:c2262bac9aa6 | 373 | case 17: lcd.locate(0,1); lcd.printf("targetA[5]=%d \n", targetA[4]); break; |
hayama | 0:c2262bac9aa6 | 374 | case 18: lcd.locate(0,1); lcd.printf("targetB[5]=%d \n", targetB[4]); break; |
hayama | 0:c2262bac9aa6 | 375 | case 19: lcd.locate(0,1); lcd.printf("targetA[6]=%d \n", targetA[5]); break; |
hayama | 0:c2262bac9aa6 | 376 | case 20: lcd.locate(0,1); lcd.printf("targetB[6]=%d \n", targetB[5]); break; |
hayama | 0:c2262bac9aa6 | 377 | case 21: lcd.locate(0,1); lcd.printf("targetA[7]=%d \n", targetA[6]); break; |
hayama | 0:c2262bac9aa6 | 378 | case 22: lcd.locate(0,1); lcd.printf("targetB[7]=%d \n", targetB[6]); break; |
hayama | 0:c2262bac9aa6 | 379 | case 23: lcd.locate(0,1); lcd.printf("targetA[8]=%d \n", targetA[7]); break; |
hayama | 0:c2262bac9aa6 | 380 | case 24: lcd.locate(0,1); lcd.printf("targetB[8]=%d \n", targetB[7]); break; |
hayama | 0:c2262bac9aa6 | 381 | } |
hayama | 0:c2262bac9aa6 | 382 | Thread::wait(100); |
hayama | 0:c2262bac9aa6 | 383 | } |
hayama | 0:c2262bac9aa6 | 384 | Thread::wait(200); |
hayama | 0:c2262bac9aa6 | 385 | } |
hayama | 0:c2262bac9aa6 | 386 | |
hayama | 0:c2262bac9aa6 | 387 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 388 | // QZSS ウェイポイントの消去 |
hayama | 0:c2262bac9aa6 | 389 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 390 | void clearQmsg(){ |
hayama | 0:c2262bac9aa6 | 391 | for(int i=0;i<numT;i++){ targetA[i]=targetB[i]=0; } |
hayama | 0:c2262bac9aa6 | 392 | year=teamNum=numA=sizeA=numB=sizeB=numT=startA=startB=0; |
hayama | 0:c2262bac9aa6 | 393 | recvQZSS=0; |
hayama | 0:c2262bac9aa6 | 394 | lcd.locate(0,1); lcd.printf("Completed! "); |
hayama | 0:c2262bac9aa6 | 395 | Thread::wait(1000); |
hayama | 0:c2262bac9aa6 | 396 | } |
hayama | 0:c2262bac9aa6 | 397 | |
hayama | 0:c2262bac9aa6 | 398 | |
hayama | 0:c2262bac9aa6 | 399 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 400 | // set team number, inc by startSW, dec by setSW, max 25 |
hayama | 0:c2262bac9aa6 | 401 | // compare to the teamNum from QZSS massage |
hayama | 0:c2262bac9aa6 | 402 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 403 | void setTeamNum(){ |
hayama | 0:c2262bac9aa6 | 404 | while(resetSW==1){ |
hayama | 0:c2262bac9aa6 | 405 | if (startSW==0){tNum++; if (tNum>25) tNum=0;} |
hayama | 0:c2262bac9aa6 | 406 | if (setSW==0) {tNum--; if (tNum<0) tNum=25;} |
hayama | 0:c2262bac9aa6 | 407 | lcd.locate(0,1); lcd.printf("team number=%d \n", tNum); |
hayama | 0:c2262bac9aa6 | 408 | Thread::wait(200); |
hayama | 0:c2262bac9aa6 | 409 | } |
hayama | 0:c2262bac9aa6 | 410 | } |
hayama | 0:c2262bac9aa6 | 411 | |
hayama | 0:c2262bac9aa6 | 412 | |
hayama | 0:c2262bac9aa6 | 413 | // calculation of all QZSS waypoint from 4 point |
hayama | 0:c2262bac9aa6 | 414 | void calcQZWp(){ |
hayama | 0:c2262bac9aa6 | 415 | |
hayama | 0:c2262bac9aa6 | 416 | wxQ11=wxQ[1][1]; wyQ11=wyQ[1][1]; |
hayama | 0:c2262bac9aa6 | 417 | xQ11=wxQ[1][1]-wxQ11; yQ11=wyQ[1][1]-wyQ11; // (A1,B1) |
hayama | 0:c2262bac9aa6 | 418 | xQ71=wxQ[7][1]-wxQ11; yQ71=wyQ[7][1]-wyQ11; // (A7,B1) |
hayama | 0:c2262bac9aa6 | 419 | xQ17=wxQ[1][7]-wxQ11; yQ17=wyQ[1][7]-wyQ11; // (A1,B7) |
hayama | 0:c2262bac9aa6 | 420 | xQ77=wxQ[7][7]-wxQ11; yQ77=wyQ[7][7]-wyQ11; // (A7,B7) |
hayama | 0:c2262bac9aa6 | 421 | |
hayama | 0:c2262bac9aa6 | 422 | dxQ71=xQ71-xQ11; dyQ71=yQ71-yQ11; |
hayama | 0:c2262bac9aa6 | 423 | dxQ17=xQ17-xQ11; dyQ17=yQ17-yQ11; |
hayama | 0:c2262bac9aa6 | 424 | |
hayama | 0:c2262bac9aa6 | 425 | theta=atan(dxQ71/dyQ71); |
hayama | 0:c2262bac9aa6 | 426 | magx=sqrt(dxQ71*dxQ71+dyQ71*dyQ71)/6; |
hayama | 0:c2262bac9aa6 | 427 | magy=sqrt(dxQ17*dxQ17+dyQ17*dyQ17)/6; |
hayama | 0:c2262bac9aa6 | 428 | |
hayama | 0:c2262bac9aa6 | 429 | for (int i=1;i<8;i++){ |
hayama | 0:c2262bac9aa6 | 430 | for(int j=1;j<8;j++){ |
hayama | 0:c2262bac9aa6 | 431 | wxQ[i][j]=magx*(j-1)*cos(theta)-magy*(i-1)*sin(theta)+wxQ11; |
hayama | 0:c2262bac9aa6 | 432 | wyQ[i][j]=magx*(j-1)*sin(theta)+magy*(i-1)*cos(theta)+wyQ11; |
hayama | 0:c2262bac9aa6 | 433 | } |
hayama | 0:c2262bac9aa6 | 434 | } |
hayama | 0:c2262bac9aa6 | 435 | } |
hayama | 0:c2262bac9aa6 | 436 | |
hayama | 0:c2262bac9aa6 | 437 | |
hayama | 0:c2262bac9aa6 | 438 | // set QZSS way point for (A1,B1)(A7,B1)(A1,B7)(A7,B7) |
hayama | 0:c2262bac9aa6 | 439 | void setQZWp(){ |
hayama | 0:c2262bac9aa6 | 440 | int qa=1,qb=1; |
hayama | 0:c2262bac9aa6 | 441 | int qn=3; |
hayama | 0:c2262bac9aa6 | 442 | |
hayama | 0:c2262bac9aa6 | 443 | while (resetSW==1){ // STARTスイッチが押されたら抜ける |
hayama | 0:c2262bac9aa6 | 444 | |
hayama | 0:c2262bac9aa6 | 445 | // set-swが押されたらchange A,B axis |
hayama | 0:c2262bac9aa6 | 446 | if (setSW==0) { |
hayama | 0:c2262bac9aa6 | 447 | Thread::wait(10); |
hayama | 0:c2262bac9aa6 | 448 | while(setSW==0); // チャタリング防止 |
hayama | 0:c2262bac9aa6 | 449 | Thread::wait(10); |
hayama | 0:c2262bac9aa6 | 450 | |
hayama | 0:c2262bac9aa6 | 451 | qn++; if (qn>3) qn=0; // 次のウェイポイント入力状態にするウェイポイントの追加は15まで、0からで計16個 |
hayama | 0:c2262bac9aa6 | 452 | switch(qn){ |
hayama | 0:c2262bac9aa6 | 453 | case 0: qa=1; qb=1; break; |
hayama | 0:c2262bac9aa6 | 454 | case 1: qa=7; qb=1; break; |
hayama | 0:c2262bac9aa6 | 455 | case 2: qa=1; qb=7; break; |
hayama | 0:c2262bac9aa6 | 456 | case 3: qa=7; qb=7; break; |
hayama | 0:c2262bac9aa6 | 457 | } |
hayama | 0:c2262bac9aa6 | 458 | lcd.cls(); |
hayama | 0:c2262bac9aa6 | 459 | lcd.locate(0,1); lcd.printf("(A%d,B%d)", qa,qb); |
hayama | 0:c2262bac9aa6 | 460 | Thread::wait(2000); |
hayama | 0:c2262bac9aa6 | 461 | lcd.cls(); |
hayama | 0:c2262bac9aa6 | 462 | lcd.locate(0,0); lcd.printf("wyQ[%d][%d]=%f \n", qa,qb, wyQ[qa][qb]); |
hayama | 0:c2262bac9aa6 | 463 | lcd.locate(0,1); lcd.printf("wxQ[%d][%d]=%f \n", qa,qb, wxQ[qa][qb]); |
hayama | 0:c2262bac9aa6 | 464 | Thread::wait(2000); |
hayama | 0:c2262bac9aa6 | 465 | } |
hayama | 0:c2262bac9aa6 | 466 | |
hayama | 0:c2262bac9aa6 | 467 | // start-swが押されたらウェイポイントを記録 |
hayama | 0:c2262bac9aa6 | 468 | if (startSW==0) { |
hayama | 0:c2262bac9aa6 | 469 | Thread::wait(10); |
hayama | 0:c2262bac9aa6 | 470 | while(startSW==0); // チャタリング防止 |
hayama | 0:c2262bac9aa6 | 471 | Thread::wait(10); |
hayama | 0:c2262bac9aa6 | 472 | |
hayama | 0:c2262bac9aa6 | 473 | // GPRMCを受信できて値が正常であるまで待つ |
hayama | 0:c2262bac9aa6 | 474 | while(recvGPS==0 || (latit==0) || (longit==0)); |
hayama | 0:c2262bac9aa6 | 475 | |
hayama | 0:c2262bac9aa6 | 476 | wyQ[qa][qb] = latit; |
hayama | 0:c2262bac9aa6 | 477 | wxQ[qa][qb] = longit; |
hayama | 0:c2262bac9aa6 | 478 | lcd.cls(); |
hayama | 0:c2262bac9aa6 | 479 | lcd.locate(0,0); lcd.printf("wyQ[%d][%d]=%f \n", qa,qb, wyQ[qa][qb]); |
hayama | 0:c2262bac9aa6 | 480 | lcd.locate(0,1); lcd.printf("wxQ[%d][%d]=%f \n", qa,qb, wxQ[qa][qb]); |
hayama | 0:c2262bac9aa6 | 481 | Thread::wait(2000); |
hayama | 0:c2262bac9aa6 | 482 | } |
hayama | 0:c2262bac9aa6 | 483 | |
hayama | 0:c2262bac9aa6 | 484 | lcd.cls(); |
hayama | 0:c2262bac9aa6 | 485 | lcd.printf("LA=%f \n", latit); |
hayama | 0:c2262bac9aa6 | 486 | lcd.printf("LO=%f \n", longit); |
hayama | 0:c2262bac9aa6 | 487 | Thread::wait(200); |
hayama | 0:c2262bac9aa6 | 488 | } |
hayama | 0:c2262bac9aa6 | 489 | calcQZWp(); |
hayama | 0:c2262bac9aa6 | 490 | } |
hayama | 0:c2262bac9aa6 | 491 | |
hayama | 0:c2262bac9aa6 | 492 | // file out QZSS way point, 4 point only |
hayama | 0:c2262bac9aa6 | 493 | void writeQZWp4(){ |
hayama | 0:c2262bac9aa6 | 494 | FILE *fp = fopen("/local/QZpoint4.txt","w"); |
hayama | 0:c2262bac9aa6 | 495 | fprintf(fp, "%f\n",xQ11); |
hayama | 0:c2262bac9aa6 | 496 | fprintf(fp, "%f\n",yQ11); |
hayama | 0:c2262bac9aa6 | 497 | fprintf(fp, "%f\n",xQ71); |
hayama | 0:c2262bac9aa6 | 498 | fprintf(fp, "%f\n",yQ71); |
hayama | 0:c2262bac9aa6 | 499 | fprintf(fp, "%f\n",xQ17); |
hayama | 0:c2262bac9aa6 | 500 | fprintf(fp, "%f\n",yQ17); |
hayama | 0:c2262bac9aa6 | 501 | fprintf(fp, "%f\n",xQ77); |
hayama | 0:c2262bac9aa6 | 502 | fprintf(fp, "%f\n",yQ77); |
hayama | 0:c2262bac9aa6 | 503 | fclose(fp); |
hayama | 0:c2262bac9aa6 | 504 | lcd.locate(0,1); lcd.printf("Completed! "); |
hayama | 0:c2262bac9aa6 | 505 | Thread::wait(1000); |
hayama | 0:c2262bac9aa6 | 506 | } |
hayama | 0:c2262bac9aa6 | 507 | |
hayama | 0:c2262bac9aa6 | 508 | // file read QZSS way point, 4 point only |
hayama | 0:c2262bac9aa6 | 509 | void readQZWp4(){ |
hayama | 0:c2262bac9aa6 | 510 | char st[20]; |
hayama | 0:c2262bac9aa6 | 511 | FILE *fp = fopen("/local/QZpoint4.txt","r"); |
hayama | 0:c2262bac9aa6 | 512 | fgets(st,20,fp); xQ11=atof(st); |
hayama | 0:c2262bac9aa6 | 513 | fgets(st,20,fp); yQ11=atof(st); |
hayama | 0:c2262bac9aa6 | 514 | fgets(st,20,fp); xQ71=atof(st); |
hayama | 0:c2262bac9aa6 | 515 | fgets(st,20,fp); yQ71=atof(st); |
hayama | 0:c2262bac9aa6 | 516 | fgets(st,20,fp); xQ17=atof(st); |
hayama | 0:c2262bac9aa6 | 517 | fgets(st,20,fp); yQ17=atof(st); |
hayama | 0:c2262bac9aa6 | 518 | fgets(st,20,fp); xQ77=atof(st); |
hayama | 0:c2262bac9aa6 | 519 | fgets(st,20,fp); yQ77=atof(st); |
hayama | 0:c2262bac9aa6 | 520 | fclose(fp); |
hayama | 0:c2262bac9aa6 | 521 | lcd.locate(0,1); lcd.printf("Completed! "); |
hayama | 0:c2262bac9aa6 | 522 | Thread::wait(1000); |
hayama | 0:c2262bac9aa6 | 523 | calcQZWp(); |
hayama | 0:c2262bac9aa6 | 524 | } |
hayama | 0:c2262bac9aa6 | 525 | |
hayama | 0:c2262bac9aa6 | 526 | |
hayama | 0:c2262bac9aa6 | 527 | // file out QZSS way point |
hayama | 0:c2262bac9aa6 | 528 | void writeQZWp(){ |
hayama | 0:c2262bac9aa6 | 529 | FILE *fp = fopen("/local/QZpoint.txt","w"); |
hayama | 0:c2262bac9aa6 | 530 | for(int i=1;i<8;i++){ |
hayama | 0:c2262bac9aa6 | 531 | for(int j=1;j<8;j++){ |
hayama | 0:c2262bac9aa6 | 532 | fprintf(fp, "%f\n",wyQ[i][j]); |
hayama | 0:c2262bac9aa6 | 533 | fprintf(fp, "%f\n",wxQ[i][j]); |
hayama | 0:c2262bac9aa6 | 534 | } |
hayama | 0:c2262bac9aa6 | 535 | } |
hayama | 0:c2262bac9aa6 | 536 | fclose(fp); |
hayama | 0:c2262bac9aa6 | 537 | lcd.locate(0,1); lcd.printf("Completed! "); |
hayama | 0:c2262bac9aa6 | 538 | Thread::wait(1000); |
hayama | 0:c2262bac9aa6 | 539 | } |
hayama | 0:c2262bac9aa6 | 540 | |
hayama | 0:c2262bac9aa6 | 541 | // file read QZSS way point |
hayama | 0:c2262bac9aa6 | 542 | void readQZWp(){ |
hayama | 0:c2262bac9aa6 | 543 | char st[20]; |
hayama | 0:c2262bac9aa6 | 544 | FILE *fp = fopen("/local/QZpoint.txt","r"); |
hayama | 0:c2262bac9aa6 | 545 | for(int i=1;i<8;i++){ |
hayama | 0:c2262bac9aa6 | 546 | for(int j=1;j<8;j++){ |
hayama | 0:c2262bac9aa6 | 547 | fgets(st,20,fp); wyQ[i][j]=atof(st); |
hayama | 0:c2262bac9aa6 | 548 | fgets(st,20,fp); wxQ[i][j]=atof(st); |
hayama | 0:c2262bac9aa6 | 549 | } |
hayama | 0:c2262bac9aa6 | 550 | } |
hayama | 0:c2262bac9aa6 | 551 | fclose(fp); |
hayama | 0:c2262bac9aa6 | 552 | lcd.locate(0,1); lcd.printf("Completed! "); |
hayama | 0:c2262bac9aa6 | 553 | Thread::wait(1000); |
hayama | 0:c2262bac9aa6 | 554 | } |
hayama | 0:c2262bac9aa6 | 555 | |
hayama | 0:c2262bac9aa6 | 556 | |
hayama | 0:c2262bac9aa6 | 557 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 558 | // スムージング関数(cData:現在のデータ,pData:一つ前のデータ,factor:係数,大きい現在地の割合大きい |
hayama | 0:c2262bac9aa6 | 559 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 560 | float smooth(float cData, float pData, float factor){ |
hayama | 0:c2262bac9aa6 | 561 | return(cData*factor + pData*(1-factor)); |
hayama | 0:c2262bac9aa6 | 562 | } |
hayama | 0:c2262bac9aa6 | 563 | |
hayama | 0:c2262bac9aa6 | 564 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 565 | // count up by encoder |
hayama | 0:c2262bac9aa6 | 566 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 567 | void countR(){ |
hayama | 0:c2262bac9aa6 | 568 | encR++; |
hayama | 0:c2262bac9aa6 | 569 | } |
hayama | 0:c2262bac9aa6 | 570 | void countL(){ |
hayama | 0:c2262bac9aa6 | 571 | encL++; |
hayama | 0:c2262bac9aa6 | 572 | } |
hayama | 0:c2262bac9aa6 | 573 | |
hayama | 0:c2262bac9aa6 | 574 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 575 | // ジャイロのオフセット取得 |
hayama | 0:c2262bac9aa6 | 576 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 577 | int gyro_offset(void){ |
hayama | 0:c2262bac9aa6 | 578 | int i,tmp; |
hayama | 0:c2262bac9aa6 | 579 | |
hayama | 0:c2262bac9aa6 | 580 | lcd.cls(); |
hayama | 0:c2262bac9aa6 | 581 | Thread::wait(1000); |
hayama | 0:c2262bac9aa6 | 582 | gyOff=0; |
hayama | 0:c2262bac9aa6 | 583 | for (i=0;i<16;i++){ |
hayama | 0:c2262bac9aa6 | 584 | gyOff+=gyroOut; // read gyro sensor |
hayama | 0:c2262bac9aa6 | 585 | Thread::wait(10); |
hayama | 0:c2262bac9aa6 | 586 | } |
hayama | 0:c2262bac9aa6 | 587 | gyOff=gyOff/16+GYROADJ; |
hayama | 0:c2262bac9aa6 | 588 | |
hayama | 0:c2262bac9aa6 | 589 | gyItg=0; |
hayama | 0:c2262bac9aa6 | 590 | for (i=0;i<10;i++){ |
hayama | 0:c2262bac9aa6 | 591 | tmp=(int)(fabs(angle)); |
hayama | 0:c2262bac9aa6 | 592 | lcd.locate(0,1); lcd.printf("angle=%d \n", tmp); |
hayama | 0:c2262bac9aa6 | 593 | Thread::wait(100); |
hayama | 0:c2262bac9aa6 | 594 | } |
hayama | 0:c2262bac9aa6 | 595 | return ((int)fabs(angle)); // スタートスイッチで復帰,ただしジャイロ使えないレベル |
hayama | 0:c2262bac9aa6 | 596 | } |
hayama | 0:c2262bac9aa6 | 597 | |
hayama | 0:c2262bac9aa6 | 598 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 599 | // ジャイロのリセット |
hayama | 0:c2262bac9aa6 | 600 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 601 | void gyro_reset(void){ |
hayama | 0:c2262bac9aa6 | 602 | gyItg=0; |
hayama | 0:c2262bac9aa6 | 603 | angle=0; |
hayama | 0:c2262bac9aa6 | 604 | } |
hayama | 0:c2262bac9aa6 | 605 | |
hayama | 0:c2262bac9aa6 | 606 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 607 | // interrupt by us timerS |
hayama | 0:c2262bac9aa6 | 608 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 609 | void sensor() { |
hayama | 0:c2262bac9aa6 | 610 | // read gyro sensor |
hayama | 0:c2262bac9aa6 | 611 | gyro=-(gyroOut-gyOff); |
hayama | 0:c2262bac9aa6 | 612 | gyItg+=gyro; |
hayama | 0:c2262bac9aa6 | 613 | angle=gyItg*KANG; |
hayama | 0:c2262bac9aa6 | 614 | |
hayama | 0:c2262bac9aa6 | 615 | cntE++; if (cntE>200){ |
hayama | 0:c2262bac9aa6 | 616 | cntE=0; |
hayama | 0:c2262bac9aa6 | 617 | cntR=encR-encRB; |
hayama | 0:c2262bac9aa6 | 618 | cntL=encL-encLB; |
hayama | 0:c2262bac9aa6 | 619 | encRB=encR; |
hayama | 0:c2262bac9aa6 | 620 | encLB=encL; |
hayama | 0:c2262bac9aa6 | 621 | cntC=(cntR>cntL)? cntR: cntL; // max of cntR/L. |
hayama | 0:c2262bac9aa6 | 622 | } |
hayama | 0:c2262bac9aa6 | 623 | dirCompus=arrayCompus[compus]; |
hayama | 0:c2262bac9aa6 | 624 | } |
hayama | 0:c2262bac9aa6 | 625 | |
hayama | 0:c2262bac9aa6 | 626 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 627 | // テスト,パラメータ設定 |
hayama | 0:c2262bac9aa6 | 628 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 629 | |
hayama | 0:c2262bac9aa6 | 630 | // サーボのテスト |
hayama | 0:c2262bac9aa6 | 631 | void testServo() { |
hayama | 0:c2262bac9aa6 | 632 | strServo=strmin; // 最初左に曲がる |
hayama | 0:c2262bac9aa6 | 633 | Thread::wait(1000); |
hayama | 0:c2262bac9aa6 | 634 | strServo=strmax; // 次に右に曲がる |
hayama | 0:c2262bac9aa6 | 635 | Thread::wait(1000); |
hayama | 0:c2262bac9aa6 | 636 | strServo=strn; // ニュートラル |
hayama | 0:c2262bac9aa6 | 637 | Thread::wait(1000); |
hayama | 0:c2262bac9aa6 | 638 | } |
hayama | 0:c2262bac9aa6 | 639 | |
hayama | 0:c2262bac9aa6 | 640 | // モータテスト、実行スイッチで正転、セットスイッチで逆転、リセットを押すまでモータ回り続ける |
hayama | 0:c2262bac9aa6 | 641 | void testMotor(){ |
hayama | 0:c2262bac9aa6 | 642 | while(resetSW==1){ |
hayama | 0:c2262bac9aa6 | 643 | if (startSW==0) motorAmp=POSC-posL; |
hayama | 0:c2262bac9aa6 | 644 | else if (setSW==0) motorAmp=POSC+posL; |
hayama | 0:c2262bac9aa6 | 645 | //else motorAmp=POSC; |
hayama | 0:c2262bac9aa6 | 646 | } |
hayama | 0:c2262bac9aa6 | 647 | } |
hayama | 0:c2262bac9aa6 | 648 | |
hayama | 0:c2262bac9aa6 | 649 | // encoderテスト |
hayama | 0:c2262bac9aa6 | 650 | void testEncoder(){ |
hayama | 0:c2262bac9aa6 | 651 | lcd.cls(); |
hayama | 0:c2262bac9aa6 | 652 | while(resetSW==1){ |
hayama | 0:c2262bac9aa6 | 653 | lcd.locate(0,0); lcd.printf("eR%d eL%d \n", encR, encL); |
hayama | 0:c2262bac9aa6 | 654 | lcd.locate(0,1); lcd.printf("cR=%d cL=%d cC=%d \n", cntR, cntL, cntC); |
hayama | 0:c2262bac9aa6 | 655 | } |
hayama | 0:c2262bac9aa6 | 656 | } |
hayama | 0:c2262bac9aa6 | 657 | |
hayama | 0:c2262bac9aa6 | 658 | // test gyro sensor |
hayama | 0:c2262bac9aa6 | 659 | void testGyro(){ |
hayama | 0:c2262bac9aa6 | 660 | lcd.cls(); |
hayama | 0:c2262bac9aa6 | 661 | gyro_reset(); |
hayama | 0:c2262bac9aa6 | 662 | while(resetSW==1){ |
hayama | 0:c2262bac9aa6 | 663 | if (setSW==0) { |
hayama | 0:c2262bac9aa6 | 664 | gyro_offset(); |
hayama | 0:c2262bac9aa6 | 665 | gyro_reset(); |
hayama | 0:c2262bac9aa6 | 666 | } |
hayama | 0:c2262bac9aa6 | 667 | lcd.locate(0,0); lcd.printf("gyItg=%f \n", gyItg); |
hayama | 0:c2262bac9aa6 | 668 | lcd.locate(0,1); lcd.printf("angle=%f \n", angle); |
hayama | 0:c2262bac9aa6 | 669 | } |
hayama | 0:c2262bac9aa6 | 670 | } |
hayama | 0:c2262bac9aa6 | 671 | |
hayama | 0:c2262bac9aa6 | 672 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 673 | // モータスタート |
hayama | 0:c2262bac9aa6 | 674 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 675 | void motorStart(){ |
hayama | 0:c2262bac9aa6 | 676 | motorAmp=POSC-posL; |
hayama | 0:c2262bac9aa6 | 677 | Thread::wait(1000); |
hayama | 0:c2262bac9aa6 | 678 | } |
hayama | 0:c2262bac9aa6 | 679 | |
hayama | 0:c2262bac9aa6 | 680 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 681 | // モータストップ |
hayama | 0:c2262bac9aa6 | 682 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 683 | void motorStop(){ |
hayama | 0:c2262bac9aa6 | 684 | motorAmp=POSC; |
hayama | 0:c2262bac9aa6 | 685 | Thread::wait(500); |
hayama | 0:c2262bac9aa6 | 686 | } |
hayama | 0:c2262bac9aa6 | 687 | |
hayama | 0:c2262bac9aa6 | 688 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 689 | // ステアリングニュートラル |
hayama | 0:c2262bac9aa6 | 690 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 691 | void steerNeutral(){ |
hayama | 0:c2262bac9aa6 | 692 | strServo=strn; |
hayama | 0:c2262bac9aa6 | 693 | } |
hayama | 0:c2262bac9aa6 | 694 | |
hayama | 0:c2262bac9aa6 | 695 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 696 | // ニュートラルのセット、スタートでプラス、セットでマイナス、リセットで戻る |
hayama | 0:c2262bac9aa6 | 697 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 698 | void initNeutral(){ |
hayama | 0:c2262bac9aa6 | 699 | while(resetSW==1){ |
hayama | 0:c2262bac9aa6 | 700 | if (startSW==0){strn+=0.01; if (strn>strmax) strn=strmax; } |
hayama | 0:c2262bac9aa6 | 701 | if (setSW==0) {strn-=0.01; if (strn<strmin) strn=strmin; } |
hayama | 0:c2262bac9aa6 | 702 | strServo=strn; // ニュートラル |
hayama | 0:c2262bac9aa6 | 703 | lcd.locate(0,1); lcd.printf("str nuetral=%f \n", strn); |
hayama | 0:c2262bac9aa6 | 704 | Thread::wait(100); |
hayama | 0:c2262bac9aa6 | 705 | } |
hayama | 0:c2262bac9aa6 | 706 | } |
hayama | 0:c2262bac9aa6 | 707 | |
hayama | 0:c2262bac9aa6 | 708 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 709 | // ステアリング最小値のセット、スタートでプラス、セットでマイナス、リセットで戻る |
hayama | 0:c2262bac9aa6 | 710 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 711 | void initStrmin(){ |
hayama | 0:c2262bac9aa6 | 712 | while(resetSW==1){ |
hayama | 0:c2262bac9aa6 | 713 | if (startSW==0) if (strmin<0.5) strmin+=0.02; // 可変範囲は45-90度まで |
hayama | 0:c2262bac9aa6 | 714 | if (setSW==0) if (strmin>0.02) strmin-=0.02; |
hayama | 0:c2262bac9aa6 | 715 | strServo=strmin; // ステアリング最小値に動かす |
hayama | 0:c2262bac9aa6 | 716 | lcd.locate(0,1); lcd.printf("strmin=%f \n", strmin); |
hayama | 0:c2262bac9aa6 | 717 | Thread::wait(100); |
hayama | 0:c2262bac9aa6 | 718 | } |
hayama | 0:c2262bac9aa6 | 719 | } |
hayama | 0:c2262bac9aa6 | 720 | |
hayama | 0:c2262bac9aa6 | 721 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 722 | // ステアリング最大値のセット、スタートでプラス、セットでマイナス、リセットで戻る |
hayama | 0:c2262bac9aa6 | 723 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 724 | void initStrmax(){ |
hayama | 0:c2262bac9aa6 | 725 | while(resetSW==1){ |
hayama | 0:c2262bac9aa6 | 726 | if (startSW==0) if (strmax<0.98) strmax+=0.02; // 可変範囲は90-135度まで |
hayama | 0:c2262bac9aa6 | 727 | if (setSW==0) if (strmax>0.5 ) strmax-=0.02; |
hayama | 0:c2262bac9aa6 | 728 | strServo=strmax; // ステアリング最大値に動かす |
hayama | 0:c2262bac9aa6 | 729 | lcd.locate(0,1); lcd.printf("strmax=%f \n", strmax); |
hayama | 0:c2262bac9aa6 | 730 | Thread::wait(200); |
hayama | 0:c2262bac9aa6 | 731 | } |
hayama | 0:c2262bac9aa6 | 732 | } |
hayama | 0:c2262bac9aa6 | 733 | |
hayama | 0:c2262bac9aa6 | 734 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 735 | // ウェイポイントの半径をセット、スタートでプラス、セットでマイナス、リセットで戻る |
hayama | 0:c2262bac9aa6 | 736 | // 2進数で半径を表示 |
hayama | 0:c2262bac9aa6 | 737 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 738 | void initWr(){ |
hayama | 0:c2262bac9aa6 | 739 | while(resetSW==1){ |
hayama | 0:c2262bac9aa6 | 740 | if (startSW==0){wr+=0.1; if (wr>10) wr=10; } |
hayama | 0:c2262bac9aa6 | 741 | if (setSW==0) {wr-=0.1; if (wr<0.1) wr=0.1; } |
hayama | 0:c2262bac9aa6 | 742 | lcd.locate(0,1); lcd.printf("wr=%f \n", wr); |
hayama | 0:c2262bac9aa6 | 743 | Thread::wait(200); |
hayama | 0:c2262bac9aa6 | 744 | } |
hayama | 0:c2262bac9aa6 | 745 | } |
hayama | 0:c2262bac9aa6 | 746 | |
hayama | 0:c2262bac9aa6 | 747 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 748 | // ステアリング制御の比例係数をセット、スタートでプラス、セットでマイナス、リセットで戻る |
hayama | 0:c2262bac9aa6 | 749 | // 比例係数の50倍を2進数で表示 |
hayama | 0:c2262bac9aa6 | 750 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 751 | void initKs(){ |
hayama | 0:c2262bac9aa6 | 752 | while(resetSW==1){ |
hayama | 0:c2262bac9aa6 | 753 | if (startSW==0){ks+=0.001; if (ks>1) ks=1;} |
hayama | 0:c2262bac9aa6 | 754 | if (setSW==0) {ks-=0.001; if (ks<-1) ks=-1;} |
hayama | 0:c2262bac9aa6 | 755 | lcd.locate(0,1); lcd.printf("ks=%f \n", ks); |
hayama | 0:c2262bac9aa6 | 756 | Thread::wait(200); |
hayama | 0:c2262bac9aa6 | 757 | } |
hayama | 0:c2262bac9aa6 | 758 | } |
hayama | 0:c2262bac9aa6 | 759 | |
hayama | 0:c2262bac9aa6 | 760 | void initKsG(){ |
hayama | 0:c2262bac9aa6 | 761 | while(resetSW==1){ |
hayama | 0:c2262bac9aa6 | 762 | if (startSW==0){ksg+=0.001; if (ksg>1) ksg=1;} |
hayama | 0:c2262bac9aa6 | 763 | if (setSW==0) {ksg-=0.001; if (ksg<-1) ksg=-1;} |
hayama | 0:c2262bac9aa6 | 764 | lcd.locate(0,1); lcd.printf("ksg=%f \n", ksg); |
hayama | 0:c2262bac9aa6 | 765 | Thread::wait(200); |
hayama | 0:c2262bac9aa6 | 766 | } |
hayama | 0:c2262bac9aa6 | 767 | } |
hayama | 0:c2262bac9aa6 | 768 | |
hayama | 0:c2262bac9aa6 | 769 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 770 | // 直進スピードをセット、スタートでプラス、セットでマイナス、リセットで戻る |
hayama | 0:c2262bac9aa6 | 771 | // スピードの1/16を2進数で表示 |
hayama | 0:c2262bac9aa6 | 772 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 773 | void initPosH(){ |
hayama | 0:c2262bac9aa6 | 774 | while(resetSW==1){ |
hayama | 0:c2262bac9aa6 | 775 | motorAmp=POSC-posH; // モータを回転させる |
hayama | 0:c2262bac9aa6 | 776 | if (startSW==0){posH+=0.01; if (posH>0.8) posH=0.8;} |
hayama | 0:c2262bac9aa6 | 777 | if (setSW==0) {posH-=0.01; if (posH<0) posH=0;} |
hayama | 0:c2262bac9aa6 | 778 | lcd.locate(0,1); lcd.printf("PosH=%f \n", posH); |
hayama | 0:c2262bac9aa6 | 779 | Thread::wait(200); |
hayama | 0:c2262bac9aa6 | 780 | } |
hayama | 0:c2262bac9aa6 | 781 | } |
hayama | 0:c2262bac9aa6 | 782 | |
hayama | 0:c2262bac9aa6 | 783 | void initPosL(){ |
hayama | 0:c2262bac9aa6 | 784 | while(resetSW==1){ |
hayama | 0:c2262bac9aa6 | 785 | motorAmp=POSC-posL; // モータを回転させる |
hayama | 0:c2262bac9aa6 | 786 | if (startSW==0){posL+=0.01; if (posL>0.8) posL=0.8;} |
hayama | 0:c2262bac9aa6 | 787 | if (setSW==0) {posL-=0.01; if (posL<0) posL=0;} |
hayama | 0:c2262bac9aa6 | 788 | lcd.locate(0,1); lcd.printf("PosL=%f \n", posL); |
hayama | 0:c2262bac9aa6 | 789 | Thread::wait(200); |
hayama | 0:c2262bac9aa6 | 790 | } |
hayama | 0:c2262bac9aa6 | 791 | } |
hayama | 0:c2262bac9aa6 | 792 | |
hayama | 0:c2262bac9aa6 | 793 | |
hayama | 0:c2262bac9aa6 | 794 | void initSpdH(){ // 走行スピードhighの設定 |
hayama | 0:c2262bac9aa6 | 795 | while(resetSW==1){ |
hayama | 0:c2262bac9aa6 | 796 | if (startSW==0){spdH++; if (spdH>100) spdH=100;} |
hayama | 0:c2262bac9aa6 | 797 | if (setSW==0) {spdH--; if (spdH<0) spdH=0;} |
hayama | 0:c2262bac9aa6 | 798 | lcd.locate(0,1); lcd.printf("speed High=%d \n", spdH); |
hayama | 0:c2262bac9aa6 | 799 | Thread::wait(200); |
hayama | 0:c2262bac9aa6 | 800 | } |
hayama | 0:c2262bac9aa6 | 801 | } |
hayama | 0:c2262bac9aa6 | 802 | |
hayama | 0:c2262bac9aa6 | 803 | void initSpdL(){ // 走行スピードlowの設定 |
hayama | 0:c2262bac9aa6 | 804 | while(resetSW==1){ |
hayama | 0:c2262bac9aa6 | 805 | if (startSW==0){spdL++; if (spdL>100) spdL=100;} |
hayama | 0:c2262bac9aa6 | 806 | if (setSW==0) {spdL--; if (spdL<0) spdL=0;} |
hayama | 0:c2262bac9aa6 | 807 | lcd.locate(0,1); lcd.printf("speed Low=%d \n", spdL); |
hayama | 0:c2262bac9aa6 | 808 | Thread::wait(200); |
hayama | 0:c2262bac9aa6 | 809 | } |
hayama | 0:c2262bac9aa6 | 810 | } |
hayama | 0:c2262bac9aa6 | 811 | |
hayama | 0:c2262bac9aa6 | 812 | void testRun(){ // test run |
hayama | 0:c2262bac9aa6 | 813 | int setSpd=0; |
hayama | 0:c2262bac9aa6 | 814 | while(resetSW==1){ |
hayama | 0:c2262bac9aa6 | 815 | if (setSW==0) setSpd=spdL; |
hayama | 0:c2262bac9aa6 | 816 | if (startSW==0) setSpd=spdH; |
hayama | 0:c2262bac9aa6 | 817 | lcd.locate(0,1); lcd.printf("set speed=%d \n", setSpd); |
hayama | 0:c2262bac9aa6 | 818 | |
hayama | 0:c2262bac9aa6 | 819 | if (setSpd>cntC){ |
hayama | 0:c2262bac9aa6 | 820 | motorAmp=POSC-posH; |
hayama | 0:c2262bac9aa6 | 821 | } else { |
hayama | 0:c2262bac9aa6 | 822 | motorAmp=POSC-posL; |
hayama | 0:c2262bac9aa6 | 823 | } |
hayama | 0:c2262bac9aa6 | 824 | Thread::wait(50); |
hayama | 0:c2262bac9aa6 | 825 | } |
hayama | 0:c2262bac9aa6 | 826 | motorAmp=POSC; |
hayama | 0:c2262bac9aa6 | 827 | } |
hayama | 0:c2262bac9aa6 | 828 | |
hayama | 0:c2262bac9aa6 | 829 | |
hayama | 0:c2262bac9aa6 | 830 | void testCompus(){ |
hayama | 0:c2262bac9aa6 | 831 | lcd.cls(); |
hayama | 0:c2262bac9aa6 | 832 | while(resetSW==1){ |
hayama | 0:c2262bac9aa6 | 833 | lcd.locate(0,0); lcd.printf("compus=%f \n", arrayCompus[compus]); |
hayama | 0:c2262bac9aa6 | 834 | lcd.locate(0,1); lcd.printf("rd=%f \n", rd); |
hayama | 0:c2262bac9aa6 | 835 | Thread::wait(50); |
hayama | 0:c2262bac9aa6 | 836 | } |
hayama | 0:c2262bac9aa6 | 837 | } |
hayama | 0:c2262bac9aa6 | 838 | |
hayama | 0:c2262bac9aa6 | 839 | |
hayama | 0:c2262bac9aa6 | 840 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 841 | // GPS受信テスト,補足状況をLED点灯の数で示す |
hayama | 0:c2262bac9aa6 | 842 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 843 | void dispGPS(){ |
hayama | 0:c2262bac9aa6 | 844 | while(resetSW==1){ |
hayama | 0:c2262bac9aa6 | 845 | lcd.cls(); |
hayama | 0:c2262bac9aa6 | 846 | if (latit==0) lcd.printf("GPS Not Found \n"); |
hayama | 0:c2262bac9aa6 | 847 | else { |
hayama | 0:c2262bac9aa6 | 848 | lcd.cls(); |
hayama | 0:c2262bac9aa6 | 849 | lcd.printf("LA=%f \n", latit); |
hayama | 0:c2262bac9aa6 | 850 | lcd.printf("LO=%f \n", longit); |
hayama | 0:c2262bac9aa6 | 851 | Thread::wait(1500); |
hayama | 0:c2262bac9aa6 | 852 | lcd.cls(); |
hayama | 0:c2262bac9aa6 | 853 | lcd.printf("rv=%f3 \n",rv); |
hayama | 0:c2262bac9aa6 | 854 | lcd.printf("rd=%f3 \n",rd); |
hayama | 0:c2262bac9aa6 | 855 | Thread::wait(1500); |
hayama | 0:c2262bac9aa6 | 856 | } |
hayama | 0:c2262bac9aa6 | 857 | Thread::wait(200); |
hayama | 0:c2262bac9aa6 | 858 | |
hayama | 0:c2262bac9aa6 | 859 | } |
hayama | 0:c2262bac9aa6 | 860 | Thread::wait(200); |
hayama | 0:c2262bac9aa6 | 861 | } |
hayama | 0:c2262bac9aa6 | 862 | |
hayama | 0:c2262bac9aa6 | 863 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 864 | // GPS信号の数値返還 |
hayama | 0:c2262bac9aa6 | 865 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 866 | void gps_val(){ |
hayama | 0:c2262bac9aa6 | 867 | latitB=latit; longitB=longit; // 一つ前の値を保管 |
hayama | 0:c2262bac9aa6 | 868 | latit=atof(latitude+2); // 文字列を実数に変換.有効数字が足りないので度単位を省略 |
hayama | 0:c2262bac9aa6 | 869 | longit=atof(longitude+3); // 文字列を実数に変換.有効数字が足りないので度単位を省略 |
hayama | 0:c2262bac9aa6 | 870 | kn=atof(knot); |
hayama | 0:c2262bac9aa6 | 871 | rv=kn*0.51; // ノット単位をメートル単位に変換 |
hayama | 0:c2262bac9aa6 | 872 | rdB=rd; // 一つ前の値を保管 |
hayama | 0:c2262bac9aa6 | 873 | rd=atof(direct); // 方位を数値変換 |
hayama | 0:c2262bac9aa6 | 874 | } |
hayama | 0:c2262bac9aa6 | 875 | |
hayama | 0:c2262bac9aa6 | 876 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 877 | // 現在地とウェイポイントとの相対関係を計算 |
hayama | 0:c2262bac9aa6 | 878 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 879 | void gps_cal(){ |
hayama | 0:c2262bac9aa6 | 880 | // 緯度経度の数値変換,目標地点との差分を計算 |
hayama | 0:c2262bac9aa6 | 881 | dy=(wy[np] - latit ) *1860; |
hayama | 0:c2262bac9aa6 | 882 | dx=(wx[np] - longit)*1560; |
hayama | 0:c2262bac9aa6 | 883 | |
hayama | 0:c2262bac9aa6 | 884 | // 目標地点までのと距離を計算 |
hayama | 0:c2262bac9aa6 | 885 | dr=sqrt(pow(dy,2)+pow(dx,2)); |
hayama | 0:c2262bac9aa6 | 886 | |
hayama | 0:c2262bac9aa6 | 887 | // 目標地点への方向を計算 |
hayama | 0:c2262bac9aa6 | 888 | dd = atan(dx / dy); // 北に対する角度を求める(±π/2範囲) |
hayama | 0:c2262bac9aa6 | 889 | dd=dd*57; // ラジアン->度に変換 dd*(180/pai) |
hayama | 0:c2262bac9aa6 | 890 | // 0-360度に変換 |
hayama | 0:c2262bac9aa6 | 891 | if (dx > 0 && dy < 0) dd = 180 + dd; |
hayama | 0:c2262bac9aa6 | 892 | else if(dx < 0 && dy < 0) dd = 180 + dd; |
hayama | 0:c2262bac9aa6 | 893 | else if(dx < 0 && dy > 0) dd = 360 + dd; |
hayama | 0:c2262bac9aa6 | 894 | else; |
hayama | 0:c2262bac9aa6 | 895 | |
hayama | 0:c2262bac9aa6 | 896 | // GPSが正しい方位を出力しない場合は、前の座標との差分で計算 |
hayama | 0:c2262bac9aa6 | 897 | dy2=(latit -latitB) *1860; |
hayama | 0:c2262bac9aa6 | 898 | dx2=(longit-longitB)*1560; |
hayama | 0:c2262bac9aa6 | 899 | |
hayama | 0:c2262bac9aa6 | 900 | if (dy2==0 || dx2==0){ // 緯度または経度のどちらかの変化が0の時 |
hayama | 0:c2262bac9aa6 | 901 | if (dy2==0){ if (dx2<0) rd2= 270; else rd2=90; } // rd2= 0, 90, 180,270 のいずれかを直接与える. |
hayama | 0:c2262bac9aa6 | 902 | if (dx2==0){ if (dy2<0) rd2=-180; else rd2=0; } // dy2,dx2のどちらも0の時はrd2=0 |
hayama | 0:c2262bac9aa6 | 903 | } else { |
hayama | 0:c2262bac9aa6 | 904 | // 目標地点への方向を計算 |
hayama | 0:c2262bac9aa6 | 905 | rd2 = atan(dx2 / dy2); // 北に対する角度を求める(±π/2範囲) |
hayama | 0:c2262bac9aa6 | 906 | rd2=rd2*57; // ラジアン->度に変換 dd*(180/pai) |
hayama | 0:c2262bac9aa6 | 907 | // 0-360度に変換 |
hayama | 0:c2262bac9aa6 | 908 | if (dx2 > 0 && dy2 < 0) rd2 = 180 + rd2; |
hayama | 0:c2262bac9aa6 | 909 | else if(dx2 < 0 && dy2 < 0) rd2 = 180 + rd2; |
hayama | 0:c2262bac9aa6 | 910 | else if(dx2 < 0 && dy2 > 0) rd2 = 360 + rd2; |
hayama | 0:c2262bac9aa6 | 911 | else; |
hayama | 0:c2262bac9aa6 | 912 | } |
hayama | 0:c2262bac9aa6 | 913 | |
hayama | 0:c2262bac9aa6 | 914 | // 移動距離が小さくて使用するGPSが正しい速度と方向を出さない時のみ |
hayama | 0:c2262bac9aa6 | 915 | // 座標差から計算した値と置き換える(速度=0,方位前の値のまま,GPSの仕様により異なる) |
hayama | 0:c2262bac9aa6 | 916 | if (kn==0 && dx2!=0 && dy2!=0){ |
hayama | 0:c2262bac9aa6 | 917 | rd=rd2; |
hayama | 0:c2262bac9aa6 | 918 | } |
hayama | 0:c2262bac9aa6 | 919 | |
hayama | 0:c2262bac9aa6 | 920 | // compare the dirction by GPS and compus |
hayama | 0:c2262bac9aa6 | 921 | if (rd>180) rdCpy=rd-360; else rdCpy=rd; |
hayama | 0:c2262bac9aa6 | 922 | if (dirCompus>180) dirCompusCpy=dirCompus-360; else dirCompusCpy=dirCompus; |
hayama | 0:c2262bac9aa6 | 923 | // compare the dirction by GPS and compus |
hayama | 0:c2262bac9aa6 | 924 | rd=(fabs(rdCpy-dirCompusCpy)>45)? dirCompus: rd; |
hayama | 0:c2262bac9aa6 | 925 | |
hayama | 0:c2262bac9aa6 | 926 | // 方位偏差の計算し,現在の進行方向から±180度の範囲に直す |
hayama | 0:c2262bac9aa6 | 927 | dd=dd-rd; |
hayama | 0:c2262bac9aa6 | 928 | if (dd>180) dd=dd-360; |
hayama | 0:c2262bac9aa6 | 929 | else if (dd<-180) dd=dd+360; |
hayama | 0:c2262bac9aa6 | 930 | } |
hayama | 0:c2262bac9aa6 | 931 | |
hayama | 0:c2262bac9aa6 | 932 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 933 | // gps read by serial task |
hayama | 0:c2262bac9aa6 | 934 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 935 | void serial_task(void const*) { |
hayama | 0:c2262bac9aa6 | 936 | char c; |
hayama | 0:c2262bac9aa6 | 937 | int i=0; |
hayama | 0:c2262bac9aa6 | 938 | //FILE *fp; |
hayama | 0:c2262bac9aa6 | 939 | |
hayama | 0:c2262bac9aa6 | 940 | USBHostSerial serial; |
hayama | 0:c2262bac9aa6 | 941 | |
hayama | 0:c2262bac9aa6 | 942 | while(1) { |
hayama | 0:c2262bac9aa6 | 943 | while(!serial.connect()) Thread::wait(500); // try to connect a serial device |
hayama | 0:c2262bac9aa6 | 944 | |
hayama | 0:c2262bac9aa6 | 945 | while (1) { |
hayama | 0:c2262bac9aa6 | 946 | if (!serial.connected()) break; // if device disconnected, try to connect it again |
hayama | 0:c2262bac9aa6 | 947 | |
hayama | 0:c2262bac9aa6 | 948 | while (serial.available()) { // receive message |
hayama | 0:c2262bac9aa6 | 949 | c= serial.getc(); |
hayama | 0:c2262bac9aa6 | 950 | str[i]=c; |
hayama | 0:c2262bac9aa6 | 951 | if (c == '\n') break; |
hayama | 0:c2262bac9aa6 | 952 | i++; |
hayama | 0:c2262bac9aa6 | 953 | } |
hayama | 0:c2262bac9aa6 | 954 | str[i] = '\0'; |
hayama | 0:c2262bac9aa6 | 955 | i=0; |
hayama | 0:c2262bac9aa6 | 956 | //fp=fopen("/local/log.txt", "a"); // Open "out.txt" on the local file system for writing |
hayama | 0:c2262bac9aa6 | 957 | //fprintf(fp, str); |
hayama | 0:c2262bac9aa6 | 958 | //fclose(fp); |
hayama | 0:c2262bac9aa6 | 959 | |
hayama | 0:c2262bac9aa6 | 960 | header=strtok(str,","); |
hayama | 0:c2262bac9aa6 | 961 | |
hayama | 0:c2262bac9aa6 | 962 | //if RMC line |
hayama | 0:c2262bac9aa6 | 963 | if(strcmp(header,"$GNRMC")==0){ |
hayama | 0:c2262bac9aa6 | 964 | strtok(NULL,","); |
hayama | 0:c2262bac9aa6 | 965 | strtok(NULL,","); |
hayama | 0:c2262bac9aa6 | 966 | latitude=strtok(NULL,","); //get latitude |
hayama | 0:c2262bac9aa6 | 967 | strtok(NULL,","); |
hayama | 0:c2262bac9aa6 | 968 | longitude=strtok(NULL,","); //get longtude |
hayama | 0:c2262bac9aa6 | 969 | strtok(NULL,","); // E読み飛ばし |
hayama | 0:c2262bac9aa6 | 970 | knot=strtok(NULL,","); // 速度 get |
hayama | 0:c2262bac9aa6 | 971 | direct=strtok(NULL,","); // 進行方向 get |
hayama | 0:c2262bac9aa6 | 972 | gps_val(); // GPS信号の数値返還 |
hayama | 0:c2262bac9aa6 | 973 | gps_cal(); // 現在地とウェイポイントとの関係を計算 |
hayama | 0:c2262bac9aa6 | 974 | recvGPS++; if(recvGPS>2) recvGPS=2; |
hayama | 0:c2262bac9aa6 | 975 | printf("LA=%f LO=%f kn=%f rv=%f rd=%f recvGPS=%d\n", latit, longit, kn, rv, rd, recvGPS ); |
hayama | 0:c2262bac9aa6 | 976 | } |
hayama | 0:c2262bac9aa6 | 977 | |
hayama | 0:c2262bac9aa6 | 978 | if(strcmp(header,"$GPRMC")==0){ |
hayama | 0:c2262bac9aa6 | 979 | strtok(NULL,","); |
hayama | 0:c2262bac9aa6 | 980 | strtok(NULL,","); |
hayama | 0:c2262bac9aa6 | 981 | latitude=strtok(NULL,","); //get latitude |
hayama | 0:c2262bac9aa6 | 982 | strtok(NULL,","); |
hayama | 0:c2262bac9aa6 | 983 | longitude=strtok(NULL,","); //get longtude |
hayama | 0:c2262bac9aa6 | 984 | strtok(NULL,","); // E読み飛ばし |
hayama | 0:c2262bac9aa6 | 985 | knot=strtok(NULL,","); // 速度 get |
hayama | 0:c2262bac9aa6 | 986 | direct=strtok(NULL,","); // 進行方向 get |
hayama | 0:c2262bac9aa6 | 987 | gps_val(); // GPS信号の数値返還 |
hayama | 0:c2262bac9aa6 | 988 | gps_cal(); // 現在地とウェイポイントとの関係を計算 |
hayama | 0:c2262bac9aa6 | 989 | recvGPS++; if(recvGPS>2) recvGPS=2; |
hayama | 0:c2262bac9aa6 | 990 | printf("LA=%f LO=%f kn=%f rv=%f rd=%f recvGPS=%d\n", latit, longit, kn, rv, rd, recvGPS ); |
hayama | 0:c2262bac9aa6 | 991 | } |
hayama | 0:c2262bac9aa6 | 992 | |
hayama | 0:c2262bac9aa6 | 993 | //if QZQSM line |
hayama | 0:c2262bac9aa6 | 994 | if(strcmp(header,"$QZQSM")==0 && recvQZSS==0){ //if RMC line |
hayama | 0:c2262bac9aa6 | 995 | strtok(NULL,","); // 55 |
hayama | 0:c2262bac9aa6 | 996 | //strtok(NULL,","); // 53 |
hayama | 0:c2262bac9aa6 | 997 | messages=strtok(NULL,"*"); |
hayama | 0:c2262bac9aa6 | 998 | printf("%s\n",messages+4); // messages |
hayama | 0:c2262bac9aa6 | 999 | strncpy(strtmp,messages+4,4); strtmp[4]='\0'; |
hayama | 0:c2262bac9aa6 | 1000 | year=strtol(strtmp,NULL,16); |
hayama | 0:c2262bac9aa6 | 1001 | strncpy(strtmp,messages+8,2); strtmp[2]='\0'; |
hayama | 0:c2262bac9aa6 | 1002 | teamNum =strtol(strtmp,NULL,16); |
hayama | 0:c2262bac9aa6 | 1003 | strncpy(strtmp,messages+10,2); strtmp[2]='\0'; |
hayama | 0:c2262bac9aa6 | 1004 | numA =strtol(strtmp,NULL,16); |
hayama | 0:c2262bac9aa6 | 1005 | strncpy(strtmp,messages+12,2); strtmp[2]='\0'; |
hayama | 0:c2262bac9aa6 | 1006 | sizeA=strtol(strtmp,NULL,16); |
hayama | 0:c2262bac9aa6 | 1007 | strncpy(strtmp,messages+14,2); strtmp[2]='\0'; |
hayama | 0:c2262bac9aa6 | 1008 | numB =strtol(strtmp,NULL,16); |
hayama | 0:c2262bac9aa6 | 1009 | strncpy(strtmp,messages+16,2); strtmp[2]='\0'; |
hayama | 0:c2262bac9aa6 | 1010 | sizeB=strtol(strtmp,NULL,16); |
hayama | 0:c2262bac9aa6 | 1011 | strncpy(strtmp,messages+18,2); strtmp[2]='\0'; |
hayama | 0:c2262bac9aa6 | 1012 | numT=strtol(strtmp,NULL,16); |
hayama | 0:c2262bac9aa6 | 1013 | strncpy(strtmp,messages+20,2); strtmp[2]='\0'; |
hayama | 0:c2262bac9aa6 | 1014 | startA=strtol(strtmp,NULL,18); |
hayama | 0:c2262bac9aa6 | 1015 | strncpy(strtmp,messages+22,2); strtmp[2]='\0'; |
hayama | 0:c2262bac9aa6 | 1016 | startB=strtol(strtmp,NULL,20); |
hayama | 0:c2262bac9aa6 | 1017 | for(i=0; i<numT; i++){ |
hayama | 0:c2262bac9aa6 | 1018 | strncpy(strtmp,messages+24+i*4,2); strtmp[2]='\0'; |
hayama | 0:c2262bac9aa6 | 1019 | targetA[i]=strtol(strtmp,NULL,16); |
hayama | 0:c2262bac9aa6 | 1020 | strncpy(strtmp,messages+26+i*4,2); strtmp[2]='\0'; |
hayama | 0:c2262bac9aa6 | 1021 | targetB[i]=strtol(strtmp,NULL,16); |
hayama | 0:c2262bac9aa6 | 1022 | } |
hayama | 0:c2262bac9aa6 | 1023 | if (teamNum==tNum) recvQZSS=1; |
hayama | 0:c2262bac9aa6 | 1024 | |
hayama | 0:c2262bac9aa6 | 1025 | printf("year=%d\n",year); |
hayama | 0:c2262bac9aa6 | 1026 | printf("teamNum=%d\n",teamNum); |
hayama | 0:c2262bac9aa6 | 1027 | printf("numA=%d\n",numA); |
hayama | 0:c2262bac9aa6 | 1028 | printf("sizeA=%d\n",sizeA); |
hayama | 0:c2262bac9aa6 | 1029 | printf("numB=%d\n",numB); |
hayama | 0:c2262bac9aa6 | 1030 | printf("sizeB=%d\n",sizeB); |
hayama | 0:c2262bac9aa6 | 1031 | printf("tNum=%d\n",numT); |
hayama | 0:c2262bac9aa6 | 1032 | printf("startA=%d\n",startA); |
hayama | 0:c2262bac9aa6 | 1033 | printf("startB=%d\n",startB); |
hayama | 0:c2262bac9aa6 | 1034 | for(i=0; i<numT; i++){ |
hayama | 0:c2262bac9aa6 | 1035 | printf("targetA[%d]=%d\n",i,targetA[i]); |
hayama | 0:c2262bac9aa6 | 1036 | printf("targetB[%d]=%d\n",i,targetB[i]); |
hayama | 0:c2262bac9aa6 | 1037 | } |
hayama | 0:c2262bac9aa6 | 1038 | printf("recvQZSS=%d\n",recvQZSS); |
hayama | 0:c2262bac9aa6 | 1039 | } |
hayama | 0:c2262bac9aa6 | 1040 | Thread::wait(50); |
hayama | 0:c2262bac9aa6 | 1041 | } |
hayama | 0:c2262bac9aa6 | 1042 | } |
hayama | 0:c2262bac9aa6 | 1043 | } |
hayama | 0:c2262bac9aa6 | 1044 | |
hayama | 0:c2262bac9aa6 | 1045 | |
hayama | 0:c2262bac9aa6 | 1046 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 1047 | // GPSによる走行 |
hayama | 0:c2262bac9aa6 | 1048 | // runMode=0:GPS run without Gyro, normal rule( stop waypoint) |
hayama | 0:c2262bac9aa6 | 1049 | // runMode=1:GPS run without Gyro, Double pylon race( loop waypoint without stop) |
hayama | 0:c2262bac9aa6 | 1050 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 1051 | void runGPS(int runMode){ |
hayama | 0:c2262bac9aa6 | 1052 | lcd.cls(); lcd.locate(0,1); lcd.printf("Start!"); // 目標値までの距離をLEDに表示 |
hayama | 0:c2262bac9aa6 | 1053 | Thread::wait(1000); |
hayama | 0:c2262bac9aa6 | 1054 | |
hayama | 0:c2262bac9aa6 | 1055 | np=0; |
hayama | 0:c2262bac9aa6 | 1056 | motorStart(); |
hayama | 0:c2262bac9aa6 | 1057 | |
hayama | 0:c2262bac9aa6 | 1058 | while (resetSW==1){ // STARTスイッチが押されたら抜ける |
hayama | 0:c2262bac9aa6 | 1059 | // speed control |
hayama | 0:c2262bac9aa6 | 1060 | if (fabs(dr-wr)>8){ // ステアリングが真っ直ぐで距離が十分あるとき |
hayama | 0:c2262bac9aa6 | 1061 | if (cntC>spdH) motorAmp=POSC-posL; else motorAmp=POSC-posH; |
hayama | 0:c2262bac9aa6 | 1062 | } else { |
hayama | 0:c2262bac9aa6 | 1063 | if (cntC>spdL) motorAmp=POSC-posL; else motorAmp=POSC-posH; |
hayama | 0:c2262bac9aa6 | 1064 | } |
hayama | 0:c2262bac9aa6 | 1065 | |
hayama | 0:c2262bac9aa6 | 1066 | while (recvGPS==0) Thread::wait(15); // GPS受信待ち |
hayama | 0:c2262bac9aa6 | 1067 | recvGPS=0; // reset after GPS recv |
hayama | 0:c2262bac9aa6 | 1068 | lcd.locate(0,0); lcd.printf("dd=%f \n", dd); // 目標値までの距離をLEDに表示 |
hayama | 0:c2262bac9aa6 | 1069 | lcd.locate(0,1); lcd.printf("dr=%f \n", dr); // 目標値までの距離をLEDに表示 |
hayama | 0:c2262bac9aa6 | 1070 | |
hayama | 0:c2262bac9aa6 | 1071 | // 角度差に応じて方向にステアリングを切る. |
hayama | 0:c2262bac9aa6 | 1072 | posSteer=strn - dd*ks; |
hayama | 0:c2262bac9aa6 | 1073 | posSteer=(posSteer<strmin)? strmin: (posSteer>strmax)? strmax: posSteer; // 切れ幅を制限する |
hayama | 0:c2262bac9aa6 | 1074 | if (kn==0) posSteer=strn; // GPSで方位が得られなかった時(速度=0)ニュートラルに戻す |
hayama | 0:c2262bac9aa6 | 1075 | strServo=posSteer; |
hayama | 0:c2262bac9aa6 | 1076 | Thread::wait(15); |
hayama | 0:c2262bac9aa6 | 1077 | |
hayama | 0:c2262bac9aa6 | 1078 | // ウェイポイントとの距離を求め,ポイント更新または走行終了判断 |
hayama | 0:c2262bac9aa6 | 1079 | if (dr < wr){ |
hayama | 0:c2262bac9aa6 | 1080 | steerNeutral(); |
hayama | 0:c2262bac9aa6 | 1081 | if(runMode==0) motorStop(); |
hayama | 0:c2262bac9aa6 | 1082 | np++; |
hayama | 0:c2262bac9aa6 | 1083 | if (np>=wp){ |
hayama | 0:c2262bac9aa6 | 1084 | if(runMode==0) break; // when normal robot car rule, |
hayama | 0:c2262bac9aa6 | 1085 | else np=0; |
hayama | 0:c2262bac9aa6 | 1086 | } |
hayama | 0:c2262bac9aa6 | 1087 | // 次のポイント数を表示 |
hayama | 0:c2262bac9aa6 | 1088 | lcd.locate(0,1); lcd.printf("Next WP:%d ",np); |
hayama | 0:c2262bac9aa6 | 1089 | if(runMode==0){ // normal rule, wait 6sec |
hayama | 0:c2262bac9aa6 | 1090 | Thread::wait(6000); |
hayama | 0:c2262bac9aa6 | 1091 | motorStart(); |
hayama | 0:c2262bac9aa6 | 1092 | } |
hayama | 0:c2262bac9aa6 | 1093 | } |
hayama | 0:c2262bac9aa6 | 1094 | } |
hayama | 0:c2262bac9aa6 | 1095 | } |
hayama | 0:c2262bac9aa6 | 1096 | |
hayama | 0:c2262bac9aa6 | 1097 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 1098 | // GPSによる走行, with gyro |
hayama | 0:c2262bac9aa6 | 1099 | // runMode=0:GPS run with Gyro, normal rule( stop waypoint) |
hayama | 0:c2262bac9aa6 | 1100 | // runMode=1:GPS run with Gyro, Double pylon race( loop waypoint without stop) |
hayama | 0:c2262bac9aa6 | 1101 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 1102 | void runGPSandGyro(int runMode){ |
hayama | 0:c2262bac9aa6 | 1103 | lcd.cls(); lcd.locate(0,1); lcd.printf("Start!"); // 目標値までの距離をLEDに表示 |
hayama | 0:c2262bac9aa6 | 1104 | Thread::wait(1000); |
hayama | 0:c2262bac9aa6 | 1105 | |
hayama | 0:c2262bac9aa6 | 1106 | np=0; |
hayama | 0:c2262bac9aa6 | 1107 | motorStart(); |
hayama | 0:c2262bac9aa6 | 1108 | |
hayama | 0:c2262bac9aa6 | 1109 | while (resetSW==1){ // STARTスイッチが押されたら抜ける |
hayama | 0:c2262bac9aa6 | 1110 | // speed control |
hayama | 0:c2262bac9aa6 | 1111 | if (fabs(dr-wr)>8){ // ステアリングが真っ直ぐで距離が十分あるとき |
hayama | 0:c2262bac9aa6 | 1112 | if (cntC>spdH) motorAmp=POSC-posL; else motorAmp=POSC-posH; |
hayama | 0:c2262bac9aa6 | 1113 | } else { |
hayama | 0:c2262bac9aa6 | 1114 | if (cntC>spdL) motorAmp=POSC-posL; else motorAmp=POSC-posH; |
hayama | 0:c2262bac9aa6 | 1115 | } |
hayama | 0:c2262bac9aa6 | 1116 | |
hayama | 0:c2262bac9aa6 | 1117 | //if (recvGPS==2){ |
hayama | 0:c2262bac9aa6 | 1118 | if (recvGPS>=1){ |
hayama | 0:c2262bac9aa6 | 1119 | recvGPS=0; // reset after GPS recv |
hayama | 0:c2262bac9aa6 | 1120 | ddCpy=dd; // GPSを受信した時の角度差を記録 |
hayama | 0:c2262bac9aa6 | 1121 | lcd.locate(0,0); lcd.printf("dd=%f \n", dd); // 目標値までの距離をLEDに表示 |
hayama | 0:c2262bac9aa6 | 1122 | lcd.locate(0,1); lcd.printf("dr=%f \n", dr); // 目標値までの距離をLEDに表示 |
hayama | 0:c2262bac9aa6 | 1123 | |
hayama | 0:c2262bac9aa6 | 1124 | // 角度差に応じて方向にステアリングを切る. |
hayama | 0:c2262bac9aa6 | 1125 | posSteer=strn - dd*ksg; |
hayama | 0:c2262bac9aa6 | 1126 | |
hayama | 0:c2262bac9aa6 | 1127 | posSteer=(posSteer<strmin)? strmin: (posSteer>strmax)? strmax: posSteer; // 切れ幅を制限する |
hayama | 0:c2262bac9aa6 | 1128 | if (kn==0) posSteer=strn; // GPSで方位が得られなかった時(速度=0)ニュートラルに戻す |
hayama | 0:c2262bac9aa6 | 1129 | strServo=posSteer; |
hayama | 0:c2262bac9aa6 | 1130 | Thread::wait(15); |
hayama | 0:c2262bac9aa6 | 1131 | gyro_reset(); |
hayama | 0:c2262bac9aa6 | 1132 | } |
hayama | 0:c2262bac9aa6 | 1133 | // ジャイロで角度モニタ,指定角度でステアリング戻す,ddはターン中も更新されるので更新されないddCpyでターン |
hayama | 0:c2262bac9aa6 | 1134 | if (fabs(angle)>fabs(ddCpy)){posSteer=strn; strServo=posSteer;} |
hayama | 0:c2262bac9aa6 | 1135 | // ターン途中かつターン角度が大きい時,GPS受信しても数値を更新させない,recvGPS=0から次のターンまで2秒.待ちすぎか? |
hayama | 0:c2262bac9aa6 | 1136 | if (posSteer!=strn && fabs(ddCpy)>60) recvGPS=0; |
hayama | 0:c2262bac9aa6 | 1137 | |
hayama | 0:c2262bac9aa6 | 1138 | // ウェイポイントとの距離を求め,ポイント更新または走行終了判断 |
hayama | 0:c2262bac9aa6 | 1139 | if (dr < wr){ |
hayama | 0:c2262bac9aa6 | 1140 | steerNeutral(); |
hayama | 0:c2262bac9aa6 | 1141 | if(runMode==0) motorStop(); |
hayama | 0:c2262bac9aa6 | 1142 | np++; |
hayama | 0:c2262bac9aa6 | 1143 | if (np>=wp){ |
hayama | 0:c2262bac9aa6 | 1144 | if(runMode==0) break; // when normal robot car rule, |
hayama | 0:c2262bac9aa6 | 1145 | else np=0; |
hayama | 0:c2262bac9aa6 | 1146 | } |
hayama | 0:c2262bac9aa6 | 1147 | // 次のポイント数を表示 |
hayama | 0:c2262bac9aa6 | 1148 | lcd.locate(0,1); lcd.printf("Next WP:%d ",np); |
hayama | 0:c2262bac9aa6 | 1149 | if(runMode==0){ // normal rule, wait 6.5sec |
hayama | 0:c2262bac9aa6 | 1150 | Thread::wait(6500); |
hayama | 0:c2262bac9aa6 | 1151 | motorStart(); // run straignt for 1 sec. |
hayama | 0:c2262bac9aa6 | 1152 | } |
hayama | 0:c2262bac9aa6 | 1153 | } |
hayama | 0:c2262bac9aa6 | 1154 | Thread::wait(15); |
hayama | 0:c2262bac9aa6 | 1155 | } |
hayama | 0:c2262bac9aa6 | 1156 | } |
hayama | 0:c2262bac9aa6 | 1157 | |
hayama | 0:c2262bac9aa6 | 1158 | |
hayama | 0:c2262bac9aa6 | 1159 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 1160 | // QZSSによる走行, |
hayama | 0:c2262bac9aa6 | 1161 | // runMode=0: without Gyro, normal rule( stop waypoint) |
hayama | 0:c2262bac9aa6 | 1162 | // runMode=1: with Gyro, normal rule( stop waypoint) |
hayama | 0:c2262bac9aa6 | 1163 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 1164 | void runQZSS(int runMode){ |
hayama | 0:c2262bac9aa6 | 1165 | |
hayama | 0:c2262bac9aa6 | 1166 | lcd.cls(); |
hayama | 0:c2262bac9aa6 | 1167 | lcd.printf("Waiting QZSS\n"); |
hayama | 0:c2262bac9aa6 | 1168 | lcd.locate(0,1); |
hayama | 0:c2262bac9aa6 | 1169 | lcd.printf("massage: %d \n", tNum); |
hayama | 0:c2262bac9aa6 | 1170 | while (recvQZSS==0){ |
hayama | 0:c2262bac9aa6 | 1171 | Thread::wait(500); |
hayama | 0:c2262bac9aa6 | 1172 | if (resetSW==0) break; |
hayama | 0:c2262bac9aa6 | 1173 | if (startSW==0){tNum++; if (tNum>25) tNum=0;} |
hayama | 0:c2262bac9aa6 | 1174 | if (setSW==0) {tNum--; if (tNum<0) tNum=25;} |
hayama | 0:c2262bac9aa6 | 1175 | lcd.locate(0,1); lcd.printf("massage: %d \n", tNum); |
hayama | 0:c2262bac9aa6 | 1176 | } |
hayama | 0:c2262bac9aa6 | 1177 | |
hayama | 0:c2262bac9aa6 | 1178 | lcd.cls(); |
hayama | 0:c2262bac9aa6 | 1179 | lcd.printf("QZSS massage \n"); |
hayama | 0:c2262bac9aa6 | 1180 | lcd.printf("Recieved !! \n"); |
hayama | 0:c2262bac9aa6 | 1181 | Thread::wait(3000); |
hayama | 0:c2262bac9aa6 | 1182 | |
hayama | 0:c2262bac9aa6 | 1183 | // set way point |
hayama | 0:c2262bac9aa6 | 1184 | wp=0; |
hayama | 0:c2262bac9aa6 | 1185 | //wy[wp]=wyQ[startA][startB]; |
hayama | 0:c2262bac9aa6 | 1186 | //wx[wp]=wxQ[startA][startB]; |
hayama | 0:c2262bac9aa6 | 1187 | //wp++; |
hayama | 0:c2262bac9aa6 | 1188 | for(int i=0; i<numT; i++){ |
hayama | 0:c2262bac9aa6 | 1189 | wy[wp]=wyQ[targetA[i]][targetB[i]]; |
hayama | 0:c2262bac9aa6 | 1190 | wx[wp]=wxQ[targetA[i]][targetB[i]]; |
hayama | 0:c2262bac9aa6 | 1191 | wp++; |
hayama | 0:c2262bac9aa6 | 1192 | } |
hayama | 0:c2262bac9aa6 | 1193 | |
hayama | 0:c2262bac9aa6 | 1194 | if (runMode==0) runGPS(0); runGPSandGyro(0); |
hayama | 0:c2262bac9aa6 | 1195 | } |
hayama | 0:c2262bac9aa6 | 1196 | |
hayama | 0:c2262bac9aa6 | 1197 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 1198 | // セットアップ以外の初期値設定 |
hayama | 0:c2262bac9aa6 | 1199 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 1200 | void initPara(){ |
hayama | 0:c2262bac9aa6 | 1201 | steerNeutral(); |
hayama | 0:c2262bac9aa6 | 1202 | motorStop(); |
hayama | 0:c2262bac9aa6 | 1203 | } |
hayama | 0:c2262bac9aa6 | 1204 | |
hayama | 0:c2262bac9aa6 | 1205 | //-------------------------------------------------------------------------- |
hayama | 0:c2262bac9aa6 | 1206 | int main() { |
hayama | 0:c2262bac9aa6 | 1207 | strServo=POSC; motorAmp=POSC; |
hayama | 0:c2262bac9aa6 | 1208 | resetSW.mode(PullUp); setSW.mode(PullUp); startSW.mode(PullUp); |
hayama | 0:c2262bac9aa6 | 1209 | Thread serialTask(serial_task, NULL, osPriorityNormal, 256 * 4); |
hayama | 0:c2262bac9aa6 | 1210 | timerS.attach_us(&sensor, 1000); // set timer to 1ms for timer interrupt |
hayama | 0:c2262bac9aa6 | 1211 | ptR.rise(&countR); |
hayama | 0:c2262bac9aa6 | 1212 | ptL.rise(&countL); |
hayama | 0:c2262bac9aa6 | 1213 | timer.start(); |
hayama | 0:c2262bac9aa6 | 1214 | gyro_offset(); |
hayama | 0:c2262bac9aa6 | 1215 | readParam(); |
hayama | 0:c2262bac9aa6 | 1216 | |
hayama | 0:c2262bac9aa6 | 1217 | lcd.cls(); |
hayama | 0:c2262bac9aa6 | 1218 | lcd.printf("GPS robocar v1\n"); |
hayama | 0:c2262bac9aa6 | 1219 | lcd.printf("sw:ret set start\n"); |
hayama | 0:c2262bac9aa6 | 1220 | while(resetSW==1 && setSW==1 && startSW==1); |
hayama | 0:c2262bac9aa6 | 1221 | lcd.locate(0,1); lcd.printf(menuS[pmode]); |
hayama | 0:c2262bac9aa6 | 1222 | |
hayama | 0:c2262bac9aa6 | 1223 | while(1) { |
hayama | 0:c2262bac9aa6 | 1224 | |
hayama | 0:c2262bac9aa6 | 1225 | // initialize parameters |
hayama | 0:c2262bac9aa6 | 1226 | initPara(); |
hayama | 0:c2262bac9aa6 | 1227 | lcd.cls(); |
hayama | 0:c2262bac9aa6 | 1228 | lcd.printf("GPS robocar v1\n"); |
hayama | 0:c2262bac9aa6 | 1229 | lcd.locate(0,1); lcd.printf(menuS[pmode]); |
hayama | 0:c2262bac9aa6 | 1230 | |
hayama | 0:c2262bac9aa6 | 1231 | while (startSW==1) { |
hayama | 0:c2262bac9aa6 | 1232 | if (resetSW==0) { |
hayama | 0:c2262bac9aa6 | 1233 | Thread::wait(10); |
hayama | 0:c2262bac9aa6 | 1234 | while (resetSW==0); |
hayama | 0:c2262bac9aa6 | 1235 | Thread::wait(10); |
hayama | 0:c2262bac9aa6 | 1236 | pmode--; |
hayama | 0:c2262bac9aa6 | 1237 | if (pmode<0) pmode=nmenu; |
hayama | 0:c2262bac9aa6 | 1238 | lcd.locate(0,1); |
hayama | 0:c2262bac9aa6 | 1239 | lcd.printf(menuS[pmode]); |
hayama | 0:c2262bac9aa6 | 1240 | } |
hayama | 0:c2262bac9aa6 | 1241 | if (setSW==0) { |
hayama | 0:c2262bac9aa6 | 1242 | Thread::wait(10); |
hayama | 0:c2262bac9aa6 | 1243 | while (setSW==0); |
hayama | 0:c2262bac9aa6 | 1244 | Thread::wait(10); |
hayama | 0:c2262bac9aa6 | 1245 | pmode++; |
hayama | 0:c2262bac9aa6 | 1246 | if (pmode>nmenu) pmode=0; |
hayama | 0:c2262bac9aa6 | 1247 | lcd.locate(0,1); |
hayama | 0:c2262bac9aa6 | 1248 | lcd.printf(menuS[pmode]); |
hayama | 0:c2262bac9aa6 | 1249 | } |
hayama | 0:c2262bac9aa6 | 1250 | |
hayama | 0:c2262bac9aa6 | 1251 | } |
hayama | 0:c2262bac9aa6 | 1252 | Thread::wait(500); |
hayama | 0:c2262bac9aa6 | 1253 | |
hayama | 0:c2262bac9aa6 | 1254 | // go selected functions |
hayama | 0:c2262bac9aa6 | 1255 | switch(pmode){ |
hayama | 0:c2262bac9aa6 | 1256 | case 0: dispGPS(); break; // GPSのテスト |
hayama | 0:c2262bac9aa6 | 1257 | case 1: setWp(); break; // ウェイポイントのセット |
hayama | 0:c2262bac9aa6 | 1258 | case 2: dispWp(); break; // display way point |
hayama | 0:c2262bac9aa6 | 1259 | case 3: clearWp(); break; // ウェイポイントのクリア |
hayama | 0:c2262bac9aa6 | 1260 | case 4: readWp(); break; // ウェイポイントのread |
hayama | 0:c2262bac9aa6 | 1261 | case 5: writeWp(); break; // ウェイポイントのread |
hayama | 0:c2262bac9aa6 | 1262 | case 6: setTeamNum(); break; // set team number for QZSS |
hayama | 0:c2262bac9aa6 | 1263 | case 7: setQZWp(); break; // (1,1)(1,7)(7,1)(7,7)の4点だけ読み書き、他の点は計算 |
hayama | 0:c2262bac9aa6 | 1264 | case 8: readQZWp4(); break; // (1,1)(1,7)(7,1)(7,7)の4点だけ読み書き、他の点は計算 |
hayama | 0:c2262bac9aa6 | 1265 | case 9: writeQZWp4(); break; // (1,1)(1,7)(7,1)(7,7)の4点だけ読み書き、他の点は計算 |
hayama | 0:c2262bac9aa6 | 1266 | case 10: dispQmsg(); break; // ウェイポイントのクリア |
hayama | 0:c2262bac9aa6 | 1267 | case 11: clearQmsg(); break; // ウェイポイントのread |
hayama | 0:c2262bac9aa6 | 1268 | case 12: readQmsg(); break; // ウェイポイントのread |
hayama | 0:c2262bac9aa6 | 1269 | case 13: writeQmsg(); break; // ウェイポイントのread |
hayama | 0:c2262bac9aa6 | 1270 | case 14: runGPS(1); break; // GPS走行, 0:WPで止まる、1:WPで止まらない |
hayama | 0:c2262bac9aa6 | 1271 | case 15: runGPSandGyro(1); break; // ジャイロを使ったGPS走行,0:WPで止まる、1:WPで止まらない |
hayama | 0:c2262bac9aa6 | 1272 | case 16: runQZSS(0); break; // QZSS-GPS走行(WPで止まる) |
hayama | 0:c2262bac9aa6 | 1273 | case 17: runQZSS(1); break; // QZSS-ジャイロを使ったGPS走行(WPで止まる) |
hayama | 0:c2262bac9aa6 | 1274 | case 18: testServo(); break; // サーボの動作テスト |
hayama | 0:c2262bac9aa6 | 1275 | case 19: testMotor(); break; // モーターの動作テスト |
hayama | 0:c2262bac9aa6 | 1276 | case 20: initNeutral(); break; // ステアリングニュートラル位置の設定 |
hayama | 0:c2262bac9aa6 | 1277 | case 21: initStrmin(); break; // ステアリングの最小値の設定 |
hayama | 0:c2262bac9aa6 | 1278 | case 22: initStrmax(); break; // ステアリングの最大値の設定 |
hayama | 0:c2262bac9aa6 | 1279 | case 23: initWr(); break; // ウェイポイントの半径設定 |
hayama | 0:c2262bac9aa6 | 1280 | case 24: initKs(); break; // 舵角計算の比例値設定 |
hayama | 0:c2262bac9aa6 | 1281 | case 25: initKsG(); break; // 舵角計算の比例値設定 |
hayama | 0:c2262bac9aa6 | 1282 | case 26: initPosH(); break; // amp pos for high speed |
hayama | 0:c2262bac9aa6 | 1283 | case 27: initPosL(); break; // amp pos for low speed |
hayama | 0:c2262bac9aa6 | 1284 | case 28: initSpdH(); break; // 走行スピードhighの設定 |
hayama | 0:c2262bac9aa6 | 1285 | case 29: initSpdL(); break; // 走行スピードlowの設定 |
hayama | 0:c2262bac9aa6 | 1286 | case 30: testRun(); break; // test run |
hayama | 0:c2262bac9aa6 | 1287 | case 31: writeParam(); break; // ウェイポイントのシリアル出力 |
hayama | 0:c2262bac9aa6 | 1288 | case 32: readParam(); break; // パラメータのシリアル出力 |
hayama | 0:c2262bac9aa6 | 1289 | case 33: testEncoder(); break; |
hayama | 0:c2262bac9aa6 | 1290 | case 34: testGyro(); break; |
hayama | 0:c2262bac9aa6 | 1291 | case 35: testCompus(); break; |
hayama | 0:c2262bac9aa6 | 1292 | } |
hayama | 0:c2262bac9aa6 | 1293 | Thread::wait(500); |
hayama | 0:c2262bac9aa6 | 1294 | } |
hayama | 0:c2262bac9aa6 | 1295 | } |
hayama | 0:c2262bac9aa6 | 1296 |