- 追加された行はこの色です。
- 削除された行はこの色です。
#contents
*課題の説明 [#g820ba95]
今回は以下の図のようにな図を作り、経路を黒い線にそって動くロボットを作成するという課題だった。
#ref(99AA.jpg)
そして、下に述べているように三つの経路がある。
A地点からB地点へ (一人目)
A地点 → P直進 → Q直進 → Q直進 → R左折 → B地点
B地点からC地点へ (二人目)
B地点 → R右折 → Q直進 → Q直進 →P右折 → S右折 → C地点
C地点からA地点へ (三人目)
C地点 → S左折 → P左折 → Q直進 → Q直進 → R右折 → P左折 → A地点
私はB地点からC地点への二つ目の経路をやった。
*ロボットの説明 [#q1613c2a]
光センサーで経路の黒い線と白いところをより読みやすくするため、本体の中にあるものを変更した。このようなことをしてからよりよい位置に光センサーをつけたという工夫をした。
光センサーで経路の黒い線と白いところをより読みやすくするため、本体の中にあるものを変更した。
このようなことをしてからよりよい位置に光センサーをつけたという工夫をした。
以下の写真のようにして、光センサーを本体に付け加えた
#ref(ALDOBBA.jpg)
#ref(A99.jpg)
*プログラムの説明 [#d10bc423]
**マクロの定義 [#o5b772b5]
#define turn_right OnFwd(OUT_A);SetPower(OUT_AC,1);Off(OUT_C) // 右曲がり
#define turn_left OnFwd(OUT_C);SetPower(OUT_AC,1);Off(OUT_A) // 左曲がり
#define Go OnFwd(OUT_AC) // 直進
#define turn_right2 OnFwd(OUT_A);OnRev(OUT_C);SetPower(OUT_AC,1) // 右旋回
#define turn_left2 OnFwd(OUT_C);OnRev(OUT_A);SetPower(OUT_AC,1) // 左旋回
#define intersection Off(OUT_AC);PlaySound(SOUND_FAST_UP);Wait(100); // 交差点
#define Stop Off(OUT_AC); // 停止
左に曲がる時と右に曲がる時、Setpowerをつかい、スピードを減少したことでカーブでの曲がりを改善した。
そしてintersectionという定義を書き、これは交差点を認識した時にする動作である。認識したら、停止し、音を鳴らして、そして一秒を待つという定義。
そしてintersectionという定義を書き、これは交差点を認識した時にする動作である。
認識したら、停止し、音を鳴らして、そして一秒を待つという定義。
**ライントレースの定義 [#e1d075d7]
ロボットの動きは上のような定義で、ロボットは黒い線の右に沿って動く。そして交差点だと判断させるため、FastTimerを使った。
sub line_follow()
{
ClearTimer(0);
while(FastTimer(0) <25){
if(SENSOR_2 < 45){
turn_right2;
while(FastTimer(0) <25){ // 一定の時間がたったらループをする
if(SENSOR_2 < 45){ // 暗くなった時右旋回
turn_right2;
} else{
if(SENSOR_2 < 48){
if(SENSOR_2 < 48){ // 少し暗くなった時右折
turn_right;
}else if(SENSOR_2 < 53){
}else if(SENSOR_2 < 53){ // ちょうどよい明るさだと判断したら直進
Go;
}else if(SENSOR_2 < 56){
}else if(SENSOR_2 < 56){ // 少し明るくなったら左折
turn_left;
}else{
turn_left2;
turn_left2; // 明るくなったら左旋回
}
ClearTimer(0);
}
}
}
**サブルーチンの定義 [#vc4ac98a]
ミッションを完成するためにロボットは交差点を認識した後、 二つの動きが必要になっていた。その動きは右折と直進だったので、以下のようにサブルーチンの定義を使い、その動きを書いた
ミッションを完成するためにロボットは交差点を認識した後、 二つの動きが必要になっていた。
その動きは右折と直進だったので、以下のようにサブルーチンの定義を使い、その動きを書いた
sub migi()
{
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(15);
}
ロボットは黒い線の右側にそって動ぎ、交差点を認識したら右を曲がったままに停止をする。そしてロボットを直進させるため、少し左旋回した上で前に進む。
ロボットは黒い線の右側にそって動ぎ、交差点を認識したら右を曲がったままに停止をする。
そしてロボットを直進させるため、少し左旋回した上で前に進む。
sub mae()
{
turn_left2;
Wait(25);
Go;
Wait(20);
}
*メインプログラム [#jb2487a4]
以上書いて来た定義を使い、メインプログラムを書いた。
task main()
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
Go;
Wait(70);
line_follow();
intersection;
migi();
line_follow();
intersection;
mae();
line_follow();
intersection;
mae();
line_follow();
intersection;
migi();
line_follow();
intersection;
migi();
line_follow();
intersection;
mae();
Go;
Wait(100);
Stop;
}
最初のGoとWaitは図のBのところにロボットが止まっている時、直進し、黒い線に入るまでの定義である。そして、コースの最後にCのところに入るのに、またGo,Wait、Stopの定義を使った。
最初のGoとWaitは図のBのところにロボットが止まっている時、直進し、黒い線に入るまでの定義である。
そして、コースの最後にCのところに入るのに、またGo,Wait、Stopの定義を使った。
*まとめ・感想 [#u0c6d8d2]
59.55秒で二つ目のコースのゴールまでロボットを動かした。
明るさと暗さを測るのが大変で、センサーの位置を変えることでロボットの動きがずいぶん変わることに驚いた。
しかし、チームワークで少し楽になっていて、コースの最後までロボットを進めさせてよかった。これから次の課題に向かって頑張っていきたいと思います。