**目次 [#p4c77eaa]
#contents
*課題 [#y6dc8d24]
決められたラインを通りゴールまで行く。~
途中でボールをキャッチしゴールでシュートする。~
決められたラインの図は[[課題2:http://yakushi.shinshu-u.ac.jp/robotics/?2015a%2FMission2]]を参照。~
私はCからAへ行く課題です。
*ロボット [#i73b3712]
#ref(1.jpg)
**本体 [#fa6f6cc5]
本体はマインドストームの冊子12p〜17pのドライブベースそのままです。~
#ref(3.jpg)
ここが最大の工夫点です。
光センサーをドライブベースのほぼ中心に配置することができました。~
このことによりモーターの軸と光センサーがほぼ一直線になる(正確には光センサーが少し前方に位置している)ためライントレース時の光センサーとモーターとのズレを解消することができ、より早く滑らかなライントレースをさせることが可能になりました。~
またドライブベースの前方が綺麗になったためアームの拡張性が広がりました。~
**アーム [#hce0ca54]
簡単につけ外しができます。
#ref(2.jpg)
アームはモーターによって動く部分と固定してある部分に分かれています。~
モーターで動く部分は上から見て左が短く、右が長くなっています。~
ギア比の違いによってシュートするときに左のアームが1回転以上することでボールを打ち出します。~
*プログラム [#o1d1885d]
プログラムの作成にあたっては「[[マインドストームを使って自律型ロボットを作ろう!:http://yakushi.shinshu-u.ac.jp/robotics-jr/robotics-jr.html#advancedProgram]]」のサンプルプログラムを参考にしました。~
~
プログラムは大きく分けて2つになります。~
・ライントレースによって前に進む部分~
・交差点を渡ったり曲がったりするものとボールを掴んだり放したりする部分~
です。~
~
プログラム内にも説明があります。
**ライントレース部分 [#h3fc410b]
基本はラインの左端をたどっていくことです。~
白と黒との色の違いは数字で表すとはっきり分かれるのではなく滑らかな曲線になるらしいです。~
したがって光センサーで白と黒を読み取った値を大きく二つに分けました。~
そこから数字を少し足し引きし白黒を5つに分け、ロボットの曲がる大きさに違いを出して早くゴールできるようにしました。~

**交差点部分 [#j422dbdb]
交差点やT字路ではライントレースプログラムだけではロボットが自動的に左に曲がってしまいます。~
このプログラムは右に小さく曲がった回数を記録してその数を規定値より上回った場合違うプログラムを実行します。~
『1回目は真っ直ぐ進みボールをキャッチ、2回目は右へ、3回目にボールをシュートする。』とコースが決まっていたので、それぞれに合わせたプログラムを作成しカウントし、そのカウントによって別のプログラムを実行するようにしました。
~
~

 #define iro 45 //白黒判別用の閾値
 #define turn_R_s OnRev(OUT_C);OnFwd(OUT_A);//右に小さく曲がる
 #define turn_L_s OnRev(OUT_A);OnFwd(OUT_C);//左に小さく曲がる
 #define turn_R_b Off(OUT_C);OnFwd(OUT_A);//右に大きく進む
 #define turn_L_b Off(OUT_A);OnFwd(OUT_C);//左に大きく進む
 #define go_S OnFwd(OUT_AC);//まっすぐ進む
 #define TIME 1 //進むときのプログラム間の時間
 
 #define MAX 10 //交差点判別;
 #define back_time FastTimer(0)//進み過ぎの時間を計る
 #define cross_line_time 20 //交差点を渡る時間
 #define back_cross_line OnRev(OUT_C);OnFwd(OUT_A);Wait(FastTimer(0)-220);//進み過ぎを戻る
 #define cross_line OnFwd(OUT_AC);Wait(cross_line_time);//交差点を渡る
 #define breakT Off(OUT_AC);Wait(200);//休む
 
 #define catc OnFwd(OUT_B);Wait(13);Off(OUT_B);//ボールを掴む
 #define shot OnRev(OUT_B);Wait(60);//ボールを放す
 
 task main()
 {
  SetSensor(SENSOR_2,SENSOR_LIGHT);
  int irocount=0; //交差点判別用カウンター
  int crosscount=0; //何回普通と違うことをしたか
  int endcount=0;//終了するためのカウンター
  ClearTimer(0);
 
  while(true){
  while(endcount==0){
 	while(irocount<MAX){
 	if(SENSOR_2<iro-6){//もし濃い黒ならば小さく左へ
 
 	if(SENSOR_2<iro-6){    //もし濃い黒ならば小さく左へ
 	 turn_L_s;
 	 irocount++;//小さく曲がった数を数える
 	  }else if(SENSOR_2<iro-2){//薄い黒ならば大きく左へ
 	  }
 
          else if(SENSOR_2<iro-2){    //薄い黒ならば大きく左へ
 	  turn_L_b;
 	   irocount=0;//大きく曲がったら数えた数を0にする。
 	   }else if(SENSOR_2<iro+1){//もし灰色ならまっすぐ進む
 	  irocount=0;    //大きく曲がったら数えた数を0にする。
 	   }
 
           else if(SENSOR_2<iro+1){    //もし灰色ならまっすぐ進む
 	   ClearTimer(0);
 	   go_S;
 	   } else if(SENSOR_2<iro+5){//更に白くなったら大きく右へ
 	   } 
 
           else if(SENSOR_2<iro+5){    //更に白くなったら大きく右へ
 	   turn_R_b;
 	    } else{//そうでなければ小さく右へ
 	    }
 
            else{    //そうでなければ小さく右へ
 	    turn_R_s;
 		}
 	Wait(TIME);
 		}
 //ここからライントレースではないところのプログラム
 crosscount++;
 	if(crosscount==1){//1回目の交差点ではまっすぐ進む、その最中でボールを掴む
     crosscount++;
 	
        if(crosscount==1){    //1回目の交差点ではまっすぐ進む、その最中でボールを掴む
 	PlaySound(SOUND_LOW_BEEP);
 	breakT;
 	back_cross_line;
 	cross_line;
 	catc;
 	}
 	if(crosscount==2){//2回目の交差点では右に曲がる
 	
        if(crosscount==2){    //2回目の交差点では右に曲がる
 	PlaySound(SOUND_LOW_BEEP);
 	breakT;
 	back_cross_line;
 	turn_R_b;
 	Wait(30);
 	turn_R_s;
 	Wait(20);
 	}
 	if(crosscount==3){//3回目の交差点ではシュートをする
 	
        if(crosscount==3){    //3回目の交差点ではシュートをする
 	PlaySound(SOUND_LOW_BEEP);
 	breakT;
 	back_cross_line;
 	shot;
 	OnFwd(OUT_AC);
 	while(true){Off(OUT_ABC);}
 	Off(OUT_AC);
 	endcount==1;//プログラムを終了させる
 	}
 irocount=0; //プログラムが実行し終わったらirocountを0にもどしライントレースに戻る
 
     irocount=0;  //プログラムが実行し終わったらirocountを0にもどしライントレースに戻る
 
 }
 }
*反省点と改善点[#w511b1c1]
アームをもう少し工夫してより掴みやすくシュートしやすい構造にすればよかった。~
プログラムはこの自分のコースのみしか走れないのでもっと普遍的に上手くいく構造にしたい。~
ボールの位置が決まっていたためプログラムで指定できたが、前方にタッチセンサーを配置してボールが来たら押されるようにしアームが閉じるようにしたかった。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS