課題説明

ロボットが光センサーを利用して黒い線で書かれたコース上を走り途中でボールを掴みゴールにシュートする。なおPQの交差点では2秒間停止する。

ルート説明

Pimage1.jpg

今回私のロボットはC→Aのルートを進む。コースの説明としてはこのルートには4つのポイントがある。図に示したように,竜泙淵ーブをしっかりと曲がりきること■冀賄世僚住路をしっかりと止まり直進し、ボールをつかむこと。P地点でのT字路を交差点として判断し止まり、右に曲がること。そして最後にい濃っているボールをゴールにシュートすることである。この4つをプログラムを作る際の軸とした。

ロボット説明

車体

image1.jpeg

私たちの班が使うロボットは前後のタイヤの幅をなるべく短くし、アームを動かすモーターを上側に取り付けることで車体の全長などをなるべく小さくした。これによりこのロボットは小回りが利くようになり、急なカーブにも対応できるようになった。

光センサー

image3P.jpg

車体からあまり離れたところ取り付けると、旋回の中心からの半径が大きすぎて判定がうまくいかなくなる危険性があるため、光センサーはなるべく車体の中心に近いところに配置した。これにより右や左に曲がった時などにセンサーが大きくぶれてしまうことを防いでいる。また、センサーの先端を地面に近づけることにより、センサーが読み取る値が安定した。

アーム

image2 P.jpg

アームについては。今回車体の小ささを最優先にロボットを作ったためアームの可動域が若干小さくなってしまった。そのためボールが取りにくくなってしまった。しかし、上下にアームが2つついているためボールを保持しているときの安定感は向上した。これによって1度つかんでしまえば後は安心して走行ができる。シュート方法はアームを開き、車を前進させてピンポン玉を押し出す形でシュートする。

プログラム説明

#define RIGHT_H OnFwd(OUT_A); OnRev(OUT_C);//右旋回
#define RIGHT_L OnFwd(OUT_A); Off(OUT_C);//右回転
#define LEFT_H OnFwd(OUT_C); OnRev(OUT_A);//左旋回
#define LEFT_L OnFwd(OUT_C); Off(OUT_A);//左回転
#define GO OnFwd(OUT_AC);//前進 
#define THRESHOLD 44//しきい値
#define P SetPower(OUT_AC,1);//パワーを1に設定する

THRESHOLDは光センサーの値で光センサーの中心値を44に設定する。タイヤのパワーが強い(速い)とガタガタと暴れてしまうのでパワー(速度)を1(弱く遅い)に設定する。

sub line_trace(){
	if(SENSOR_1 < THRESHOLD - 5){
	P;RIGHT_H;
	}else if(SENSOR_1 < THRESHOLD -2){
	P;RIGHT_L;
	}                                  //ここまで黒判定
    else{                              //ここから白判定のelse
	if(SENSOR_1 < THRESHOLD +2){
	P;LEFT_L;
	}else{
	P;LEFT_H;
	}ClearTimer(0);                 //ClearTime(0)は白判定のelseの中にしかないため黒の判定の時はタイマーはリセットされない         
    }Wait(1);                          //白判定のelseのラスト
}  

私のライントレースは光センサーの値によって右旋回、右回転、左回転、左旋回をするよう4段階で設定した。直進を入れるとコースアウト率が上がってしまった為使わないことにした。光センサーが黒判定の時はタイマー0をリセットせず、白判定が出たときのみタイマー0をリセットするようにした。こうすることにより何秒間黒判定が続いたかがわかるようになる。私のコースでは右回りのカーブが多いため、同じ色が何秒間続いたかでプログラムを組むとカーブなどで白が続く時間が長い部分がありややこしいためそれを防ぐために黒のみを数えるプログラムにした。今回基本的なライントレースはこれで行う。

sub shoot(){
       OnRev(OUT_B);Wait(30);Off(OUT_B);
       GO;Wait(50);
	OnRev(OUT_AC);Wait(50);
	Off(OUT_AC);
}

