*目次 [#kfd3446e]
#contents
*課題2:黒い線に沿って動くロボット [#of8b9e03]
各チームで作成したコースを1周するロボットを製作せよ。~
交差点以外のコース上に350mlの空の空き缶を2個以上おき、空き缶にぶつかった時には次のような動作するプログラムを作成せよ。(他のメンバーと重ならないように一人一つのプログラムを作成する)

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

ただし、

-速さと正確さを追求すること
-コースを1周したら自動的に止まること
-交差点では一時停止すること
*メンバー [#r12bc40f]
-ヒデ
-ショウ

*ロボット [#ic3bb0f2]
#ref(./F1000168.jpg,around,left)
#ref(./F1000169.jpg,around,right)
LEFT:←全体
RIGHT:センサ部分→
#clear

**改良後 [#hd3127ee]
***全体図 [#s864e274]
#ref(全体図b.jpg,around,left)
-缶の移動法~
シンプルにアームではさんで回転し缶を移動させる
#clear

***上面 [#qc4ef6b0]
#ref(上面b.jpg,around,left)
NQC本体を取り外した写真
#clear

***下面 [#l4b93dda]
#ref(下面b.jpg,around,left)
ほとんど本に載っていた基本ベースを元に作ってある。
#clear
***前面 [#b2eba30c]
#ref(前面b.jpg,around,left)
光センサを外した写真
-本体は本に載っていたドライブベースを使っていたが、タッチセンサーが付けづらかったので、前面の出っぱている青いパーツをなくして汎用性を高くした。
#clear

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

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

***光センサ [#yd80d4a5]
#ref(光センサb.jpg,around,left)
-光センサーの2つの幅を狭く、紙に近付けることで、黒い線を正確にとらえられるようにした。
#ref(コードb.jpg,around,right)
-各種センサのコードをまとめて作業の邪魔にならないようにした。
#clear

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

*コース [#jd45d10e]
#ref(./F1000170.jpg,100%,コース);
交差部分3つのシンプルなコース~
ロボットが感知しやすいように、交差する部分を直角になるようにした。

*プログラム [#q9d76ad9]
**ヒデ 1.空き缶をコース上に戻して再びコースに戻って進む [#pcc90fc9]
 #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.空き缶を次の交差点まで運んで行き、その交差点に空き缶を残してさらにコースに沿って進む [#i14ba6a4]
 #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)を入れて効率よく進めるようにした。
*感想 [#udd2bbbd]
**ヒデ [#l589ff38]
タッチセンサがうまく押せなくて、パーツをつけて調整したら逆に常に押してしまうようになったり調整が難しかった。今回のは考えるのが大変でした。
**ショウ[#hd5fd63c]
音楽が意外とうまくいった。前回よりもロボット本体の製作が難しくて最初は思った通りに行かず、授業外に集まるなど大変だった。
*コメント [#f2ed9695]
コメントやアドバイスをお願いします
- 写真に説明を入れるとよいと思います。また、プログラムについても具体的な説明してください -- [[TAKA]] &new{2010-07-09 (金) 17:45:55};
- コンパクトでわかりやすいレポートだと思います -- [[FI]] &new{2010-07-29 (木) 10:30:35};

#comment

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS