*目次 [#cdeb80d5] #contents *課題 [#e2ed52bc] risを使い光センサーによりライントレースを行う。 コースは模造紙にマジックペンで以下のように描いて作る。 &ref(2016a-mission2.png); 私がロボットを走らせるコースは A地点からB地点へ A地点 → P直進 → Q直進 → Q直進 → R左折 → B地点 である *本体について [#x624b260] &ref(attachment00(3).jpg); 課題1のときから大きく構造は変えていないがいくつか工夫はした。まずはタイヤである。2つ取り外し、スムーズに移動できるようになった。 &ref(attachment01(2).jpg); ふたつ目は光センサーの取り付け位置である。遠すぎると、少しの小回りで大きく動いてしまうため誤動作が多かった。そのため最初はなるべく本体に近づけて固定しようと工夫した。課題1のときはあったでっぱりを取り外しそこにセンサーを取り付けた。すると誤動作は少なくなったが今度は微調整が増え、なかなか進まなくなった、そこで「多少は離さないとセンサーが動かなすぎて進んでいかない」という先生の助言に従い適度に本体から離してみたところ、大幅にスピードアップできた。 *プログラミング [#n4da8cb7] **定義 [#w84e84e0] 初めに以下の定義をした #define turn_left Off(OUT_A); OnFwd(OUT_C);//左折 #define turn_leftS OnRev(OUT_A); OnFwd(OUT_C); //左旋回 #define turn_right OnFwd(OUT_A); Off(OUT_C);//右折 #define turn_rightS OnFwd(OUT_A); OnRev(OUT_C);//右旋回 #define go_forward OnFwd(OUT_AC);//直進 **サブルーチン [#ed4b7539] メインのタスクを簡単にするためにいくつかサブルーチンを作った ***ラインを辿るために [#c1b860ce] 私たちの班は、黒線と白い部分の境目をトレースするという方法をとった。 境目の明るさを測り。それよりも明るくなったら黒線の方へ、暗くなったら白い方へ微調整し、進んで行く。 これがそのサブルーチンである sub line_follow() { ClearTimer(0); // まずはタイマーをリセットする(理由は後述) while(FastTimer(0)<25)//whileのカッコで囲まれた動作は { //タイマーが一定の時間を超えるまで行われる if(SENSOR_2<45){//もし、センサーがラインの境目よりはるかに暗いと判断した時 turn_leftS;// 左旋回→これが交差点判別に使われる(後述) } else if(SENSOR_2<47){//もし、センサーがラインの境目より少し暗いと判断した時 turn_left;// 左折 ClearTimer(0);//タイマーをリセットする } else if(SENSOR_2<54){//もし、センサーがラインの境目の明るさだと判断した時 go_forward; //直進 ClearTimer(0);//タイマーをリセットする } else if(SENSOR_2<57){//もし、センサーがラインの境目より少し明るいと判断した時 turn_right; //右折 ClearTimer(0);//タイマーをリセットする } else { //もし、センサーがラインの境目よりかなり明るいと判断した時 turn_rightS; //右旋回 ClearTimer(0);// } } Off(OUT_AC);//whileの範囲を超えたら電源が落ちる } ラインの左側をトレースしたため暗くなったら左折、明るくなったら右折をすればよい。 どこからが明るく、どこからが暗いのか具体的な値を決めるために、試行錯誤を繰り返した。 ***交差点を認識するために [#xf892129] 私達の班では、交差点では比較的長く左折してもセンサーが明るく反応しなくなると考えた そこでタイマーを用い、一定時間左旋回(交差点はかなり暗いため)をしたら交差点と認識するようにプログラミングした、そのため上のサブルーチンを見れば分かる通り、左旋回以外の動作をしたあとにはタイマーをリセットしている。左旋回が連続して長く続くとタイマーの数字が増え、一定の値を超えたら停止するようにした。 ***交差点を超える [#b97abbf4] 交差点上ではライントレースができないそのため以下のサブルーチンを作った sub go_forwardS()//交差点を直進 { turn_rightS;//右旋回(僅かに左に傾いているため) Wait(10); go_forward;//直進 Wait(30); } sub turn_leftSS()//交差点を左折 { while(SENSOR_2<47)//明るくなるまで左折 { turn_leftS; } } **task main [#w6b00b69] いよいよメインの動作についてだ task main() { SetSensor(SENSOR_2, SENSOR_LIGHT);//光センサーをセット line_follow(); //AP間のラインを辿る PlaySound(SOUND_LOW_BEEP); //交差点を認識したらサウンドを鳴らす Wait(100); //交差点では一秒停止 PlaySound(SOUND_CLICK); //出発前にもう一回サウンドを鳴らす go_forwardS(); //交差点を直進 line_follow(); //PQ間のラインを辿る PlaySound(SOUND_LOW_BEEP); //交差点を認識したらサウンドを鳴らす Wait(100); //交差点では一秒停止 PlaySound(SOUND_CLICK); //出発前にもう一回サウンドを鳴らす go_forwardS(); //交差点を直進 line_follow(); //QQ間のラインを辿る PlaySound(SOUND_LOW_BEEP); //交差点を認識したらサウンドを鳴らす Wait(100); //交差点では一秒停止 PlaySound(SOUND_CLICK); //出発前にもう一回サウンドを鳴らす go_forwardS(); //交差点を直進 line_follow(); //QR間のラインを辿る PlaySound(SOUND_LOW_BEEP); //交差点を認識したらサウンドを鳴らす Wait(100); //交差点では一秒停止 PlaySound(SOUND_CLICK); //出発前にもう一回サウンドを鳴らす turn_leftSS(); //交差点を左折 line_follow(); //RB間のラインを辿る go_forward; //最後の枠を超える Wait(100); Off(OUT_AC); //停止 PlaySound(SOUND_UP) ; //クリア時のサウンド。所要時間41秒 } サブルーチンのおかげでかなり簡略化されている。が、サウンド→停止→サウンドがセットの動作になっているので、これも交差点での動作としてサブルーチンを作れば更にtask mainを短くできたのではないかと今更思った。 *まとめ [#k2c8a417] きちんとゴールまでたどり着くことができた。 センサーの位置でスピードが劇的に変わったので驚いた。 ただしまれに誤動作をおこし、ゴールにたどりつけないこともあった。10回に1回程度なのでなかなk原因を探れず改善に至れなかったのが心残りだ。そして課題1のときと同じくロボットの脆さも問題だ。 しかし課題1のときよりも楽しんで取り組めたと思う。