目次
#contents

*課題 [#k162736e]
*機体の改善 [#l7402192]
*プログラム [#ve886027]
*反省 [#qf6ba764]
*課題 [#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;//変数を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秒という好記録を出した。プログラムも前回の反省を活かしてスマートにすることができた。特に、サブルーチンを活用できたと思う。交差点もきちんと認識できていた。
-反省点としては、線の右側をトレースすることで円の内側を走ることとなり、誤作動が時々起こってしまったことが挙げられる。しかし、部品を取り替えてスムーズに動くようにしたので、誤作動の回数はとても少なくなった。今回は悪いところを改良していくことができ、その結果好タイムを出せたのではないかと考えている。


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