・目次

課題内容

IMG_1181.PNG

今回の課題の内容は 「A地点を出発し、次のいずれかの経路を黒い線にそって動くロボットを作成する (他のメンバーとは別の経路になるようにする)。

1:A地点から出発 → B → C(直進) → D(一時停止の後、直進) → E → F → G(一時停止の後、右折) → H → I → J(右折) → K(左折) → L(ピンポン玉をつかむ) → K(直進) → M(一時停止) → シュート→ A地点に入る(ゴール)

2:A地点から出発 → M → K(直進) → L(ピンポン玉をつかむ) → K(右折) → J(一時停止の後、左折) → I(直進) → H(直進) → G(左折) → F → E → D(一時停止の後、直進) → C(直進) → B(一時停止) → シュート→ A地点に入る(ゴール) 交差点では1秒間停止し、丁字路では直角方向に進入する時のみ一時停止すること。」

というものである。 私が挑んだコースは1番のコースである。

ロボットについて

全体像

IMG_1183.JPG

上のようなロボットをつくった。改善すべき点としてはもっと光センサーとタイヤとの距離を短くするべきであった。

ボールを掴む機構

IMG_1182.JPG

ボールをつかみ、シュートする機構は上のようにした。工夫した点としては、つかむ部分を斜めにすることによって、ボールを離すだけで、シュートを打てるようにした。

プログラムについて

ライントレース

黒い線に沿って動かすためにライントレースというプログラムを作る。ライントレースのプログラムは光センサーを用いて、「完全な黒」、「黒よりの灰色」、「灰色」、「白よりの灰色」、「完全な白」の5つの段階の明るさを判別して、それぞれの明るさで別々の動きをさせる。5つの測定した値は以下のものである。

      段階 完全な黒 黒よりの灰色 灰色 白よりの灰色 完全な白 
             値   32          42        45       55           60

である。また、それぞれの値でのときの動作のプログラムは次のように定義した。  

#define SPEED 20
#define turn_left  OnFwd(OUT_B,SPEED);Off(OUT_C);            //左に曲がる
#define turn_right Off(OUT_B);OnFwd(OUT_C,SPEED);            //右に曲がる
#define right_senkai OnRev(OUT_B,SPEED);OnFwd(OUT_C,SPEED);  //右に旋回
#define left_senkai OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED);   //左に旋回

線の左端を走るライントレースのプログラムは次のようになる。

sub follow_line(){SetSensorLight(S3);
                 long t0=CurrentTick();
                 while(CurrentTick()-t0<100){    //0.1秒未満の時
                 if(SENSOR_3>=60){               //白なら    
                 right_senkai;                   //右に旋回
                 t0=CurrentTick();               //時間をリセットする
                 }else if(SENSOR_3>=55){         //白よりの灰色なら
                 turn_right;                     //右に曲がる
                 t0=CurrentTick();
                 }else if(SENSOR_3>=45){         //灰色なら
                 OnFwd(OUT_BC,SPEED);            //速さ20で直進
                 t0=CurrentTick();
                 }else if(SENSOR_3>=42){         //黒よりの灰色なら
                 turn_left;                      //左に曲がる
                 t0=CurrentTick();
                 }else if(SENSOR_3>=32){         //黒なら 
                 left_senkai;                    //左に旋回
                    }
                 } Off(OUT_BC);}                 //停止

線の右端を走るライントレースのプログラムは次のようになる

sub line_trace(){SetSensorLight(S3);
                 long t0=CurrentTick();
                 while(CurrentTick()-t0<100){
                 if(SENSOR_3>=60){
                 left_senkai; 
                 t0=CurrentTick();  
                 }else if(SENSOR_3>=55){
                 turn_left;
                 t0=CurrentTick();
                 }else if(SENSOR_3>=45){
                 OnFwd(OUT_BC,SPEED);
                 t0=CurrentTick();
                 }else if(SENSOR_3>=42){
                 turn_right;
                 t0=CurrentTick();
                 }else if(SENSOR_3>=32){
                 right_senkai;
                    }
                 } Off(OUT_BC);}

このプログラムの内容はfollow_lineでのプログラムとほぼ同じため省略する。

これらのプログラムは黒い線に沿って進み、交差点で止まるようになっている。交差点かどうかの判断は黒い時間が0.1秒続くかどうかで判断をし、続いたとき止まる仕組みとなっている。一方で黒くなかったら、時間をリセットするようにしている。

交差点を通過する

交差点を通過するプログラムは次のようになる。

sub cross_line(){turn_right;            //右に曲がる
                 Wait(1000);            //1秒間
                 Off(OUT_C);            //停止
                 OnFwd(OUT_BC,SPEED);   //速さ20で直進する
                 Wait(1000);            //1秒間
                 Off(OUT_BC);           //停止
                }

全体のプログラム

全体のプログラムは次のようになる。

 task main()
{  follow_line(); 
   Wait(1000);                //D地点の交差点で1秒間停止
   cross_line();              //D地点の交差点を通過
   line_trace();
   Wait(1000);                //H地点の交差点で1秒間停止
   turn_left;                 //ロボットをまっすぐに
   Wait(500);                 
   Off(OUT_BC);               
   OnFwd(OUT_BC,SPEED);       //H地点の交差点を通過
   Wait(500);                 
   Off(OUT_BC);               //停止
   line_trace();
   Wait(1000);                //I地点の交差点で1秒間停止
   turn_left;                 //ロボットをまっすぐに
   Wait(500);                 
   Off(OUT_BC);               
   OnFwd(OUT_BC,SPEED);       //I地点の交差点を通過
   Wait(500);                 
   Off(OUT_BC);               //停止
   follow_line();              
   Wait(1000);                //K地点で1秒間停止
   OnFwd(OUT_BC,SPEED);       //L地点へ直進
   Wait(3000);                
   Off(OUT_BC);               //停止                
   OnFwd(OUT_A,SPEED);        //ボールをつかむ
   Wait(1000);                
   Off(OUT_BC);               //停止
   follow_line;
   Wait(1000);                //M地点で停止
   OnRev(OUT_A,SPEED);        //ボールをシュート
   Wait(2000);                
   Off(OUT_A);                //停止
)

まとめ

 ただ単にライントレースをすることだけはうまくできた。しかし、交差点を通過するなどは非常に困難であった。これは、車輪とセンサーの位置が離れてしまったことが原因だと考察します。また、車輪とセンサーの位置が少し離れてしまったがために、うまくできるときとできないときができてしまい、安定して動かすことができなかった。課題3で、もし光センサーを使うことがあれば、今回の反省を生かして、ロボットを組み立てたい。


添付ファイル: fileIMG_1183.JPG 1件 [詳細] fileIMG_1182.JPG 1件 [詳細] fileIMG_1181.PNG 3件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-07-17 (水) 11:15:44 (5d)