(多分)全部+フライトピン+新しい加速度
Dependencies: mbed
main.cpp@32:c522d463c4fa, 2018-12-12 (annotated)
- Committer:
- seangshim
- Date:
- Wed Dec 12 10:22:22 2018 +0000
- Revision:
- 32:c522d463c4fa
- Parent:
- 31:1ee80995740a
- Child:
- 33:8d3757a0cd93
new
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
seangshim | 0:a01fda36fde8 | 1 | #include "mbed.h" |
seangshim | 0:a01fda36fde8 | 2 | #include "gps.h" |
seangshim | 0:a01fda36fde8 | 3 | #include "ultrasonic.h" |
seangshim | 0:a01fda36fde8 | 4 | #include "motordriver.h" |
seangshim | 6:574d9a6253c7 | 5 | #include "HMC5883L.h" |
seangshim | 8:d41f5d7d2aa5 | 6 | #include "MPU6050.h" |
seangshim | 6:574d9a6253c7 | 7 | |
seangshim | 27:b4922048ab11 | 8 | |
seangshim | 27:b4922048ab11 | 9 | PwmOut motorSpeed(p26); |
seangshim | 27:b4922048ab11 | 10 | DigitalOut motorDir1(p19); |
seangshim | 27:b4922048ab11 | 11 | DigitalOut motorDir2(p20); |
seangshim | 27:b4922048ab11 | 12 | |
seangshim | 8:d41f5d7d2aa5 | 13 | |
seangshim | 8:d41f5d7d2aa5 | 14 | Serial pc(USBTX, USBRX); //地磁気センサー,GPS |
seangshim | 9:fb19a93df88f | 15 | GPS gps(p28, p27); //GPS |
seangshim | 9:fb19a93df88f | 16 | HMC5883L compass(p9, p10); //地磁気センサー |
seangshim | 9:fb19a93df88f | 17 | |
394 | 10:280a25bcc8bb | 18 | MPU6050 mpu(p9, p10); //(SDA,SCL)のピンをアサインしてね☆ 加速度センサー |
seangshim | 9:fb19a93df88f | 19 | |
seangshim | 23:2ca79873ef44 | 20 | DigitalIn flight(p21); //フライトピン |
seangshim | 23:2ca79873ef44 | 21 | DigitalOut FET(p22); //FET |
seangshim | 1:10af8aaa5b40 | 22 | |
seangshim | 1:10af8aaa5b40 | 23 | InterruptIn button1(p15); //フォトインタラプタ |
seangshim | 2:37d831f82840 | 24 | InterruptIn button2(p18); |
seangshim | 1:10af8aaa5b40 | 25 | DigitalIn test(p15); //ここでピン15からの電圧の値、つまりフォトインタラプタが何か遮るものを検知すればハイの1を返して、 |
seangshim | 1:10af8aaa5b40 | 26 | //何もないつまりスリットの部分ではローの0を返す。それを変数testに代入している |
seangshim | 2:37d831f82840 | 27 | DigitalIn test2(p18); |
seangshim | 1:10af8aaa5b40 | 28 | |
seangshim | 0:a01fda36fde8 | 29 | |
seangshim | 1:10af8aaa5b40 | 30 | Motor motor1(p22, p16, p17, 1); // pwm, fwd, rev, can brake モーター |
seangshim | 0:a01fda36fde8 | 31 | Motor motor2(p22, p19, p20, 1); // pwm, fwd, rev, can brake |
seangshim | 0:a01fda36fde8 | 32 | |
seangshim | 0:a01fda36fde8 | 33 | void dist(int distance) |
seangshim | 0:a01fda36fde8 | 34 | { |
seangshim | 0:a01fda36fde8 | 35 | //put code here to happen when the distance is changed |
seangshim | 0:a01fda36fde8 | 36 | printf("Distance changed to %dmm\r\n", distance); |
seangshim | 0:a01fda36fde8 | 37 | } |
seangshim | 0:a01fda36fde8 | 38 | |
seangshim | 1:10af8aaa5b40 | 39 | ultrasonic mu(p11, p12, .1, 1, &dist); //Set the trigger pin to D8 and the echo pin to D9 超音波センサー |
seangshim | 0:a01fda36fde8 | 40 | //have updates every .1 seconds and a timeout after 1 |
seangshim | 0:a01fda36fde8 | 41 | //second, and call dist when the distance changes |
seangshim | 27:b4922048ab11 | 42 | |
seangshim | 27:b4922048ab11 | 43 | void motorForward(void); |
seangshim | 27:b4922048ab11 | 44 | void motorStop(void); |
seangshim | 27:b4922048ab11 | 45 | void motorReverse(void); |
seangshim | 0:a01fda36fde8 | 46 | |
seangshim | 0:a01fda36fde8 | 47 | |
seangshim | 0:a01fda36fde8 | 48 | |
seangshim | 1:10af8aaa5b40 | 49 | LocalFileSystem local("local"); // Create the local filesystem under the name "local" データ保存 |
seangshim | 0:a01fda36fde8 | 50 | |
seangshim | 27:b4922048ab11 | 51 | float culculate_distance_3(float a,float b); |
seangshim | 27:b4922048ab11 | 52 | |
seangshim | 0:a01fda36fde8 | 53 | int main() { |
seangshim | 0:a01fda36fde8 | 54 | |
seangshim | 27:b4922048ab11 | 55 | printf("cansat start\r\n"); |
seangshim | 27:b4922048ab11 | 56 | |
seangshim | 27:b4922048ab11 | 57 | // FET = 0; |
seangshim | 27:b4922048ab11 | 58 | /* while(1) { |
seangshim | 17:9bc130ebb5ed | 59 | if(flight==1) { |
seangshim | 17:9bc130ebb5ed | 60 | wait(10); |
seangshim | 17:9bc130ebb5ed | 61 | } |
seangshim | 17:9bc130ebb5ed | 62 | |
seangshim | 17:9bc130ebb5ed | 63 | else{ |
394 | 20:e78bffff80ee | 64 | FET = 0; //FET、ニクロム線切断 |
seangshim | 17:9bc130ebb5ed | 65 | wait(20); |
seangshim | 1:10af8aaa5b40 | 66 | FET = 1; |
seangshim | 17:9bc130ebb5ed | 67 | wait(12); |
seangshim | 17:9bc130ebb5ed | 68 | FET = 0; |
seangshim | 17:9bc130ebb5ed | 69 | wait(10); |
seangshim | 17:9bc130ebb5ed | 70 | FET = 1; |
seangshim | 17:9bc130ebb5ed | 71 | wait(12); |
seangshim | 17:9bc130ebb5ed | 72 | FET = 0; |
seangshim | 17:9bc130ebb5ed | 73 | break; |
seangshim | 17:9bc130ebb5ed | 74 | } |
seangshim | 27:b4922048ab11 | 75 | } */ |
seangshim | 1:10af8aaa5b40 | 76 | |
seangshim | 0:a01fda36fde8 | 77 | motor1.stop(0); |
seangshim | 0:a01fda36fde8 | 78 | motor2.stop(0); |
seangshim | 0:a01fda36fde8 | 79 | |
seangshim | 27:b4922048ab11 | 80 | wait(20); //確認用 |
seangshim | 19:8ad7dcfef11f | 81 | |
seangshim | 32:c522d463c4fa | 82 | FILE *fp = fopen("/local/gps,foto.txt", "w"); // Open "gps.txt" on the local file system for writing |
seangshim | 32:c522d463c4fa | 83 | |
seangshim | 32:c522d463c4fa | 84 | /* printf("GPS start\r\n"); |
seangshim | 27:b4922048ab11 | 85 | FILE *fp = fopen("/local/gps,foto.txt", "w"); // Open "gps.txt" on the local file system for writing |
seangshim | 1:10af8aaa5b40 | 86 | fprintf(fp, "GPS Start\r\n"); |
seangshim | 0:a01fda36fde8 | 87 | int n; |
seangshim | 1:10af8aaa5b40 | 88 | for(n=0;n<45;n++) //GPSの取得を45回行う(これで大体1分半) |
seangshim | 0:a01fda36fde8 | 89 | { |
seangshim | 9:fb19a93df88f | 90 | printf("gps for\r\n"); |
seangshim | 0:a01fda36fde8 | 91 | if(gps.getgps()) //現在地取得 |
seangshim | 0:a01fda36fde8 | 92 | fprintf(fp,"(%lf, %lf)\r\n", gps.latitude, gps.longitude);//緯度と経度を出力 |
seangshim | 0:a01fda36fde8 | 93 | |
seangshim | 0:a01fda36fde8 | 94 | else |
seangshim | 0:a01fda36fde8 | 95 | fprintf(fp,"No data\r\n");//データ取得に失敗した場合 |
seangshim | 0:a01fda36fde8 | 96 | |
seangshim | 0:a01fda36fde8 | 97 | wait(1); |
seangshim | 1:10af8aaa5b40 | 98 | |
seangshim | 1:10af8aaa5b40 | 99 | printf("%d\r\n",n); //今何回目かを出力(本番ではいらない) |
seangshim | 1:10af8aaa5b40 | 100 | |
seangshim | 0:a01fda36fde8 | 101 | } |
seangshim | 27:b4922048ab11 | 102 | fprintf(fp,"GPS finish\r\n"); |
seangshim | 32:c522d463c4fa | 103 | // fclose(fp); // GPSの測定終了 */ |
seangshim | 28:5e21ce413558 | 104 | |
seangshim | 32:c522d463c4fa | 105 | motorSpeed.period_ms(4); //モーター調節 |
seangshim | 32:c522d463c4fa | 106 | motorSpeed = 0.955; |
seangshim | 28:5e21ce413558 | 107 | |
seangshim | 9:fb19a93df88f | 108 | |
394 | 10:280a25bcc8bb | 109 | compass.init(); //地磁気センサー動作 |
seangshim | 16:44c763c32b0d | 110 | |
394 | 10:280a25bcc8bb | 111 | int i; |
394 | 10:280a25bcc8bb | 112 | for(i=0;i<20;i++) //地磁気測定 |
394 | 10:280a25bcc8bb | 113 | { |
394 | 10:280a25bcc8bb | 114 | pc.printf("raw=%f\r\n",compass.getHeadingXYDeg()); //度数法で表記 |
seangshim | 29:05b390de92ed | 115 | fprintf(fp,"raw=\r\n"); |
seangshim | 29:05b390de92ed | 116 | fprintf(fp,"%lf\r\n",compass.getHeadingXYDeg()); |
394 | 10:280a25bcc8bb | 117 | wait(0.5); |
seangshim | 16:44c763c32b0d | 118 | } |
394 | 10:280a25bcc8bb | 119 | float mc1,mc2; |
394 | 20:e78bffff80ee | 120 | mc1=1.0; |
394 | 20:e78bffff80ee | 121 | mc2=1.0; |
394 | 10:280a25bcc8bb | 122 | //地磁気センサのキャリブレーション |
394 | 10:280a25bcc8bb | 123 | motor1.speed(mc1); //車体を時計回りに3秒回転 |
seangshim | 28:5e21ce413558 | 124 | motorReverse(); |
394 | 30:3bcf14e8dd63 | 125 | wait(1.6); |
394 | 10:280a25bcc8bb | 126 | |
394 | 10:280a25bcc8bb | 127 | motor1.stop(0); |
394 | 10:280a25bcc8bb | 128 | motor2.stop(0); |
394 | 10:280a25bcc8bb | 129 | wait(1); |
394 | 10:280a25bcc8bb | 130 | |
seangshim | 28:5e21ce413558 | 131 | motor1.speed(-mc1); //車体を反時計回りに3秒回 |
seangshim | 28:5e21ce413558 | 132 | motorForward(); |
394 | 30:3bcf14e8dd63 | 133 | wait(1.6); |
394 | 10:280a25bcc8bb | 134 | |
394 | 10:280a25bcc8bb | 135 | motor1.stop(0); |
394 | 10:280a25bcc8bb | 136 | motor2.stop(0); |
394 | 10:280a25bcc8bb | 137 | wait(1); |
394 | 10:280a25bcc8bb | 138 | printf("compass carriblation\r\n"); //キャリブレーション終了 |
394 | 10:280a25bcc8bb | 139 | |
394 | 20:e78bffff80ee | 140 | float mcn1,mcn2; |
394 | 10:280a25bcc8bb | 141 | double heading; |
394 | 20:e78bffff80ee | 142 | mcn1=1.0; |
394 | 20:e78bffff80ee | 143 | mcn2=1.0; |
394 | 10:280a25bcc8bb | 144 | compass.init(); |
394 | 20:e78bffff80ee | 145 | heading=compass.getHeadingXYDeg(); |
394 | 30:3bcf14e8dd63 | 146 | if(90<heading<267.5){ |
394 | 30:3bcf14e8dd63 | 147 | motor1.speed(mcn1);//右回転 |
seangshim | 28:5e21ce413558 | 148 | motorReverse(); |
394 | 30:3bcf14e8dd63 | 149 | wait((270-heading)*0.004448); //角度のずれ*1度回転するのにかかる時間 |
394 | 20:e78bffff80ee | 150 | motor1.stop(0); |
394 | 20:e78bffff80ee | 151 | motor2.stop(0); |
394 | 10:280a25bcc8bb | 152 | wait(1); |
394 | 30:3bcf14e8dd63 | 153 | }else if(0<=heading<=90.0){ |
394 | 30:3bcf14e8dd63 | 154 | motor1.speed(-mcn1);//左回転 |
seangshim | 28:5e21ce413558 | 155 | motorForward(); |
394 | 30:3bcf14e8dd63 | 156 | wait((heading+90.0)*0.004448); |
394 | 30:3bcf14e8dd63 | 157 | motor1.stop(0); |
394 | 30:3bcf14e8dd63 | 158 | motor2.stop(0); |
394 | 30:3bcf14e8dd63 | 159 | wait(1); |
394 | 30:3bcf14e8dd63 | 160 | }else if(272.5<heading<360){ |
394 | 30:3bcf14e8dd63 | 161 | motor1.speed(-mcn1);//左回転 |
394 | 30:3bcf14e8dd63 | 162 | motorForward(); |
394 | 30:3bcf14e8dd63 | 163 | wait((heading-270)*0.004448); |
394 | 20:e78bffff80ee | 164 | motor1.stop(0); |
394 | 20:e78bffff80ee | 165 | motor2.stop(0); |
394 | 10:280a25bcc8bb | 166 | wait(1); |
394 | 10:280a25bcc8bb | 167 | }else{ |
394 | 20:e78bffff80ee | 168 | wait(5); |
394 | 10:280a25bcc8bb | 169 | } |
394 | 10:280a25bcc8bb | 170 | printf("searchN\r\n"); //機体が北を向く |
seangshim | 0:a01fda36fde8 | 171 | |
seangshim | 0:a01fda36fde8 | 172 | mu.startUpdates();//start mesuring the distance(超音波センサー) |
seangshim | 3:c1e0db4832b7 | 173 | int distance; |
seangshim | 0:a01fda36fde8 | 174 | |
seangshim | 13:b884f5960fbf | 175 | int flag=0,flag2=0; //変数flagを整数で型づけする。これがスイッチで、1の間は瞬間は何もしないけど、 |
seangshim | 1:10af8aaa5b40 | 176 | //スリットの間隔であるπ/4とタイヤの半径70mmつまり一つのスリットを通過するごとに52.5mm加算していく必要があるから |
seangshim | 1:10af8aaa5b40 | 177 | //0になった瞬間はこれを総距離に加えるというスイッチの役割をする。 |
seangshim | 2:37d831f82840 | 178 | float rightrun; //変数runをフロートで型づけする |
seangshim | 2:37d831f82840 | 179 | float leftrun2; |
seangshim | 4:8b52fd631b32 | 180 | rightrun=0.0; |
seangshim | 4:8b52fd631b32 | 181 | leftrun2=0.0; |
seangshim | 9:fb19a93df88f | 182 | |
seangshim | 17:9bc130ebb5ed | 183 | float filterCoefficient = 0.9; // ローパスフィルターの係数(これは環境によって要調整。1に近づけるほど平滑化の度合いが大きくなる。 |
seangshim | 15:75f014c4c8b8 | 184 | float lowpassValue = 0; |
seangshim | 15:75f014c4c8b8 | 185 | float highpassValue = 0; |
seangshim | 15:75f014c4c8b8 | 186 | float speed = 0;//加速度時から算出した速度 |
seangshim | 15:75f014c4c8b8 | 187 | float oldSpeed = 0;//ひとつ前の速度 |
seangshim | 15:75f014c4c8b8 | 188 | float oldAccel = 0;//ひとつ前の加速度 |
seangshim | 15:75f014c4c8b8 | 189 | float difference=0;//変位 |
seangshim | 17:9bc130ebb5ed | 190 | float timespan=0.01;//時間差 |
seangshim | 27:b4922048ab11 | 191 | int accel[3];//accelを3つの配列で定義。*/ |
seangshim | 27:b4922048ab11 | 192 | |
seangshim | 27:b4922048ab11 | 193 | int tt=0; |
seangshim | 27:b4922048ab11 | 194 | float run=0; |
seangshim | 1:10af8aaa5b40 | 195 | |
seangshim | 3:c1e0db4832b7 | 196 | while(1) |
seangshim | 3:c1e0db4832b7 | 197 | { |
seangshim | 3:c1e0db4832b7 | 198 | distance=mu.getCurrentDistance(); |
seangshim | 3:c1e0db4832b7 | 199 | printf("%d\r\n",distance); |
seangshim | 8:d41f5d7d2aa5 | 200 | |
seangshim | 8:d41f5d7d2aa5 | 201 | mpu.readAccelData(accel);//加速度の値をaccel[3]に代入 |
seangshim | 19:8ad7dcfef11f | 202 | int x = accel[0]-123;//x軸方向の加速度 |
seangshim | 19:8ad7dcfef11f | 203 | int y = accel[1]+60;//y軸方向の加速度 |
seangshim | 19:8ad7dcfef11f | 204 | int z = accel[2]+1110 ;//z軸方向の加速度 |
seangshim | 19:8ad7dcfef11f | 205 | float X = x*0.000597964111328125; |
seangshim | 19:8ad7dcfef11f | 206 | float Y = y*0.000597964111328125; |
seangshim | 19:8ad7dcfef11f | 207 | float Z = z*0.000597964111328125; |
seangshim | 19:8ad7dcfef11f | 208 | double a = X*X+Y*Y+Z*Z-95.982071137936; |
seangshim | 18:2a47ed430cfe | 209 | if (a>0){ |
seangshim | 18:2a47ed430cfe | 210 | a = sqrt(a); |
seangshim | 18:2a47ed430cfe | 211 | } |
seangshim | 18:2a47ed430cfe | 212 | if (a<0) { |
seangshim | 18:2a47ed430cfe | 213 | a = abs(a); |
seangshim | 18:2a47ed430cfe | 214 | a = -sqrt(a); |
seangshim | 18:2a47ed430cfe | 215 | } |
seangshim | 19:8ad7dcfef11f | 216 | //printf("%lf %f %f %f\r\n",a,X,Y,Z); |
seangshim | 15:75f014c4c8b8 | 217 | // ローパスフィルター(現在の値 = 係数 * ひとつ前の値 + (1 - 係数) * センサの値) |
seangshim | 19:8ad7dcfef11f | 218 | lowpassValue = lowpassValue * filterCoefficient + a * (1 - filterCoefficient); |
seangshim | 17:9bc130ebb5ed | 219 | // ハイパスフィルター(センサの値 - ローパスフィルターの値)// |
seangshim | 19:8ad7dcfef11f | 220 | highpassValue = a - lowpassValue; |
seangshim | 17:9bc130ebb5ed | 221 | |
seangshim | 15:75f014c4c8b8 | 222 | // 速度計算(加速度を台形積分する) |
seangshim | 15:75f014c4c8b8 | 223 | speed = ((highpassValue + oldAccel) * timespan) / 2 + speed; |
seangshim | 15:75f014c4c8b8 | 224 | oldAccel = highpassValue; |
seangshim | 17:9bc130ebb5ed | 225 | |
seangshim | 15:75f014c4c8b8 | 226 | // 変位計算(速度を台形積分する) |
seangshim | 15:75f014c4c8b8 | 227 | difference = ((speed + oldSpeed) * timespan) / 2 + difference; |
seangshim | 15:75f014c4c8b8 | 228 | oldSpeed = speed; |
seangshim | 17:9bc130ebb5ed | 229 | |
seangshim | 17:9bc130ebb5ed | 230 | //printf(" speed %f difference %f\r\n",speed,difference);//速度と加速度を表示 |
seangshim | 27:b4922048ab11 | 231 | printf("speed %f diference %f\r\n",speed,difference);//速度(m)と変位を表示*/ |
seangshim | 3:c1e0db4832b7 | 232 | |
seangshim | 8:d41f5d7d2aa5 | 233 | printf("%d\r\n", test.read()); //フォトインタラプタ |
seangshim | 3:c1e0db4832b7 | 234 | printf("%d\r\n", test2.read()); |
seangshim | 1:10af8aaa5b40 | 235 | if (test.read() == 1 and flag == 0){ //もしtestが1つまり何か障害物があって、かつflagが0つまりスイッチが切れているときは |
seangshim | 1:10af8aaa5b40 | 236 | flag = 1; //この時はスイッチを1に切る。ただ障害物があるかつスイッチが1で切れているときはそのまま |
seangshim | 3:c1e0db4832b7 | 237 | printf("test.read if\r\n"); |
seangshim | 1:10af8aaa5b40 | 238 | } |
seangshim | 1:10af8aaa5b40 | 239 | else if (test.read() == 0 and flag == 1){ //そうじゃなくて今度はとうとうtestが0でスリットの部分になった瞬間なのにスイッチが1で切れているときは |
seangshim | 1:10af8aaa5b40 | 240 | flag = 0; //まずこれでスイッチを0にして入れる。 |
seangshim | 1:10af8aaa5b40 | 241 | //こうすることで同じスリットの中でtestが複数回0を返した時に何回も52.5mmを加算しつづけるということがなくなる |
seangshim | 32:c522d463c4fa | 242 | rightrun += 56.25; //総距離runに52.5を加算する |
seangshim | 3:c1e0db4832b7 | 243 | printf("test.read else\r\n"); |
seangshim | 2:37d831f82840 | 244 | } |
seangshim | 2:37d831f82840 | 245 | if (test2.read() == 1 and flag2 == 0){ |
seangshim | 2:37d831f82840 | 246 | flag2 = 1; |
seangshim | 3:c1e0db4832b7 | 247 | printf("test2.read if\r\n"); |
seangshim | 1:10af8aaa5b40 | 248 | } |
seangshim | 2:37d831f82840 | 249 | else if (test2.read() == 0 and flag2 == 1){ |
seangshim | 2:37d831f82840 | 250 | flag2 = 0; |
seangshim | 32:c522d463c4fa | 251 | leftrun2 += 56.25; |
seangshim | 3:c1e0db4832b7 | 252 | printf("test2.read else\r\n"); |
seangshim | 2:37d831f82840 | 253 | } |
seangshim | 2:37d831f82840 | 254 | printf("%f", rightrun); |
seangshim | 2:37d831f82840 | 255 | printf("\t%f\r\n", leftrun2); |
seangshim | 27:b4922048ab11 | 256 | run=culculate_distance_3(rightrun,leftrun2); |
seangshim | 32:c522d463c4fa | 257 | if (15000<run && run<15050){ //半分くらい進んだら方位を計測し直す |
394 | 31:1ee80995740a | 258 | motor1.stop(0); |
394 | 31:1ee80995740a | 259 | motor2.stop(0); |
394 | 31:1ee80995740a | 260 | wait(1); |
394 | 30:3bcf14e8dd63 | 261 | if(90<heading<267.5){ |
394 | 30:3bcf14e8dd63 | 262 | motor1.speed(mcn1);//右回転 |
394 | 30:3bcf14e8dd63 | 263 | motorReverse(); |
394 | 30:3bcf14e8dd63 | 264 | wait((270-heading)*0.004448); //角度のずれ*1度回転するのにかかる時間 |
394 | 30:3bcf14e8dd63 | 265 | motor1.stop(0); |
394 | 30:3bcf14e8dd63 | 266 | motor2.stop(0); |
394 | 30:3bcf14e8dd63 | 267 | wait(1); |
394 | 30:3bcf14e8dd63 | 268 | }else if(0<=heading<=90.0){ |
394 | 30:3bcf14e8dd63 | 269 | motor1.speed(-mcn1);//左回転 |
394 | 30:3bcf14e8dd63 | 270 | motorForward(); |
394 | 30:3bcf14e8dd63 | 271 | wait((heading+90.0)*0.004448); |
394 | 30:3bcf14e8dd63 | 272 | motor1.stop(0); |
394 | 30:3bcf14e8dd63 | 273 | motor2.stop(0); |
394 | 30:3bcf14e8dd63 | 274 | wait(1); |
394 | 30:3bcf14e8dd63 | 275 | }else if(272.5<heading<360){ |
394 | 30:3bcf14e8dd63 | 276 | motor1.speed(-mcn1);//左回転 |
394 | 30:3bcf14e8dd63 | 277 | motorForward(); |
394 | 30:3bcf14e8dd63 | 278 | wait((heading-270)*0.004448); |
394 | 30:3bcf14e8dd63 | 279 | motor1.stop(0); |
394 | 30:3bcf14e8dd63 | 280 | motor2.stop(0); |
394 | 30:3bcf14e8dd63 | 281 | wait(1); |
394 | 30:3bcf14e8dd63 | 282 | }else{ |
394 | 30:3bcf14e8dd63 | 283 | wait(5); |
394 | 30:3bcf14e8dd63 | 284 | } |
394 | 30:3bcf14e8dd63 | 285 | printf("searchN\r\n"); //機体が北を向く |
394 | 30:3bcf14e8dd63 | 286 | } |
seangshim | 32:c522d463c4fa | 287 | else if (run >= 30000){ //もし総距離が250以上ならば、というのもここの値は暫定値。とりあえずゴール地点が決まればまたその値に修正する |
seangshim | 1:10af8aaa5b40 | 288 | break; //つまりゴールについたらこのループからぬける |
seangshim | 3:c1e0db4832b7 | 289 | } |
seangshim | 0:a01fda36fde8 | 290 | |
seangshim | 27:b4922048ab11 | 291 | /* if(difference >= 0.3) |
seangshim | 19:8ad7dcfef11f | 292 | { |
seangshim | 19:8ad7dcfef11f | 293 | break; |
seangshim | 27:b4922048ab11 | 294 | } */ |
seangshim | 19:8ad7dcfef11f | 295 | |
seangshim | 1:10af8aaa5b40 | 296 | motor1.speed(0.5); //通常走行 |
seangshim | 27:b4922048ab11 | 297 | motorForward(); |
seangshim | 1:10af8aaa5b40 | 298 | //Do something else here |
seangshim | 1:10af8aaa5b40 | 299 | // mu.checkDistance(); //call checkDistance() as much as possible, as this is where |
seangshim | 1:10af8aaa5b40 | 300 | //the class checks if dist needs to be called. |
seangshim | 0:a01fda36fde8 | 301 | |
seangshim | 9:fb19a93df88f | 302 | wait(0.01); |
seangshim | 0:a01fda36fde8 | 303 | |
seangshim | 27:b4922048ab11 | 304 | tt++; |
seangshim | 29:05b390de92ed | 305 | if(tt == 10) |
seangshim | 27:b4922048ab11 | 306 | { |
seangshim | 27:b4922048ab11 | 307 | fprintf(fp, "accel.rightrun.leftrun2\r\n"); |
seangshim | 27:b4922048ab11 | 308 | |
seangshim | 27:b4922048ab11 | 309 | fprintf(fp,"(%lf, %lf,%lf)\r\n", difference, rightrun, leftrun2);//加速度とフォトインタラプタによる距離を出力 |
seangshim | 27:b4922048ab11 | 310 | tt=0; |
seangshim | 27:b4922048ab11 | 311 | } |
seangshim | 27:b4922048ab11 | 312 | |
seangshim | 3:c1e0db4832b7 | 313 | if(100 < distance && distance < 500) //障害物発見❕ |
seangshim | 0:a01fda36fde8 | 314 | { |
seangshim | 0:a01fda36fde8 | 315 | |
seangshim | 0:a01fda36fde8 | 316 | printf("if success!\r\n"); |
seangshim | 0:a01fda36fde8 | 317 | |
seangshim | 0:a01fda36fde8 | 318 | float ms1,ms2,msj1,msj2; |
seangshim | 1:10af8aaa5b40 | 319 | ms1=1.0; //直進の時モーターをどれだけ回せばいいかわからないのでとりあえず1.0にしておく⇒waitの秒数を変えた方が良い感じ |
seangshim | 1:10af8aaa5b40 | 320 | ms2=1.0; |
seangshim | 0:a01fda36fde8 | 321 | |
seangshim | 12:2f0c841e6078 | 322 | msj1=1.0; //回転の時 |
seangshim | 12:2f0c841e6078 | 323 | msj2=1.0; |
seangshim | 0:a01fda36fde8 | 324 | |
seangshim | 0:a01fda36fde8 | 325 | motor1.stop(0); |
seangshim | 0:a01fda36fde8 | 326 | motor2.stop(0); |
seangshim | 1:10af8aaa5b40 | 327 | wait(2); |
seangshim | 0:a01fda36fde8 | 328 | printf("mortor stop\r\n"); |
seangshim | 0:a01fda36fde8 | 329 | |
seangshim | 0:a01fda36fde8 | 330 | motor1.speed(msj1); //機体を時計回りに90度回転 |
seangshim | 28:5e21ce413558 | 331 | motorReverse(); |
seangshim | 32:c522d463c4fa | 332 | wait(0.5); |
seangshim | 0:a01fda36fde8 | 333 | printf("mortor rotation\r\n"); |
seangshim | 3:c1e0db4832b7 | 334 | |
seangshim | 3:c1e0db4832b7 | 335 | motor1.stop(0); |
seangshim | 3:c1e0db4832b7 | 336 | motor2.stop(0); |
seangshim | 3:c1e0db4832b7 | 337 | wait(2); |
seangshim | 3:c1e0db4832b7 | 338 | printf("mortor stop\r\n"); |
seangshim | 0:a01fda36fde8 | 339 | |
seangshim | 0:a01fda36fde8 | 340 | motor1.speed(ms1); //直進 |
seangshim | 27:b4922048ab11 | 341 | motorForward(); |
seangshim | 1:10af8aaa5b40 | 342 | wait(2); |
seangshim | 0:a01fda36fde8 | 343 | printf("mortor straight\r\n"); |
seangshim | 3:c1e0db4832b7 | 344 | |
seangshim | 3:c1e0db4832b7 | 345 | motor1.stop(0); |
seangshim | 3:c1e0db4832b7 | 346 | motor2.stop(0); |
seangshim | 3:c1e0db4832b7 | 347 | wait(2); |
seangshim | 3:c1e0db4832b7 | 348 | printf("mortor stop\r\n"); |
seangshim | 0:a01fda36fde8 | 349 | |
seangshim | 0:a01fda36fde8 | 350 | motor1.speed(-msj1); //機体を反時計回りに90度回転 |
seangshim | 27:b4922048ab11 | 351 | motorForward(); |
seangshim | 32:c522d463c4fa | 352 | wait(0.5); |
seangshim | 0:a01fda36fde8 | 353 | printf("mortor rotation\r\n"); |
seangshim | 3:c1e0db4832b7 | 354 | |
seangshim | 3:c1e0db4832b7 | 355 | motor1.stop(0); |
seangshim | 3:c1e0db4832b7 | 356 | motor2.stop(0); |
seangshim | 3:c1e0db4832b7 | 357 | wait(2); |
seangshim | 3:c1e0db4832b7 | 358 | printf("mortor stop\r\n"); |
seangshim | 0:a01fda36fde8 | 359 | |
seangshim | 0:a01fda36fde8 | 360 | motor1.speed(ms1); //直進 |
seangshim | 27:b4922048ab11 | 361 | motorForward(); |
seangshim | 16:44c763c32b0d | 362 | |
seangshim | 16:44c763c32b0d | 363 | |
seangshim | 12:2f0c841e6078 | 364 | int t=0; |
seangshim | 27:b4922048ab11 | 365 | for(t=0;t<50;t++) |
seangshim | 12:2f0c841e6078 | 366 | { |
seangshim | 12:2f0c841e6078 | 367 | printf("%d\r\n", test.read()); |
seangshim | 12:2f0c841e6078 | 368 | printf("%d\r\n", test2.read()); |
seangshim | 1:10af8aaa5b40 | 369 | if (test.read() == 1 and flag == 0) |
seangshim | 1:10af8aaa5b40 | 370 | { |
seangshim | 1:10af8aaa5b40 | 371 | flag = 1; |
seangshim | 1:10af8aaa5b40 | 372 | } |
seangshim | 1:10af8aaa5b40 | 373 | else if (test.read() == 0 and flag == 1) |
seangshim | 1:10af8aaa5b40 | 374 | { |
seangshim | 1:10af8aaa5b40 | 375 | flag=0; |
seangshim | 32:c522d463c4fa | 376 | rightrun += 56.25; |
seangshim | 1:10af8aaa5b40 | 377 | } |
seangshim | 2:37d831f82840 | 378 | if (test2.read() == 1 and flag2 == 0){ |
seangshim | 2:37d831f82840 | 379 | flag2 = 1; |
seangshim | 2:37d831f82840 | 380 | } |
seangshim | 2:37d831f82840 | 381 | else if (test2.read() == 0 and flag2 == 1){ |
seangshim | 2:37d831f82840 | 382 | flag2 = 0; |
seangshim | 32:c522d463c4fa | 383 | leftrun2 += 56.25; |
seangshim | 2:37d831f82840 | 384 | } |
seangshim | 2:37d831f82840 | 385 | printf("%f", rightrun); |
seangshim | 12:2f0c841e6078 | 386 | printf("\t%f\r\n", leftrun2); |
seangshim | 16:44c763c32b0d | 387 | |
seangshim | 16:44c763c32b0d | 388 | |
seangshim | 16:44c763c32b0d | 389 | |
seangshim | 16:44c763c32b0d | 390 | mpu.readAccelData(accel);//加速度の値をaccel[3]に代入 |
seangshim | 19:8ad7dcfef11f | 391 | int x = accel[0]-123;//x軸方向の加速度 |
seangshim | 19:8ad7dcfef11f | 392 | int y = accel[1]+60;//y軸方向の加速度 |
seangshim | 19:8ad7dcfef11f | 393 | int z = accel[2]+1110 ;//z軸方向の加速度 |
seangshim | 19:8ad7dcfef11f | 394 | float X = x*0.000597964111328125; |
seangshim | 19:8ad7dcfef11f | 395 | float Y = y*0.000597964111328125; |
seangshim | 19:8ad7dcfef11f | 396 | float Z = z*0.000597964111328125; |
seangshim | 19:8ad7dcfef11f | 397 | double a = X*X+Y*Y+Z*Z-95.982071137936; |
seangshim | 19:8ad7dcfef11f | 398 | if (a>0){ |
seangshim | 19:8ad7dcfef11f | 399 | a = sqrt(a); |
seangshim | 19:8ad7dcfef11f | 400 | } |
seangshim | 19:8ad7dcfef11f | 401 | if (a<0) { |
seangshim | 19:8ad7dcfef11f | 402 | a = abs(a); |
seangshim | 19:8ad7dcfef11f | 403 | a = -sqrt(a); |
seangshim | 19:8ad7dcfef11f | 404 | } |
seangshim | 19:8ad7dcfef11f | 405 | //printf("%lf %f %f %f\r\n",a,X,Y,Z); |
seangshim | 16:44c763c32b0d | 406 | // ローパスフィルター(現在の値 = 係数 * ひとつ前の値 + (1 - 係数) * センサの値) |
seangshim | 19:8ad7dcfef11f | 407 | lowpassValue = lowpassValue * filterCoefficient + a * (1 - filterCoefficient); |
seangshim | 17:9bc130ebb5ed | 408 | // ハイパスフィルター(センサの値 - ローパスフィルターの値)// |
seangshim | 19:8ad7dcfef11f | 409 | highpassValue = a - lowpassValue; |
seangshim | 17:9bc130ebb5ed | 410 | |
seangshim | 16:44c763c32b0d | 411 | // 速度計算(加速度を台形積分する) |
seangshim | 16:44c763c32b0d | 412 | speed = ((highpassValue + oldAccel) * timespan) / 2 + speed; |
seangshim | 16:44c763c32b0d | 413 | oldAccel = highpassValue; |
seangshim | 17:9bc130ebb5ed | 414 | |
seangshim | 16:44c763c32b0d | 415 | // 変位計算(速度を台形積分する) |
seangshim | 16:44c763c32b0d | 416 | difference = ((speed + oldSpeed) * timespan) / 2 + difference; |
seangshim | 16:44c763c32b0d | 417 | oldSpeed = speed; |
seangshim | 17:9bc130ebb5ed | 418 | |
seangshim | 17:9bc130ebb5ed | 419 | //printf(" speed %f difference %f\r\n",speed,difference);//速度と加速度を表示 |
seangshim | 27:b4922048ab11 | 420 | printf("speed %f diference %f\r\n",speed,difference);//速度(m)と変位を表示*/ |
seangshim | 27:b4922048ab11 | 421 | |
seangshim | 32:c522d463c4fa | 422 | if (run >= 300000){ //もし総距離が250以上ならば、というのもここの値は暫定値。とりあえずゴール地点が決まればまたその値に修正する |
seangshim | 27:b4922048ab11 | 423 | break; //つまりゴールについたらこのループからぬける |
seangshim | 27:b4922048ab11 | 424 | } |
seangshim | 16:44c763c32b0d | 425 | |
seangshim | 17:9bc130ebb5ed | 426 | wait(0.01); |
seangshim | 27:b4922048ab11 | 427 | |
seangshim | 16:44c763c32b0d | 428 | } |
seangshim | 16:44c763c32b0d | 429 | |
seangshim | 16:44c763c32b0d | 430 | |
seangshim | 16:44c763c32b0d | 431 | |
seangshim | 3:c1e0db4832b7 | 432 | printf("mortor straight\r\n"); |
seangshim | 3:c1e0db4832b7 | 433 | |
seangshim | 3:c1e0db4832b7 | 434 | motor1.stop(0); |
seangshim | 3:c1e0db4832b7 | 435 | motor2.stop(0); |
seangshim | 3:c1e0db4832b7 | 436 | wait(2); |
seangshim | 3:c1e0db4832b7 | 437 | printf("mortor stop\r\n"); |
seangshim | 0:a01fda36fde8 | 438 | |
seangshim | 0:a01fda36fde8 | 439 | motor1.speed(-msj1); //機体を反時計回りに90度回転 |
seangshim | 27:b4922048ab11 | 440 | motorForward(); |
seangshim | 32:c522d463c4fa | 441 | wait(0.5); |
seangshim | 0:a01fda36fde8 | 442 | printf("mortor rotation\r\n"); |
seangshim | 3:c1e0db4832b7 | 443 | |
seangshim | 3:c1e0db4832b7 | 444 | motor1.stop(0); |
seangshim | 3:c1e0db4832b7 | 445 | motor2.stop(0); |
seangshim | 3:c1e0db4832b7 | 446 | wait(2); |
seangshim | 3:c1e0db4832b7 | 447 | printf("mortor stop\r\n"); |
seangshim | 0:a01fda36fde8 | 448 | |
seangshim | 0:a01fda36fde8 | 449 | motor1.speed(ms1); //直進 |
seangshim | 27:b4922048ab11 | 450 | motorForward(); |
seangshim | 1:10af8aaa5b40 | 451 | wait(2); |
seangshim | 0:a01fda36fde8 | 452 | printf("mortor straight\r\n"); |
seangshim | 3:c1e0db4832b7 | 453 | |
seangshim | 3:c1e0db4832b7 | 454 | motor1.stop(0); |
seangshim | 3:c1e0db4832b7 | 455 | motor2.stop(0); |
seangshim | 3:c1e0db4832b7 | 456 | wait(2); |
seangshim | 3:c1e0db4832b7 | 457 | printf("mortor stop\r\n"); |
seangshim | 0:a01fda36fde8 | 458 | |
seangshim | 0:a01fda36fde8 | 459 | motor1.speed(msj1); //機体を時計回りに90度回転 |
seangshim | 28:5e21ce413558 | 460 | motorReverse(); |
seangshim | 32:c522d463c4fa | 461 | wait(0.5); |
seangshim | 0:a01fda36fde8 | 462 | printf("mortor rotation\r\n"); |
seangshim | 3:c1e0db4832b7 | 463 | |
seangshim | 3:c1e0db4832b7 | 464 | motor1.stop(0); |
seangshim | 3:c1e0db4832b7 | 465 | motor2.stop(0); |
seangshim | 3:c1e0db4832b7 | 466 | wait(2); |
seangshim | 3:c1e0db4832b7 | 467 | printf("mortor stop\r\n"); |
394 | 10:280a25bcc8bb | 468 | |
394 | 30:3bcf14e8dd63 | 469 | if(90<heading<267.5){ |
394 | 30:3bcf14e8dd63 | 470 | motor1.speed(mcn1);//右回転 |
394 | 30:3bcf14e8dd63 | 471 | motorReverse(); |
394 | 30:3bcf14e8dd63 | 472 | wait((270-heading)*0.004448); //角度のずれ*1度回転するのにかかる時間 |
394 | 30:3bcf14e8dd63 | 473 | motor1.stop(0); |
394 | 30:3bcf14e8dd63 | 474 | motor2.stop(0); |
394 | 30:3bcf14e8dd63 | 475 | wait(1); |
394 | 30:3bcf14e8dd63 | 476 | }else if(0<=heading<=90.0){ |
394 | 30:3bcf14e8dd63 | 477 | motor1.speed(-mcn1);//左回転 |
394 | 30:3bcf14e8dd63 | 478 | motorForward(); |
394 | 30:3bcf14e8dd63 | 479 | wait((heading+90.0)*0.004448); |
394 | 30:3bcf14e8dd63 | 480 | motor1.stop(0); |
394 | 30:3bcf14e8dd63 | 481 | motor2.stop(0); |
394 | 30:3bcf14e8dd63 | 482 | wait(1); |
394 | 30:3bcf14e8dd63 | 483 | }else if(272.5<heading<360){ |
394 | 30:3bcf14e8dd63 | 484 | motor1.speed(-mcn1);//左回転 |
394 | 30:3bcf14e8dd63 | 485 | motorForward(); |
394 | 30:3bcf14e8dd63 | 486 | wait((heading-270)*0.004448); |
394 | 30:3bcf14e8dd63 | 487 | motor1.stop(0); |
394 | 30:3bcf14e8dd63 | 488 | motor2.stop(0); |
394 | 30:3bcf14e8dd63 | 489 | wait(1); |
394 | 30:3bcf14e8dd63 | 490 | }else{ |
394 | 30:3bcf14e8dd63 | 491 | wait(5); |
394 | 30:3bcf14e8dd63 | 492 | } |
394 | 30:3bcf14e8dd63 | 493 | printf("searchN\r\n"); //機体が北を向く |
394 | 10:280a25bcc8bb | 494 | |
seangshim | 0:a01fda36fde8 | 495 | } |
seangshim | 0:a01fda36fde8 | 496 | } |
seangshim | 4:8b52fd631b32 | 497 | motor1.stop(0); |
seangshim | 4:8b52fd631b32 | 498 | motor2.stop(0); |
seangshim | 19:8ad7dcfef11f | 499 | |
seangshim | 19:8ad7dcfef11f | 500 | |
seangshim | 19:8ad7dcfef11f | 501 | fprintf(fp, "last accel.photo\r\n"); |
seangshim | 27:b4922048ab11 | 502 | fprintf(fp,"(%lf, %lf)\r\n", difference, run);//最後の加速度とフォトインタラプタによる距離を出力 |
seangshim | 27:b4922048ab11 | 503 | fprintf(fp, "last right.left\r\n"); |
seangshim | 27:b4922048ab11 | 504 | fprintf(fp,"(%lf, %lf)\r\n", rightrun, leftrun2); |
seangshim | 19:8ad7dcfef11f | 505 | fclose(fp); |
seangshim | 19:8ad7dcfef11f | 506 | |
seangshim | 0:a01fda36fde8 | 507 | } |
seangshim | 1:10af8aaa5b40 | 508 | |
seangshim | 1:10af8aaa5b40 | 509 | |
seangshim | 1:10af8aaa5b40 | 510 | |
seangshim | 1:10af8aaa5b40 | 511 | float culculate_distance_3(float a,float b) //距離推定プログラム、加速度の計算が送られてきたら,mainの中に入れる |
seangshim | 1:10af8aaa5b40 | 512 | { |
seangshim | 1:10af8aaa5b40 | 513 | float c; |
seangshim | 1:10af8aaa5b40 | 514 | c=0.5*a+0.5*b;//今は平均。計測をもとに修正を加える |
seangshim | 1:10af8aaa5b40 | 515 | return c; |
seangshim | 1:10af8aaa5b40 | 516 | } |
seangshim | 27:b4922048ab11 | 517 | void motorForward() { |
seangshim | 27:b4922048ab11 | 518 | motorStop(); |
seangshim | 27:b4922048ab11 | 519 | motorDir1 = 1; |
seangshim | 27:b4922048ab11 | 520 | motorDir2 = 0; |
seangshim | 27:b4922048ab11 | 521 | } |
seangshim | 27:b4922048ab11 | 522 | |
seangshim | 27:b4922048ab11 | 523 | void motorReverse() { |
seangshim | 27:b4922048ab11 | 524 | motorStop(); |
seangshim | 27:b4922048ab11 | 525 | motorDir1 = 0; |
seangshim | 27:b4922048ab11 | 526 | motorDir2 = 1; |
seangshim | 27:b4922048ab11 | 527 | } |
seangshim | 27:b4922048ab11 | 528 | |
seangshim | 27:b4922048ab11 | 529 | void motorStop() { |
seangshim | 27:b4922048ab11 | 530 | motorDir1 = 0; |
seangshim | 27:b4922048ab11 | 531 | motorDir2 = 0; |
seangshim | 27:b4922048ab11 | 532 | } |
seangshim | 1:10af8aaa5b40 | 533 | |
seangshim | 1:10af8aaa5b40 | 534 | |
seangshim | 1:10af8aaa5b40 | 535 | |
seangshim | 1:10af8aaa5b40 | 536 |