*課題1 [#l12ad1b8]
**目標 [#i64331fb]
ピンポン球を持って黒い線の上を走り、上部の枠の手前まで運びシュートする。
#ref(2012b/Member/maji/Mission1/field.jpg,100%,フィールド)
ピンポン球を持って黒い線の上を走り、上部のゴールの手前まで運びシュートする。
**ロボットの概要 [#d53a15b0]
***全体像 [#t4943c43]
#ref(2012b/Member/maji/Mission1/all.jpg,20%,全体像)
-カーブでポールと接触しないように横は短く、縦は長くした
-コントローラの部分を後部に縦に取り付けて、前部に機能を集約させた
-ピンポン球をどうやって持ち、シュートをするか考えた結果この形になった(下記で説明)
***ドライブベース [#e2e70d64]
基礎土台で作っているうちに何度も変わったので、バラしてみてから初めて見た
#ref(2012b/Member/maji/Mission1/dodai.jpg,100%,土台)
-前部のアームの部分が不安定なので、土台はがっちりと安定したのになった
-基礎土台で作っているうちに何度も変わった
#ref(2012b/Member/maji/Mission1/run.jpg,100%,走る構造)
-三輪車の逆バージョンで前輪駆動にしたのは、光センサーが近くて読み取りやすかったら
-黒くて丸い部分は支えの役割で引きずって走る
***球をつかんでシュートする構造 [#f0f1fad4]
&ref(2012b/Member/maji/Mission1/grab.jpg,100%,つかむ構造);
&ref(2012b/Member/maji/Mission1/moter.jpg,100%,モーター);
&ref(2012b/Member/maji/Mission1/catch.jpg,100%,つかんでる所);

モーターのパワーがゴムとギアに伝わってアームを回す
このように球をアームを回すと本体に引っかかるので、そのまま運びゴール前で逆回転をして弾いてシュートする
-このように球をアームを回すと本体に引っかかるので、そのまま運びゴール前で逆回転をして弾いてシュートする
-他のグループとかぶらないようにと考えました。最初はアームを平行にしてアームにピンポン球を乗せて運ぶ方法でしたが、不安定だったのでアームを支える2本の柱の長さを調節してアームと本体でがっちりと挟むようにして安定感をだしました。ついでに、シュートもかっこよくなりました。
**プログラムの説明 [#v428c126]
 #define THRESHOLD 45	// しきい値
 #define go_forward OnFwd(OUT_AC);	// 直進
 #define turn_left1 OnFwd(OUT_C);OnRev(OUT_A);	// 左旋回
 #define turn_left0 OnFwd(OUT_C);Off(OUT_A);	   // 左折
 #define turn_right1 OnFwd(OUT_A);OnRev(OUT_C);	// 右旋回
 #define turn_right0 OnFwd(OUT_A);Off(OUT_C);		// 右折
 
 task main()
 {
 	ClearTimer(0);
 	int timer = 0;	//続けて黒になった回数
 	int kado = 0;	// 走っていて左側に直角がある回数
 	SetSensor(SENSOR_2,SENSOR_LIGHT);	
 	SetPower(OUT_B, 2);
 	OnRev(OUT_B);
 	Wait(30);
 	Off(OUT_B);
 
 	while(true){
 		// 黒い時
 		if (SENSOR_2 < THRESHOLD -4){
 			ClearTimer(0);
 			while(SENSOR_2 < THRESHOLD -4){
 				turn_left1;
 			}
 			timer = FastTimer(0);	//タイマーリセット
 		// 灰色の時
 		} else if (SENSOR_2 < THRESHOLD +8){
 			go_forward;
 		// 白い時
 		} else {
 			turn_right1;
 		}
 		
 		
 		if (timer >= 30) {		//0.3秒以上黒が続いたら
 		if (timer >= 30) {	//0.3秒以上黒が続いたら直角とみなす
 			PlayTone(440, 30);
 			timer = 0;
 			kado++;	//直角の回数をカウント		
 			if (kado == 2) {	//2つ目の直角にきたら
 				turn_right1;
 				Wait(35);
 				go_forward;
 				turn_right1;   //交差点で曲がったのを正
 				Wait(35);   //面に向き直し交差点を通過す
 				go_forward;    //る
 				Wait(30);
 				timer = 0;
 			}
 			if (kado == 3) {	//3つ目の直角にきたら
 				turn_right1; //ゴールに対して正面に向くよう修正
 				turn_right1;
 				Wait(60);
 				Off(OUT_AC);
 				SetPower(OUT_B, 7);
 				OnFwd(OUT_B);
 				Wait(100);
 				Off(OUT_B);
 				break;	
 			}
 		}
 	}
 	Off(OUT_AC);
 }

***何度も直した所 [#b8ea2dc7]
 if (timer >= 30) {		//0.3秒以上黒が続いたら
 			PlayTone(440, 30);
 			timer = 0;
 			kado++;	//直角の回数をカウント		
 			if (kado == 2) {	//2つ目の直角にきたら
 				turn_right1;
 				Wait(35);
 				go_forward;
 				Wait(30);
 				timer = 0;
最初はif (timer >= 30)の外にif (kado == 2)を置いていたけど、if (kado == 2)が来たらタイマーを0にしてしまうので、次のif (kado == 3)までいけなかったのをif (timer >= 30)の中に入れることによって直角の回数を3まで数えた
*感想 [#j6de3015]
相方にかなりアドバイスをもらって完成しました。こんなに時間がかかると思わなかったので、次回は時間に余裕を持って完成させたい。プログラムの方は短くでき、しきい値を微調整しなくても安定してゴールまで行けたんで満足です。


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