2006a/MemberOnly/進行状況A
ライントレーサ†
ライントレーサプログラム†
制作 A4 たろう
#define S1 SENSOR_1 //センサ−1をS1と定義
#define S2 SENSOR_2 //センサ−2をS2と定義
#define S3 SENSOR_3 //センサ−3をS3と定義
#define C 43 //白と黒の境の値をCと定義
#define fwd OnFwd(OUT_A+OUT_C) //「前進」をfwdと定義
#define rev OnRev(OUT_A+OUT_C) //「後退」をrevと定義
task main(){ //メインループ
SetSensor(S1,SENSOR_LIGHT); ////
SetSensor(S2,SENSOR_TOUCH);//センサ1と3を光、2をタッチセンサと定義
SetSensor(S3,SENSOR_LIGHT); //////////////
int R,L,FS1,FS3; //変数を宣言
while(true){
if(S2==1){ //追いついたときの方向転換
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(90);
while(S3>=C){
OnFwd(OUT_A);
OnRev(OUT_C);
}
}
fwd; //前進
while(S1<=C && S3>=C){
L=1;
R=0;
} //直前の旋回方向「左」を保持する
while(S3<=C && S1>=C){
R=1;
L=0;
} //直前の旋回方向「右」を保持する
if(S1>=C && S3>=C){
if(L==1){ //もし機体が右に外れているのならば、
until(S1<=C){ //左センサが線に乗るまで
FS1=1;
Off(OUT_A); //左に回転する
}
while(FS1==1 && S1<=C){ //直前まで上のループに入っていたら、線がセンサの真ん中に入るまで
FS1=2;
Off(OUT_A); //さらに左に回転する
}
if(FS1==2){
FS1=0; //上の2つのループを経ていたら
L=0; //パラメータを初期化して終了
}
}
if(R==1){ //もし機体が左に外れているのならば、
until(S3<=C){ //右センサが線に乗るまで
FS3=1;
Off(OUT_C); //右に回転する
}
while(FS3==1 && S3<=C){ //直前まで上のループに入っていたら、線がセンサの真ん中に入るまで
FS3=2;
Off(OUT_C); //さらに右に回転する
}
if(FS3==2){
FS3=0; //上の2つのループを経ていたら
R=0; //パラメータを初期化して終了
}
}
}
}
}
苦労した点†
- 二つのセンサーの間隔と黒線の太さがあわなくてロボットが暴走してしまった
- センサの高さを、ちょうど良く白と黒を判別するように調整するのが難しかった
工夫した点†
- センサを二つ使い、両方とも黒線に乗るようにすることである程度の太さの変化なら対応できるようにした
- 随時ライントレースをするとうまく走らなかったので、黒線から完全にはみだすまで直進し、方向転換するようにした。
- フラグを立てて黒線が確実に中心にくるようにした。
反省、感想†
- センサの幅や、高さ、左右のモータの出力等をいろいろ試すことができた
- ライントレースのプログラムに気を取られすぎていて、追いついたときの追い抜き、方向転換のプログラムと装置が適当になってしまった
何かありましたら†
- 例えば『Cを43と定義』というコメントではなく、Cがどのような意味をもつ定数なのか、という説明(コメント)があればいいですね。 -- 松本(教員)