今回の課題

 今回の課題は、黒いライン上にある障害物(ここでは缶)を避けながらコースを一周(時計回りもしくは反時計回り)するプログラムを作成するという課題でした。私は、反時計回りのプログラミングをやりました。コースは下の通りです。

コース

 1〜7の順番でプログラムを作成しました。7の部分で缶をひとつ設置し、缶を動かすプログラムを作成しました。矢印の方向に進みます。

ロボットの紹介

 ロボットを作る時に一番考えたのは、光センサーの位置と缶を動かすアームの部分です。光センサーは、なるべくロボットの本体に近い形にし、小回りが利くように取り付けました。また当初はロボの脚がキャタピラーであったり、虫の足をイメージしたものであったが、スピーディーで小回りが出来るタイヤに変更しました。ちなみにタイヤは前輪駆動にし、後ろはシンプルに補助車輪を付ける形にしました。  缶を掴むアームはただ挟む感じではなく、片方にのみアームをつけることで包み込む形で缶を避けるシステムにしました。相方さんがより頑丈にアームを改良してくださいました。  また、缶を認識するタッチセンサーはバンパーに凹凸をつけることでより感度よく反応するように工夫しました。

アーム

 アームは左サイドにのみ取り付けました。結構重いです…。後ろにおもりを付けると動きがスムーズになりました。

バンパー

 タッチセンサーにバンパーを取り付けました。左右違う長さの部品を取り付け、缶がいい具合にフィットするように工夫しました。この凹凸がポイントです‼  

こだわりポイント

 -タイヤ   

 -アーム

 -(目と羽‼)   目と羽がつくととても可愛く……(どこか虫の様に見える気がするが)

目と羽

難点

 アームが若干重くなってしまって、重心が前になってしまいました。その為、動きがガクガクしてしまうのが難点。また、タッチセンサーもバンパーをつけたものの、軽すぎる空き缶の場合は認識する感度が低いためより改良する必要がありました。

プログラムの説明

 私が担当したのは、コースを反時計回りで動くプログラム。交差点を渡るプログラムに少し戸惑ったが、タイマーとカウンタを使うことで正確に渡れるようにしました。ただ、光センサーの値が変わってしまう時がある(変数にすればよかったのだろうか...)。

 プログラムの冒頭に定数を決めておく。

定数

#define THRESHOLD 43 //しきい値
#define HIPOWER 4 //モーターのパワー
#define LOWPOWER 2
#define set_power_H SetPower(OUT_AC,HIPOWER); 
#define set_power_L SetPower(OUT_AC,LOWPOWER);
#define go_forward set_power_H; OnFwd(OUT_AC); //直進
#define turn_left1 set_power_L; OnFwd(OUT_C); Off(OUT_A); //左折
#define turn_left0 set_power_L; OnFwd(OUT_C); OnRev(OUT_A); //左旋回
#define turn_right0 set_power_L; OnFwd(OUT_A); Off(OUT_C); //右折
#define turn_right1 set_power_L; OnFwd(OUT_A); OnRev(OUT_C); //右旋回
#define STEP 1 //1回の判断で動作させる時間
#define nMAX 6 //交差点とカーブを判断する繰り返しの最大値
#define short_break Off(OUT_AC); Wait(50); //小休止
#define CROSS_TIME 30 //交差点を渡る時間
#define cross_line OnFwd(OUT_AC); Wait(CROSS_TIME); short_break; //交差点を渡る
#define time0 1000  //,砲かる時間
#define time1 200  //△砲かる時間
#define time2 600  //にかかる時間
#define time3 800  //きキΔ砲かる時間
#define time4 3000  //Г砲かる時間

   サブルーチンを使ってプログラムをコンパクトにする。

交差点のない場合

sub line_race() //通常のライントレース
	{
		if (SENSOR_2 < THRESHOLD -5) { turn_right1; } 
		else if (SENSOR_2 < THRESHOLD -3) { turn_right0; }
		else if (SENSOR_2 < THRESHOLD +2) { go_forward; } 
		else if (SENSOR_2 < THRESHOLD +5) { turn_left1; }
		else { turn_left0; }
	}

交差点の付近&交差点

sub line_cross()
	{
		int nOnline=0; //続けて黒になった回数 始めを0とする
		while (nOnline < nMAX){  //続けて黒になった回数がMAX以内
			if (SENSOR_2 < THRESHOLD -5) { turn_right1; nOnline++; }  //右旋回の場合、カウントする黒になった回数をカウント
			else 
			{ 	if (SENSOR_2 < THRESHOLD -3) { turn_right0; }
				else if (SENSOR_2 < THRESHOLD +3) { go_forward; } 
				else if (SENSOR_2 < THRESHOLD +7) { turn_left0; }
				else { turn_left1; }
			nOnline=0; //カウンタをリセット
			}
		Wait(STEP);
		}
		short_break; PlaySound(SOUND_DOWN); //小休止、音で知らせる
		turn_left0; Wait(nMAX*STEP); //方向修正
		cross_line;  //交差点を渡る
		nOnline=0; //カウンタをリセット
	}

 交差点は今回一番悩み、苦労した点です。最初は、カウンタをなかなかうまく使うことができず交差点と認識して渡ることが出来ませんでした。試行錯誤を繰り返して、なんとかカウンタを使うことが出来ました。このプログラムでは、交差点に差し掛かった時に黒が連続して6回位以上になった場合は、音で交差点と知らせ、交差点と判断して横断します。音の動作を入れたことで、交差点と認識できているかどうか、確かめることが出来るようになったので良かったと思います。

