2016a/Member

課題説明

http://yakushi.shinshu-u.ac.jp/robotics/?plugin=ref&page=2016a%2FMission2&src=2016a-mission2.png

上記のルートをC地点からA地点へ(C地点 → S左折 → P左折 → Q直進 → Q直進 → R右折 → P左折 → A地点)ラインをたどって移動させる。 交差点では1秒間止まらせる。

ロボの説明

光センサーを車体の真ん中に設置した。少しタイヤが取れやすい。

IMG_4314.jpg

プログラミングの説明

・定義

#define BLACK 50//光の明るさ
#define WHITE 60//光の明るさ
#define SPEEDA 20//モーターの速さ
#define SPEEDB 30//モーターの速さ
#define go_forward  OnFwd(OUT_BC,SPEEDA);//前進
#define turn_leftA  OnFwd(OUT_B,SPEEDA);Off(OUT_C);//遅く左折
#define turn_leftB  OnFwd(OUT_B,SPEEDB);Off(OUT_C);//早く左折
#define turn_leftC  OnFwd(OUT_B,SPEEDB);OnRev(OUT_C,SPEEDB);//左旋回
#define turn_rightA OnFwd(OUT_C,SPEEDA);Off(OUT_B);//遅く右折
#define turn_rightB OnFwd(OUT_C,SPEEDB);Off(OUT_B);//早く右折
#define turn_rightC OnFwd(OUT_C,SPEEDB);OnRev(OUT_B,SPEEDB);//右旋回
#define STEP 1
#define short_break Off(OUT_BC);Wait(1000);PlaySound(SOUND_UP);//音出し
#define nMAX 250 //カウントの最大値

以上の定理を用いて作る

・サブルーチン

sub line_follow()//ラインの左側に沿って走らせる
{
 SetSensorLight(S1);
 int nOnline=0;
  while (nOnline < nMAX) {  //カウントが250よりも小さいとき
     if (SENSOR_1 < BLACK-10) {
       turn_leftA;
       nOnline++; //カウント増加
     } else {
       if (SENSOR_1 < BLACK+5) {
         turn_leftA;
       } else if (SENSOR_1 < WHITE) {
         go_forward;
       } else if (SENSOR_1 < WHITE+5) {
         turn_rightA;
       } else {
         turn_rightA;
       }
       nOnline=0; //カウントを0にリセット
     }
     Wait(STEP);
   }
   short_break;
   Off(OUT_BC);
   nOnline=0; //カウンタを0にリセット
 }
sub line_follow2()//回転に対応させながらラインの左側に沿って走らせる
{
 SetSensorLight(S1);
 int nOnline=0;
  while (nOnline < nMAX) {
     if (SENSOR_1 < BLACK-10) {
       turn_leftC;
       nOnline++;
     } else {
       if (SENSOR_1 < BLACK+3) {
         turn_leftC;
       } else if (SENSOR_1 < WHITE) {
         go_forward;
       } else if (SENSOR_1 < WHITE+5) {
         turn_rightA;
       } else {
         turn_rightA;
       }
       nOnline=0;
     }
     Wait(STEP);
   }
   short_break;
   Off(OUT_BC);
   nOnline=0;
 }
sub line_fwd()//交差点で前進
{
turn_leftC;
Wait(200);
go_forward;
Wait(500);
Off(OUT_BC);
}
sub line_right()//交差点で右折
{
go_forward;
Wait(500);
turn_rightC;
Wait(500);
Off(OUT_BC);
}
sub line_left()//交差点で左折
{
turn_leftC;
Wait(700);
Off(OUT_BC);
}

・交差点について

 while (nOnline < nMAX) {  //カウントが250よりも小さいとき
     if (SENSOR_1 < BLACK-10) {
       turn_leftA;
       nOnline++; //カウント開始
     } else {
       if (SENSOR_1 < BLACK+5) {
         turn_leftA;
       } else if (SENSOR_1 < WHITE) {
         go_forward;
       } else if (SENSOR_1 < WHITE+5) {
         turn_rightA;
       } else {
         turn_rightA;
       }
       nOnline=0; //カウントを0にリセット
     }
     Wait(STEP);
   }
   short_break;
   Off(OUT_BC);
   nOnline=0; //カウンタを0にリセット

上記のプログラミングはライントレースの一部分である。まず、黒い直線(光の明るさが55よりも小さい)に触れたとき左折を始め黒い直線からでようとする。黒い直線の中心(明るさが40よりも小さい)に触れたとき左折をすると同時にカウントを開始する。曲がり角が急であればあるほど中心に触れている時間は長くなる。よってこのカウントが250を超えたとき直角の曲がり角がある交差点と判断し音が鳴るようにした。

・プログラム

回転に対応するために光の度合いを考えたり車体の速さを調節してみたが必ず交差点と判断してしまった。旋回させながら進ませることで全体的な速度は落ちるがなんとか通り抜けることができた。 ラインの左側を沿って走るため交差点で直進するときは左に少し旋回してから直進するようにした。

task main()
{
line_follow(3000);
line_left();//Sを左折
line_follow(5000);
line_left();//Pを左折
line_follow(3000);
line_fwd();//
line_follow2(5000);
line_fwd();
line_follow(5000);
line_right();
line_follow(5000);
line_left();
line_follow(5000);
go_forward;
Wait(1000);
short_break;
}

反省

コースタイムは2分32秒であった。

long tを用いてプログラミングを考えていたがそもそもline_followは一回停止するまで動き続けるので意味はなかった。より早く走らせるためには光の度合いを正確に測定し無駄な動きをなくしていくのが一番いい。車輪の回転を速めただけではセンサーが光を読み込む前にラインを通過してしまうのでいい考えではない。

今回のようなラインをたどるロボットを作るときはロボだけでなくラインの濃さにも気をつけて取り組まなくてはならない。また、センサーがロボの正面真ん中に付いているので旋回を使わなければ円を通り抜けることはできなかった。ここも光の調節が重要であった。また、最後のカーブは曲がり切れるのにギリギリだったので余裕のある作りにしておきたい。

電池を入れ替えた際にスピードが速くなり、センサーの感度がよりよくなったのには驚いた。再調整が間に合って良かった。


添付ファイル: fileIMG_4314.jpg 279件 [詳細] file2016a-mission2.svg 98件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-08-03 (水) 12:56:23