- 追加された行はこの色です。
- 削除された行はこの色です。
目次
#contents
*課題 [#b27324db]
下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。&br;
&ref(2016a-mission2.png);
**ミッション [#n6a0c1b2]
次の経路を黒い線にそって動くロボットを作成する。ただし、なるべく速く正確に動くロボットになるように工夫して、交差点では1秒間停止すること。&br;
-B地点からC地点へ&br;
B地点→R右折→Q直進→Q直進→P右折→S右折→C地点
*機体の改善 [#u6aa30d7]
&ref(機体表.jpg);&ref(機体裏.jpg);&br;
前回の機体は大きなタイヤと小さなタイヤを2つずつ付けていたが、このままでは小回りがきかないと考えた。そこで、大きいタイヤを外し、機体の底に回転する半球状のパーツを付けることによって動きやすくすることができた。
*プログラム [#afa02d29]
**機体の動かし方について [#i78f359c]
今回は、線の境界を辿って進むようにプログラミングした。下図のように機体が線の右側をトレースする。&ref(トレース方法.png);
**プログラムの内容について [#vf194f31]
まず定義を述べる。
#define ONLINE 29//センサーが黒線上にある時間
#define THRESHOLD 45//白黒中間の値
#define HIPOWER 6
#define LOWPOWER 1
#define set_power_H SetPower(OUT_AC,HIPOWER);//AとCのモーターを早めに動かす
#define set_power_L SetPower(OUT_AC,LOWPOWER);//AとCのモーターを遅めに動かす
#define turn_left1 set_power_L;OnFwd(OUT_C); OnRev(OUT_A);//左旋回
#define turn_left2 set_power_L;OnFwd(OUT_C); Off(OUT_A);//左回転
#define turn_right2 set_power_L;OnFwd(OUT_A); Off(OUT_C);//右回転
#define turn_right1 set_power_L;OnFwd(OUT_A); OnRev(OUT_C);//右旋回
#define go_forward set_power_H; OnFwd(OUT_AC);//直進
次にサブルーチンを定める。
sub line_follow()//ライントレースするサブルーチン
{
SetSensor(SENSOR_2, SENSOR_LIGHT);//光センサーを用いる
ClearTimer(0);//タイマーを用いる
int ch=0;//変数を宣言する
while(ch==0){ //変数が0の間実行する
if(SENSOR_2 < THRESHOLD-7) {
turn_right1; //センサーが黒線上にいたら右旋回する
} else if (SENSOR_2 < THRESHOLD-5) {
ClearTimer(0);
turn_right2; //センサーが黒に寄った境界上にいたらタイマーをリセットして右回転する
} else if (SENSOR_2 < THRESHOLD+4) {
ClearTimer(0);
go_forward; //センサーが境界上にいたらタイマーをリセットして直進する
} else if (SENSOR_2 < THRESHOLD+6) {
ClearTimer(0);
turn_left2; //センサーが白に寄った境界上にいたらタイマーをリセットして左回転する
} else {
ClearTimer(0);
turn_left1; //センサーが白紙上にいたらタイマーをリセットして左旋回する
}
if(FastTimer(0) > ONLINE) { //もしタイマーのカウントが0.29秒を超えたら(交差点と判断したら)実行する
Off(OUT_AC);
PlaySound(SOUND_DOUBLE_BEEP);//音を鳴らす
Wait(100);//一秒間停止
ClearTimer(0);//タイマーをリセットする
ch=1;
ch=1;//変数を1にする
}
Wait(1);
}
}
交差点を認識した時に変数を1にすることでwhile(ch==0)から抜け出し、次の動作へ移る。
その時の動作は以下のサブルーチン2つである。
sub cross_turn()//右折するサブルーチン
{
OnFwd(OUT_A);OnRev(OUT_C);
Wait(60);
Off(OUT_AC);
}
sub cross_forward()//直進するサブルーチン
{
OnFwd(OUT_AC);Wait(70);OnFwd(OUT_C);Wait(20);
Off(OUT_AC);
}
最後にタスクを示す。
task main()
{
line_follow();
cross_turn();//1つ目の交差点
line_follow();
cross_forward();//2つ目の交差点
line_follow();
cross_forward();//3つ目の交差点
line_follow();
cross_turn();//4つ目の交差点
line_follow();
cross_turn();//5つ目の交差点
line_follow();
OnFwd(OUT_C);
OnRev(OUT_A);//旋回して機体の向きを調整する
Wait(25);
Off(OUT_AC);
OnFwd(OUT_AC);//前進して機体の位置を調整する
Wait(250);
Off(OUT_AC);
}
*結果と反省[#ze7132c3]
-ライントレースは意外と上手く動き、BからCまで行くのに53.4秒という好記録を出した。プログラムも前回の反省を活かしてスマートにすることができた。特に、サブルーチンを活用できたと思う。交差点もきちんと認識できていた。
-反省点としては、線の右側をトレースすることで円の内側を走ることとなり、誤作動が時々起こってしまったことが挙げられる。しかし、部品を取り替えてスムーズに動くようにしたので、誤作動の回数はとても少なくなった。今回は悪いところを改良していくことができ、その結果好タイムを出せたのではないかと考えている。