缶を移動

sub line_can()
	{
		OnFwd(OUT_B); //アームでつかむ
		Wait(7);
		OnFwd(OUT_AC); //前進
		Wait(130);
		OnFwd(OUT_C); OnRev(OUT_A); Off(OUT_B); //左旋回
		Wait(180);
		Off(OUT_AC);  //停止
		Wait(50);	
		OnRev(OUT_B);  //缶を離す
		Wait(10);		
		OnRev(OUT_AC);  //後進
		Wait(180);		
               OnFwd(OUT_A); OnRev(OUT_C); Off(OUT_B);  //右旋回
		Wait(70);
		OnFwd(OUT_AC);
		Wait(100);			
		Off(OUT_ABC);
	}

 缶をつかむプログラムは移動に結構スペースを取るため、もう少し小回りができるプログラムにすればより良くなると思います。

全体のプログラム

task main()
{
	SetSensor(SENSOR_3, SENSOR_TOUCH); //センサー3はタッチセンサー
	SetSensor(SENSOR_2, SENSOR_LIGHT); //センサー2は光センサー
       int nOnline=0;
       ClearTimer(0); //0番目のタイマーをリセットする
	while (FastTimer(0) <= time0) { line_race(); } //,離廛蹈哀薀
	PlaySound(SOUND_UP); //サウンド
	ClearTimer(0);
	while (FastTimer(0) <= time1) { line_cross(); } //△離廛蹈哀薀
	PlaySound(SOUND_DOUBLE_BEEP);
	ClearTimer(0);
	while (FastTimer(0) <= time2) { line_race(); } //のプログラム
	PlaySound(SOUND_UP);
	ClearTimer(0);
	while (FastTimer(0) <= time3) { line_cross(); } //きキΔ離廛蹈哀薀
	PlaySound(SOUND_DOUBLE_BEEP);
	ClearTimer(0);
	while (FastTimer(0) <= time4) {
		 line_race();     //Г離廛蹈哀薀
		 if(SENSOR_3 == 1) { line_can(); }  //缶がタッチセンサーに反応すると缶を移動するプログラムを読み込む
		}
	PlaySound(SOUND_UP);	
	Float(OUT_AC);  //停止
}

 サブルーチンを使用したことでコンパクトにすることが出来ました。は半径が小さく、交差点のプログラムだとうまく走ることが出来なかったので、通常のライントレースのプログラムにしました。きキΔ蓮△垢戮童鮑硬世鯏呂襪海箸出来るプログラムにしました。Г任蓮缶を移動するプログラムを入れ、ゴールするようにしました。高い確率で一周できるようになりました。

感想と反省点

ロボットについて

 缶を動かすアームを包み込んで動かす仕組みにしたのがなかなか良かったと思う。オリジナルのロボットを作ることが出来た。もう少しタッチセンサーを改良して、缶を認識する感度をもっと上げる工夫をすべきであった。  目と羽を付けたことで、ロボットが可愛く?なった(笑)余談ですが、目が動いている途中によく取れます。

プログラムについて

 コースを反時計回りにするプログラミングをしたが、ロボットが自分の思っている通りに動いてくれない時があり、かなり苦戦しました。特に交差点を曲がるプログラムを、始めはカウンタを使ったプログラムでやっていたがうまくいかず、タイマーとカウンタを使ったプログラムにしたらうまく交差点を渡れるようになりました。交差点ときちんと判断し、渡ることが出来るようになったのでよかったです。時々失敗することもあるため、もう少し微調整が必要であると思いました。缶を動かすプログラムでは、動きをシンプルにしたことで組み込みやすかったです。ただ、もう少し移動範囲を狭くしたほうがよりコンパクトになってよかったと思います。

全体を通して

 今回、初めてロボットのプログラミングをしてみて分からないことばかりでしたが、同じ班の仲間に助けをもらったり、練習問題を繰り返しやってみたりして、何とか出来たのでよかったです。缶をひとつ置いた場合しか出来なかったので、ふたつ置いた場合のプログラムをやってみたいです。今回の反省を活かし、次の課題にチャレンジしたいです‼


添付ファイル: fileDSC_0076.jpg 195件 [詳細] fileDSC_0075.jpg 191件 [詳細] fileDSC_0072.jpg 164件 [詳細] fileコース1.jpg 193件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-12-13 (金) 00:51:33