ボールをゴールにシュートするプログラム。アームを開いてボールを押し出してシュートする。

task main()
{
	SetSensor(SENSOR_1,SENSOR_LIGHT);
	ClearTimer(0);//ライントレースの交差点判定用のタイマー
	ClearTimer(1);//CからQの間にある急なカーブを曲がるときに使うタイマー

タイマーを2つセットする。タイマー0は交差点判定に、タイマー1は最初の急カーブを曲がるために使う。

while(FastTimer(1) < 1000){   //CQ間のカーブ
	if(SENSOR_1<THRESHOLD -1){
       P;RIGHT_H;            //右回転を消し、右旋回のみとする
	}else if(SENSOR_1<THRESHOLD +5){
	P;LEFT_L;
	}else{
	P;LEFT_H;
	}ClearTimer(0);
} 

最初のCQ間での急カーブ,榔Σ鹽召任篭覆り切れずコースアウトしてしまうので、右回転を消し右旋回のみとしたプログラムを別で用意した。しかし、右回転を消すことによって車が右旋回と左旋回を繰り返しあまり進まなくなるため、左回転のセンサーの値の範囲を少し大きくすることによりスピードを改善した。そして,離ーブを突破するのに約10秒かかることが分かったので、タイマー1を使い、初めの10秒間だけ特殊なライントレースをするようにした。

while(FastTimer(0) < 31){ //CQ間
	line_trace();
}

CQ間でのライントレース。タイマー0を使い、黒が一定時間以上続くまでは普通のライントレースを続けるようにwhile文でくくった。そして黒が一定の時間以上続くと1つ目の交差点(十字路)だと判断し以下に続く。

	PlayTone(440,10);//交差点判定がわかるように音を鳴らす
	Off(OUT_AC);Wait(200);//ルールに従い2秒停止
	OnFwd(OUT_B);Wait(50);Off(OUT_B);//前方にあるボールを掴む
	GO;Wait(25);Off(OUT_AC);
	ClearTimer(0);

2秒間停止し、ボールを掴む。Bはアームを動かすチャンネルである。

while(FastTimer(0) < 30){    //PQ間
	line_trace();
}

QP間のライントレースを始め、また黒の秒数を測る。黒が0.3秒続くとPだと判断する。

	PlayTone(220,10);
	Off(OUT_AC);Wait(200);//ルールでPで2秒間停止する。
	RIGHT_H;Wait(50);//右折する
	GO;Wait(20);
	ClearTimer(0);

P地点のT字路と判断したら2秒間止まる。その後右に曲がりライントレースを再開する。

while(FastTimer(0) < 32){  //PA間
	line_trace();
}

PA間のライントレースを行う。黒の秒数を測り、黒が0.32秒続くとAのT字路と判断する。

	PlayTone(880,10);//音を鳴らして交差点判定がでると音が鳴るようにする。
	Off(OUT_AC);Wait(200);
	LEFT_H;Wait(15);//斜めになっている車体をゴールに垂直にする。
	Off(OUT_AC);
	shoot();//シュートを打つ

}

T字路と判断したらシュートをうつ。

反省

悪かった点

カーブを曲がるときにロボットがあまりなめらかに動かなかった。シュートの方法がゴールにロボットごと突っ込むという形になってしまった。後はロボのアームの部分がもう少し開けばボールが取りやすくなったように思う。スピードがゆっくりでないとコースが安定しなかった。

よかった点、頑張った点

タイヤの回転ををうまく使い分け急なカーブも曲がりきることができた。タイマーを使い、しっかりと交差点を判断させることができ、最後の方は安定したライントレースをすることができた。光のしきい値の調整と交差点の判定にかける時間を見極めるのに時間がかかった。


添付ファイル: fileimage3P.jpg 94件 [詳細] filePimage1.jpg 105件 [詳細] fileimage3 P.jpg 56件 [詳細] fileimage2 P.jpg 98件 [詳細] fileimage1.jpeg 138件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-08-15 (土) 15:13:54