[[2009a/A5/課題2右]]へ戻る #define THERESHOLD 40 //闘値 #define KAITEN 180 //180度回転する秒数 int SYOU; //衝突変数――衝突した瞬間を見極める変数 int RUN_TIME; //パックを運ぶ時間――ここに下の変数を代入していく #define RUN_TIME_F 36; //パックを運ぶ時間(1回目F):36 #define RUN_TIME_J 80; //パックを運ぶ時間(2回目J):80 #define STOP_TIME 1000; //機体を停止させるまでの秒数 #define STOP_TIME 1300; //機体を停止させるまでの秒数(3周したら停止する) task main () //黒のラインを認識して、黒のラインに入るとそこから光学センサーが外れるようなプログラム { SYOU = 0; RUN_TIME = RUN_TIME_F; //パックを運ぶ時間を1回目の値に設定 SetSensor(SENSOR_2,SENSOR_TOUCH); //センサー2はタッチセンサー SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1は光学センサー SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3は光学センサー ClearTimer(1); //タイマー1セット while(true){ while(Timer(1)<STOP_TIME){ //STOP_TIMEで指定した時間まで動作をする //タッチセンサーが当たってないときの基本動作 if (SENSOR_1>THERESHOLD){ if (SENSOR_3>THERESHOLD){ //どちらも黒い線に入っていない場合 OnFwd(OUT_A+OUT_C); } else { Off(OUT_C); OnFwd(OUT_A); } } else { if (SENSOR_3>THERESHOLD){ OnFwd(OUT_C); Off(OUT_A); } else { //どちらも黒い線に入った場合 OnFwd(OUT_A+OUT_C); } } if (SENSOR_2 == 1 ) { //タッチセンサーが当たっているとき if (SYOU == 0){ //衝突した瞬間 ClearTimer(0); //タイマーをセット SYOU = 1; //衝突変数に1を代入 } if (SYOU == 1){ if (Timer(0) >= RUN_TIME){ //指定した時間経過したら OnFwd(OUT_A); OnRev(OUT_C); Wait(KAITEN); //180度回転(右) OnFwd(OUT_C); OnRev(OUT_A); Wait(KAITEN); //180度回転(左) これで正面を向く //それと同時にタッチセンサーに物体が当たっていない状態になる SYOU = 0; //衝突変数に0を代入 if (RUN_TIME == RUN_TIME_F){ //一度目の衝突かどうかを判定 RUN_TIME = RUN_TIME_J; //一度目なら次に運ぶ時間を二度目のものに設定 }else{ RUN_TIME = RUN_TIME_F; //二度目なら次に運ぶ時間を一度目のものに設定 } } } //ここまでSYOU == 1のときの動作 } //ここまでタッチセンサーが当たっているときの動作 if (Timer(1)>=STOP_TIME){ //指定した秒数が経過したら Off(OUT_A+OUT_C); //機体を停止させる } } //ここまでwhile間の動作 Off(OUT_A+OUT_C);//指定された秒数がきたら機体を停止 } ~ #ref(2009a/A5/課題2右/プログラム02/rosen2.JPG,100%,図1) -開始位置は上図の通りで、矢印の方向に進んでいきます -黄の四角がロボット、赤の四角が牛乳パックです ~ ~ #ref(2009a/A5/課題2右/プログラム02/シミュレーション11.gif,100%,シミュレーション) -動作のシミュレーション画像です -牛乳パックは持ち上げることなく、ただ引きずっているだけです