目次

課題2:黒い線に沿って動くロボット

各チームで作成したコースを1周するロボットを製作せよ。
交差点以外のコース上に350mlの空の空き缶を2個以上おき、空き缶にぶつかった時には次のような動作するプログラムを作成せよ。(他のメンバーと重ならないように一人一つのプログラムを作成する)

  1. 空き缶をコース上に戻して再びコースに戻って進む
  2. 空き缶を次の交差点まで運んで行き、その交差点に空き缶を残してさらにコースに沿って進む

ただし、

  • 速さと正確さを追求すること
  • コースを1周したら自動的に止まること
  • 交差点では一時停止すること

メンバー

  • ヒデ
  • ショウ

ロボット

F1000168.jpg
F1000169.jpg
←全体
センサ部分→

改良後

全体図

全体図b.jpg
  • 缶の移動法
    シンプルにアームではさんで回転し缶を移動させる

上面

上面b.jpg

NQC本体を取り外した写真

下面

下面b.jpg

ほとんど本に載っていた基本ベースを元に作ってある。

前面

前面b.jpg

光センサを外した写真

  • 本体は本に載っていたドライブベースを使っていたが、タッチセンサーが付けづらかったので、前面の出っぱている青いパーツをなくして汎用性を高くした。

アーム

アームb.jpg
  • アームの先を、最初は缶が入りやすいように外側に向けていたが、曲がるときに缶が逃げてしまうので内側向きにつけた結果、写真のようになった。
  • アームの先を上下に2つ付けることで缶が転倒しづらくした。
    アーム接続部分b.jpg
  • アームの位置が低く、タイヤに接触したり、缶が倒れやすかったので高い位置に変更した。

タッチセンサ

タッチセンサb.jpg
  • 最初はタッチセンサ2つを1つのセンサーポートに重ねて繋いでダブルバンパーを使っていたが、缶が軽くうまくタッチセンサを押せなかったので、写真にあるようにタイヤを重りにして少しの力で反応するようにした。
  • タイヤを支える部分をまっすぐなパーツから曲がったパーツにすることで、揺れによる誤作動を軽減させた。

光センサ

光センサb.jpg
  • 光センサーの2つの幅を狭く、紙に近付けることで、黒い線を正確にとらえられるようにした。
    コードb.jpg
  • 各種センサのコードをまとめて作業の邪魔にならないようにした。

その他に工夫した点

  • パーツやパーツの取り付けをシンプルにして小型化と簡単に分解できるようにした。
  • 耐久性を高くすることを意識しながら作った。
  • 車高を低くし重心を低くしたことでぶれずに安定して進めるようにした。

コース

コース

交差部分3つのシンプルなコース
ロボットが感知しやすいように、交差する部分を直角になるようにした。

プログラム

ヒデ 1.空き缶をコース上に戻して再びコースに戻って進む

#define THRESHOLD 47 // 閾値

#define TURN_TIME 222 // 半回転する時間

#define GO_TIME 100

#define BACK_TIME 100

#define LIMIT 5000 

task main(){

 SetSensor(SENSOR_1, SENSOR_LIGHT);
 SetSensor(SENSOR_3, SENSOR_LIGHT);
 SetSensor(SENSOR_2, SENSOR_TOUCH);
 ClearTimer(0);

  while(FastTimer(0)<LIMIT){                                    //タイマーのセット

	     start follow_line;                                 //ライントレースの開始
            until(SENSOR_2==1);	                                //タッチセンサが1になるまで
	     stop follow_line;                                  //ライントレース終了
	     OnFwd(OUT_A+OUT_C);                                //缶を移動したときに場所がずれないように前進
            Wait(160);   
            OnFwd(OUT_A);                                        //缶の移動
            OnRev(OUT_C);
	     Wait(TURN_TIME);
	     OnRev(OUT_A+OUT_C);                                 //缶をアームからはずす
	     Wait(BACK_TIME);
	     OnFwd(OUT_A);OnRev(OUT_C);                          //進行方向に戻る
	     Wait(TURN_TIME);
	     Off(OUT_A+OUT_C);
	     OnRev(OUT_A+OUT_C);                                 //ラインの上に戻る
            Wait(100);}


}

task follow_line(){

    while (true){
          if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){            //センサー1だけ黒
              OnFwd(OUT_C);OnRev(OUT_A);                             //左回転
          }else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){      //センサー3だけ黒
              OnFwd(OUT_A);OnRev(OUT_C);                             //右回転
          }else if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)){      //両方黒なら1秒止まって、0.5秒間前進して渡り切きる
			Off(OUT_A+OUT_C);
			Wait(100);
			OnFwd(OUT_A+OUT_C);
			Wait(50);
	  }else{
	      OnFwd(OUT_A+OUT_C);                                    //両方白なら前進
	  }
     }
}

最初、交差する部分を渡り切るまでに何度も止まってしまったので、交差点に行ったら前進するようにした。
閾値を黒い線を半分だけまたいだ時の値にして、無駄な動きを減らした。

ショウ 2.空き缶を次の交差点まで運んで行き、その交差点に空き缶を残してさらにコースに沿って進む

