#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地点への二つ目の経路をやった。 #ref(Bebo.png) *ロボットの説明 [#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という定義を書き、これは交差点を認識した時にする動作である。 認識したら、停止し、音を鳴らして、そして一秒を待つという定義。 **ライントレースの定義 [#e1d075d7] ロボットの動きは上のような定義で、ロボットは黒い線の右に沿って動く。そして交差点だと判断させるため、FastTimerを使った。 sub line_follow() //黒い線に沿って、ラインをトレースして動く定義 { ClearTimer(0); //タイマーリセット while(FastTimer(0) <25){ // 一定の時間がたったらループをする while(FastTimer(0) <25){ // 黒と中間の間には0.25秒で右を曲がり続いた時、交差点を判断する if(SENSOR_2 < 45){ // 黒くなった時右旋回 turn_right2; } else{ if(SENSOR_2 < 48){ // 少し黒くなった時右折 turn_right; }else if(SENSOR_2 < 53){ // 黒と白の間、直進 Go; }else if(SENSOR_2 < 56){ // 少し白くなったら左折 turn_left; }else{ turn_left2; // 白くなった時左旋回 } ClearTimer(0); } } } **サブルーチンの定義 [#vc4ac98a] ミッションを完成するためにロボットは交差点を認識した後、 二つの動きが必要になっていた。 その動きは右折と直進だったので、以下のようにサブルーチンの定義を使い、その動きを書いた sub migi() //右折 { turn_right2; //右旋回 Wait(15); } ロボットは黒い線の右側にそって動ぎ、交差点を認識したら右を曲がったままに停止をする。 #ref(Blue.jpg) そしてロボットを直進させるため、上の写真に書いてあるように少しまず左旋回して、そして次に直進 sub mae() //直進という定義 { turn_left2; //左旋回 Wait(25); Go; //直進 Wait(20); } *メインプログラム [#jb2487a4] 以上書いて来た定義を使い、メインプログラムを書いた。 task main() { SetSensor(SENSOR_2,SENSOR_LIGHT); Go; //コースのB地点のところから黒い線まで直進 Wait(70); line_follow(); //黒い線に入ってからR地点までのライントレース intersection; //R地点の交差点だと判断した後の動作 migi(); //右折する line_follow(); //R地点からQ地点までのライントレース intersection; //Q地点の交差点だと判断した後の動作 mae(); //直進する line_follow(); //Q地点からカーブしてまたQ地点までのライントレース intersection; //Q地点の交差点だと判断した後の動作 mae(); //直進する line_follow(); //Q地点からP地点までのライントレース intersection; //P地点の交差点だと判断した後の動作 migi(); //右折する line_follow(); //P地点からS地点までのライントレース intersection; //S地点の交差点だと判断した後の動作 migi(); //右折する line_follow(); //S地点からC地点までのライントレース intersection; //C地点の交差点だと判断した後の動作 mae(); //直進する Go; //C地点の中に入る動作 Wait(100); Stop; } 最初のGoとWaitは図のB地点にロボットが止まっている時、直進し、黒い線に入るまでの定義である。 そして、コースの最後にC地点のところに入るため、またGo,Wait、Stopの定義を使った。 *まとめ・感想 [#u0c6d8d2] #ref(A9.jpg) 59.55秒で二つ目のコースのゴールまでロボットを動かした。 明るさと暗さを測るのが大変で、センサーの位置を変えることでロボットの動きがずいぶん変わることに驚いた。 しかし、チームワークで少し楽になっていて、コースの最後までロボットを進めさせてよかった。これから次の課題に向かって頑張っていきたいと思います。