#contents

*ロボット [#w8bdd8ff]
**はじめに [#i3d85ab2]
このコースのAからBをトレースする。
#ref(./yakushi.shinshu-u.ac.jp.png,50%);
黒い線と白いところの間をトレースし、交差点を横断し、ボールを掴み目的地にボールを置くといった動作をするロボットを製作した。動くスピードを遅くすることで正確にトレースすることが出来る様になった。

**ロボット本体構造 [#n052a679]
***機体の外観 [#if2cdaf5]

クワガタのような外観
動力のあるタイヤが2つにクルクルと回転する補助輪が一つである。
アームは下からボールをすくいあげるように掴む構造になっている。
明るさセンサーはタイヤから少し離れた前方についている。コードが多くあるので引っかからないように広がらないようにとめてある。

#ref(./IMG_2255.JPG,10%); 
&ref(./IMG_2256.JPG,10%);
&ref(./IMG_2258.JPG,10%);
&ref(./IMG_2261.JPG,10%);


***ボールをつかんで離すための機構 [#c9b87d92]
モーターの縦回転を横回転に変えるために4枚歯の歯を4つ使っている。
&ref(./57.png,30%);

アームが大きく開いていて、それが閉じることによって
ボールをつかむことが出来る。
#ref(./IMG_2259.JPG,10%);
&ref(./IMG_2260.JPG,10%);




***黒い線を辿るための機構 [#dfb8795c]
アームの下についたセンサーによって、黒い線、白いところ、その間を認識する。
&ref(./IMG_2262.JPG,10%);



**プログラムの説明 [#l7b06986]

赤外線センサーを用い、入射した赤外線の反射強度により、ロボットが黒い線のどの辺を走行しているか判断している。 
1)線の外(白)
2)線の境界上(グレー)
3)線の上(黒)
の三種類として認識する。進行方向向かって左側の境界上を移動させるので、ロボットの場所によりそれぞれ
1)右にシフト
2)直進
3)左にシフト
しながら進んでいく。基本的にはwhileループで1[ms]ごとにセンサーの値を取得、上記の動作を繰り返す。T字路、交差点、ゴール地点では上記の動作とは別の専用のタスクを割り込ませる。
交差点の判定は、スタートからの経過時間と黒の線上にいる時間[ms]によって判定している。1ループ1[ms]に設定している為、黒の処理に入ったときに黒カウンタnを上げる。nの次元は[ms]となる。マシンの処理速度に対して1[ms]は十分に遅いと考えられるので、whileループ内の処理にかかる時間は無視できると考えた。交差点に到達する前にも、長時間黒の上に滞在するポイントが存在したので、それらを省くためにCurrentTick()関数を用いてプログラム開始からの時間を条件に補助的に採用している。
しながら進んでいく。基本的にはwhileループで1[ms]ごとにセンサーの値を取得、上記の動作を繰り返す。
交差点の判定は、スタートからの経過時間と黒の線上にいる時間[ms]によって判定している。1ループ1[ms]に設定している為、黒の処理に入ったときに黒カウンタnを上げる。nの次元は[ms]となる。交差点に到達する前にも、長時間黒の上に滞在するポイントが存在したので、それらを省くためにCurrentTick()関数を用いてプログラム開始からの時間を条件に補助的に採用している。
ボールキャッチ処理は完全にスタート時からの秒数に依存している。

 #define BLACK 36
 #define WHITE 48
 #define SPEED 25
 #define go_forward OnRev(OUT_BC,SPEED);
 #define turn_left OnRev(OUT_B,SPEED);Off(OUT_C);
 #define turn_right Off(OUT_B);OnRev(OUT_C,SPEED);
 #define turn_left2 OnFwd(OUT_C,SPEED);OnRev(OUT_B,SPEED);
 #define STEP 1
 #define tukamu OnFwd(OUT_A,SPEED);Wait(1000);Off(OUT_A);//ボールを掴む
 #define hanasu turn_right;Wait(1000);go_forward;Wait(300);Off(OUT_B);Off(OUT_C);OnRev(OUT_A,SPEED);Wait(1000);Off(OUT_A);//ボールを離す
 task main(){
	SetSensorLight(S3);
	int n=0; //黒の上にいる時間を計測するための変数
	int m=0;
	int flg1=0; //交差点通過前=0 交差点通過後=1
	int flg2=0; //ゴール判定用のフラグ
	int flg3=0; //ボールキャッチ前=0 ボールキャッチ後=1
	long t0=CurrentTick();
	while(flg2==0){//ゴール判定用の
		if(CurrentTick()-t0>9000 && flg3==0){ //ボールをつかむ
			tukamu;
			flg3=1;//ボールを掴んだというフラグを立てる
		}else if(SENSOR_3 < BLACK){ //黒の上なら
			turn_left;
			n++;//黒のカウンターを上げる
			if(n>500 && CurrentTick()-t0>10000 && flg1==0){ //黒の上に1秒以上 & スタートから10秒以上経過しているなら
				Off(OUT_BC);
				n=0; //黒のカウンターリセット
				flg1=1; //交差点を通ったというフラグをたてる
				turn_left2;
				Wait(700);
			}
	}else if(n>500 && flg1==1){
				flg2=1;//ゴールを通過したというフラグを立てる
		}else if(SENSOR_3 < WHITE){ //ラインの境界なら
			go_forward;
			n=0;//黒のカウンターをリセットする
		}else{ //それ以外(白)なら
			turn_right;
			n=0;
		}
		Wait(STEP);//1msの間待つ。1サイクル1msに設定する
	}
	hanasu;//ボールを放す
 }

**感想 [#e4d3765e]
交差点を通過する時など、白黒をセンサーに認識させたりと、思っている以上に難しかった。機体の回転方法をコンパスの様に回転させるのでなく、旋回する様にしたら上手くいったりと、細かい所での工夫が難しく楽しくもあった。

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