*課題内容 [#wcd30cdd]
**ボール回収シュートロボット [#f14814a0]
***重要項目 [#c6ed76ee]
・ライントレース

・黒ラインの交差点を確認する

・ボール(ピンポン球)の回収、排出

***主なプログラミング内容 [#n628e256]
課題フィールドのA(スタート地点)からC(ゴール枠)に行く。

途中でボールを回収しシュートする。

ボール位置は辺PQ間の折り目のところ。

***微調整すべき項目 [#v7a4af08]
・黒の値

・nMAX値

・THRESHOLDの+値(旋回と右左折の判断値幅)

・方向微調整


*ロボット外観 [#t490a7b6]
**全体 [#c23b5251]

**ボール回収機構 [#d4f11142]


*プログラミング [#taed3917]

**定数について [#ee717ec2]

前進マクロ
 #define go_a OnFwd(OUT_AC);Wait(60);Off(OUT_AC); //前進
 #define go_b OnFwd(OUT_AC);Wait(80);Off(OUT_AC); //前進

通常のカーブとして許容できる繰り返しの最大値
 #define nMAX 7  

一回の判断で動作させる時間(0.01秒)
 #define STEP 1 

黒の値
 #define THRESHOLD 32

パワー調整
 #define HIPOWER 7  // 直線用のパワー
 #define LOWPOWER 4   // カーブのパワー
 #define set_power_H SetPower(OUT_AC,HIPOWER);	//(←今回は使用しなかったが微調整用に用意しておいた。)
 #define set_power_L SetPower(OUT_AC,LOWPOWER);

ライントレースに使った移動マクロ
 #define go_forward set_power_L; OnFwd(OUT_AC); //直進
 #define turn_left1 set_power_L; OnFwd(OUT_C); OnRev(OUT_A);	//左旋回
 #define turn_left0 set_power_L; OnFwd(OUT_C); Off(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);	//右旋回


**メイン函数 [#r6bf1c9b]
 task main()
 {
	SetSensor(SENSOR_2, SENSOR_LIGHT);
	int nOnline=0; //続けて黒になった回数をカウント
	Off(OUT_AC);PlaySound(SOUND_UP);Wait(100);	//スタート合図

↑モーターにかかったままのエネルギーをリセットするために以下同様動作ごとにOffをかける。

その時に確認音を鳴らして行く。

	OnRev(OUT_B);Wait(25);Off(OUT_B);	//アームを開く
	go_a; //最初のライン越え
	
AからT字路、十字路までライントレースを開始する
	
	while(nOnline < nMAX)
	{
		if (SENSOR_2 < THRESHOLD+2)
		{
			turn_left1;   // 左旋回
			nOnline++;	//カウント+1
		} else if (SENSOR_2 < THRESHOLD+10) 
		{
			turn_left0;   // 左折
			nOnline=0;	//カウンタリセット
    		} else if (SENSOR_2 < THRESHOLD+15) 
		{
			go_forward;   // 直進
			nOnline=0;
		} else if (SENSOR_2 < THRESHOLD+19) 
		{
			turn_right0;  // 右折
			nOnline=0;
		} else 
		{
			turn_right1;  // 右旋回
			nOnline=0;
		}
		Wait(STEP);
	}	
	Off(OUT_AC);

↑ライトセンサでの白と黒とその間の判別を32〜51の間で見て進み方を変えることでスムーズなライントレースが可能になる

左旋回の時に曲がっても黒である状態をカウントし、それが多くなったところで交差点を認識する。それ以外の進みをする時はカウンターをリセットする

	OnFwd(OUT_B);Wait(25);Off(OUT_B);	//アームを閉じてボールをホールド	
	Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(200);	//交差点で2秒小休止
	OnFwd(OUT_A);OnRev(OUT_C);Wait(40);	//進行方向修正
	OnFwd(OUT_AC);Wait(70);

	Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(50);	//小休止
	nOnline=0;	//カウンタをリセット
	
次のライントレースは前と逆向きに走る。

ヘアピンカーブの内側をライントレースするとそれが交差点と誤って認識してしまうからである。

	while(nOnline < nMAX)	//逆方向のライントレース
	{
		if (SENSOR_2 < THRESHOLD+2)
		{
			turn_right1;   // 右旋回
			nOnline++;	//カウント+1
		} else if (SENSOR_2 < THRESHOLD+10) 
		{
			turn_right0;   // 右折
			nOnline=0;
    		} else if (SENSOR_2 < THRESHOLD+15) 
		{
			go_forward;   // 直進
			nOnline=0;
		} else if (SENSOR_2 < THRESHOLD+19) 
		{
			turn_left0;  // 左折
			nOnline=0;
		} else 
		{
			turn_left1;  // 左旋回
			nOnline=0;
		}
		Wait(STEP);
	}
		
	Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(100);	//ゴール前の線で小休止

ゴールにボールをシュートするための操作を行う。

進行方向を修正し

	OnRev(OUT_AC);Wait(50);
	OnFwd(OUT_C);OnRev(OUT_A);Wait(30);
	Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(50);
	
アームを開き

	OnRev(OUT_B);Wait(25);Off(OUT_B);

押し出すようにしてボールをシュート

	go_b;

	OnFwd(OUT_B);Wait(25);Off(OUT_B);	//アームを閉じる
	PlaySound(SOUND_DOWN);	//終了確認音
 }

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