目次
A地点をスタートしてQ付近の3/4円周上でピンポン玉をつかみ、そのピンポン玉をD地点に置いたゴールへシュートする。
ただし、
今回の課題ではロボットの動きをピンポン玉をキャッチするためのアームの動作と移動のための左右のタイヤの動きの2つに分けた。
画像のようにピンポン玉を囲むアームを作り、それを上げ下げすることでボールをキャッチさせた。
半径の小さい円を回らなければならないため、タイヤとタイヤの距離、タイヤと光センサの距離を短くした。また、タイヤを2つにして後方には摩擦の小さなパーツを付けた。
今回のプログラムでは多く使う5つの動作を定義した。また、線をトレースする動作をサブルーチンにした。
下の5つの動作を定義した。
#define GO OnFwd(OUT_AC); //前に進む #define CURVE_RIGHT OnFwd(OUT_A);Off(OUT_C); //右に曲がる #define CURVE_LEFT OnFwd(OUT_C);Off(OUT_A); //左に曲がる #define TURN_RIGHT OnFwd(OUT_A);OnRev(OUT_C); //右に旋回する #define TURN_LEFT OnFwd(OUT_C);OnRev(OUT_A); //左に旋回する
線の左側をトレースするようにした。急なカーブも曲がり切れるようにセンサの値によって5つの動作をするようにした。交差点の判断にはタイマーを使い、0.27秒以上線の上にセンサがあった場合交差点と認識するようにプログラムした。交差点を認識した際、合図として音が鳴るようにした。
sub LINE_TRACE() { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); //タイマー0をリセット while(FastTimer(0)<27){ //タイマー0が0.27秒以下の時{}の動作 if(SENSOR_2>50){TURN_RIGHT;ClearTimer(0);} //センサが白に位置するとき右に旋回しタイマーをリセット else if(SENSOR_2>47){CURVE_RIGHT;ClearTimer(0);} //白よりのグレーの時右に曲がりタイマーをリセット else if(SENSOR_2>43){GO;ClearTimer(0);} //グレーの時直進しタイマーをリセット else if(SENSOR_2>39){CURVE_LEFT;ClearTimer(0);} //黒寄りのグレーの時左に曲がりタイマーをリセット else if(SENSOR_2>34){TURN_LEFT;} //黒の時左に旋回する } Off(OUT_AC); PlaySound(SOUND_LOW_BEEP); //音を鳴らす Wait(50); TURN_RIGHT; //(止まる際に旋回した分の調整) Wait(20); Off(OUT_AC); Wait(100); }
シュート動作はピンポン玉を押し込むだけの単純な動作にした。
task main() LINE_TRACE(); //(Aスタート) GO; //一つ目の交差点(P直進) Wait(30); LINE_TRACE(); GO; //二つ目の交差点(Q直進) Wait(40); OnRev(OUT_B); //アームを下げる(ピンポン玉をキャッチ) Wait(30); Off(OUT_B); LINE_TRACE(); GO; //3つ目の交差点(Q直進) Wait(30); LINE_TRACE(); CURVE_RIGHT; //4つ目の交差点(R右折) Wait(50); LINE_TRACE(); GO; //5つ目の交差点(P直進) Wait(30); LINE_TRACE(); TURN_LEFT; //6つ目の交差点(S左折) Wait(30); LINE_TRACE(); OnRev(OUT_AC); //後退 Wait(50); OnFwd(OUT_B); //アームを上げる Wait(30); Off(OUT_B); GO; //前進(Cへシュート) Wait(100); Off(OUT_AC); }
ロボット本体を作るのは1つ目の課題に比べて短時間でできた。しかし、しきい値の調整など細かい数値を調整することが大変だった。最終的には3回に1回くらいの成功率になった。練習では急なカーブで止まってしまったり、交差点で止まらず左折してしまうことがあった。すべての交差点で止まるまでの時間を同じにしていたが、交差点によって秒数を変えればもっと成功率を挙げられたかもしれないと思った。本番ではうまくいかなかったが、練習では何度か成功できたので良かった。