#define THRESHOLD 47      //閾値(ラインから少しずれてる時)
#define THRESHOLD_B 40    //閾値2(ラインから大きくずれてる時)
#define TURN_TIME 222     //半回転する時間
#define GO_TIME 100       //交差点から抜け出す時間
#define BACK_TIME 100     //缶から遠ざかる時間
#define LIMIT 6000        //プログラムの稼働時間
int x=0;			//x=1→空き缶持ってる,x=0持っていない
task main(){

  SetSensor(SENSOR_1, SENSOR_LIGHT);
  SetSensor(SENSOR_3, SENSOR_LIGHT);
  SetSensor(SENSOR_2, SENSOR_TOUCH);
  ClearTimer(0);

   while(FastTimer(0)<LIMIT){
		start follow_line;                                 //ライントレースの開始
             until(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD);                        //交差点まで
		stop follow_line;						//ライントレース終了
		Off(OUT_A+OUT_C);						//交差点で1秒停止
		Wait(100);
		OnFwd(OUT_A+OUT_C);                             //交差点から出る
		Wait(GO_TIME);
		if(x==1){                                     //もし缶を持っているなら
			move();                               //缶を移動
		}
    }
    music();              //終わったら音楽を鳴らす
}

task follow_line(){       //ライントレースタスク
while (true){
          if(SENSOR_1<THRESHOLD&&SENSOR_3>THRESHOLD){           //センサ1だけ黒
              if(SENSOR_1<THRESHOLD_B){                           //ラインから大きくずれてる時
                     OnFwd(OUT_C);OnRev(OUT_A);                            //左回転
              }else{                                              //ラインから少しずれてる時
                     OnFwd(OUT_C);Float(OUT_A);                    //左に曲がる
              }
              Wait(3);
          }else if(SENSOR_1>THRESHOLD&&SENSOR_3<THRESHOLD){     //センサ3だけ黒
              if(SENSOR_3<THRESHOLD_B){                           //ラインから
                     OnFwd(OUT_A);OnRev(OUT_C);                            //右回転
              }else{                                             //ラインから少しずれてる時
			OnFwd(OUT_A);Float(OUT_C);             //右に曲がる
	       }
	       Wait(3);
          }else{                                                //両方白もしくは両方黒
              OnFwd(OUT_A+OUT_C); Wait(3);                                  //前進
	   }
	  if(SENSOR_2==1){                  //空き缶に当たったらxを1にする
		x=1;
	  }
     }
}

sub move(){
       OnFwd(OUT_A);OnRev(OUT_C);              //缶を交差点に戻す
       Wait(TURN_TIME);
	OnRev(OUT_A+OUT_C);                     //後退して缶を巻き込まないようにする
	Wait(BACK_TIME);
	OnFwd(OUT_A);OnRev(OUT_C);              //進行方向へ回転
	Wait(TURN_TIME);
	OnRev(OUT_A+OUT_C);                     //ラインの上に移動
	Wait(BACK_TIME);
	Off(OUT_A+OUT_C);
	x=0;                                    //作業を終了したのでxを0にする
}                                   
			
sub music(){         //某RPGのレベルアップ音

	PlayTone(1175,10);
	Wait(15);
	PlayTone(1175,10);
	Wait(15);
	PlayTone(1175,10);
	Wait(15);
	PlayTone(1175,10);
	Wait(30);
	PlayTone(1047,10);
	Wait(30);
	PlayTone(1319,20);
	Wait(30);
	PlayTone(1175,44);

}

タスクを2つとサブルーチンを使い、メインタスクを1番前に持ってきたことで見やすくすっきりとしたプログラムになったと思う。
音楽を鳴らせるようにした
閾値を2段階に設定して、少し曲がっただけならFwdとFloat、かなり曲がるときはFwdとRevの組み合わせにし、その後にWait(3)を入れて効率よく進めるようにした。

感想

ヒデ

タッチセンサがうまく押せなくて、パーツをつけて調整したら逆に常に押してしまうようになったり調整が難しかった。今回のは考えるのが大変でした。

ショウ

音楽が意外とうまくいった。前回よりもロボット本体の製作が難しくて最初は思った通りに行かず、授業外に集まるなど大変だった。

コメント

コメントやアドバイスをお願いします

  • 写真に説明を入れるとよいと思います。また、プログラムについても具体的な説明してください -- TAKA? 2010-07-09 (金) 17:45:55
  • コンパクトでわかりやすいレポートだと思います -- FI? 2010-07-29 (木) 10:30:35


添付ファイル: file全体図b.jpg 175件 [詳細] file前面b.jpg 169件 [詳細] file上面b.jpg 191件 [詳細] file光センサb.jpg 164件 [詳細] file下面b.jpg 155件 [詳細] fileタッチセンサb.jpg 161件 [詳細] fileコードb.jpg 177件 [詳細] fileアーム接続部分b.jpg 239件 [詳細] fileアームb.jpg 157件 [詳細] file上面.jpg 90件 [詳細] file光センサ.jpg 83件 [詳細] file下面.jpg 95件 [詳細] fileアーム.jpg 90件 [詳細] file前面.jpg 91件 [詳細] file全体図.jpg 89件 [詳細] fileタッチセンサ.jpg 83件 [詳細] fileコード.jpg 77件 [詳細] fileアーム接続部分.jpg 86件 [詳細] fileF1000170.jpg 164件 [詳細] fileF1000169.jpg 150件 [詳細] fileF1000168.jpg 145件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-07-29 (木) 10:30:35 (3253d)