[[2016a/Member]] 目次 #contents *ロボット本体の説明 [#mfcb7c3b] 今回はドライブベースの黒ブロックを短くして前の出っ張りをなくすことで、光センサを取り付けやすくした。~ 先生のアドバイスを参考に、タイヤを減らして小回りが利くようにし、センサはブロックで固定することでぐらつかないようにした。~ 無駄な部分が減り、動きも軽くなった。 &ref(1049.jpg); 赤丸の部分を合わせることで光センサを取り付けた。ブロックで合わせているので、ぐらつかないように固定でき、光センサの取得する数値を安定させることができた。 &ref(1053.jpg); *プログラムの説明 [#cac8270b] **数値の定義 [#q454df81] 光センサの数値を確認し、白と黒の中間値を定義した。 #define MIDDLE 50 **マクロの定義 [#g474f343] ライントレースをするにあたって必要な動きを5つ定義した。SetPowerで出力パワーを下げることで、カーブでの誤動作が起きないようにした。 #define turn_left1 SetPower(OUT_AC,2); Off(OUT_A); OnFwd(OUT_C); //左曲がり #define turn_left2 SetPower(OUT_A,1); OnRev(OUT_A); OnFwd(OUT_C); //左旋回 #define turn_right1 SetPower(OUT_AC,2); OnFwd(OUT_A); Off(OUT_C); //右曲がり #define turn_right2 SetPower(OUT_C,1); OnFwd(OUT_A); OnRev(OUT_C); //右旋回 #define go_forward SetPower(OUT_AC,7); OnFwd(OUT_AC); //直進 **ライントレース [#k39e301f] ***一本道 [#w8fcfe51] ライントレースは、線の左側をなぞっていく方法にした。今いる場所の数値と中間値との差によって対応した動きをするようにした。~ 黒 → 左旋回~ 中間に近い黒 → 左曲がり~ 中間 → 直進~ 中間に近い白 → 右曲がり~ 白 → 右旋回~ ***交差点の判別 [#c87808dd] 交差点では機体は線の左に沿って進んでいるので、左に曲がろうとして左旋回を始める。この左旋回が一定時間続けて行われた場合、交差点だと判断するようにした。 これを実現するためにFastTimerを使い、左旋回の場合はカウントしていき、それ以外の動作の場合はリセットするようにした。FastTimerが一定の数値を超えた場合ループから抜け、ライントレースを止めるようにした。 sub trace() //黒線に沿って移動 { while(FastTimer(0) < 25) //左旋回が一定時間続くまでループ { if(SENSOR_2 < MIDDLE-5) //黒 { turn_left2; //左旋回 } else { if(SENSOR_2 < MIDDLE-2) //中間に近い黒 { turn_left1; //左曲がり } else if(SENSOR_2 < MIDDLE+3) //中間 { go_forward; //直進 } else if(SENSOR_2 < MIDDLE+6) //中間に近い白 { turn_right1; //右曲がり } else //白 { turn_right2; //右旋回 } ClearTimer(0); } } } **交差点での動作 [#ye8be076] 交差点と判断した場合、動作を停止し、音を鳴らし、1秒待機するようにした。 sub intersection() //交差点確認 { Off(OUT_AC); PlaySound(SOUND_UP); Wait(100); } 交差点からの移動は3種類あり、それぞれ旋回や前進を使い、行先の線まで移動するようにした。~ しかし、この方法だと電池の残量の影響で数値を変えなければならない可能性があり、あまりよくない。 sub i_forward() //直進 { turn_right2; Wait(25); go_forward; Wait(50); Off(OUT_AC); } sub i_left() //左折 { turn_left2; Wait(30); Off(OUT_AC); } sub i_right() //右折 { turn_right2; Wait(25); go_forward; Wait(30); turn_right2; Wait(80); Off(OUT_AC); } **メインプログラム [#u5adecb3] 変数cで交差点を数え、switch文で対応した動作をするようにした。~ 線の中からスタートするということを考えていなかったので、最初と最後に前進する動作を付け足した。~ A地点の線まできたら交差点と認識するので、中に入るための方向調整のためにi_forwardを使った。 A地点の線まできたら交差点と認識するので、中に入るための方向調整のために交差点を直進するサブルーチンのi_forwardを使った。 task main() { SetSensor(SENSOR_2, SENSOR_LIGHT); int c=1; //交差点のカウント go_forward; //黒い線まで直進 Wait(80); while(true) { ClearTimer(0); //タイマリセット trace(); intersection(); switch(c) { case 1: //1番目の交差点 i_left(); break; case 2: //2番目の交差点 同様に続く i_left(); break; case 3: i_forward(); break; case 4: i_forward(); break; case 5: i_right(); break; case 6: i_left(); break; case 7: //A地点への方向調整 i_forward(); break; } c++; if(c > 7) { break; } } go_forward; //A地点の中まで直進 Wait(70); Off(OUT_AC); //停止 } *結果 [#z8723a8c] 私は、C地点からA地点へ移動する~ C地点 → S左折 → P左折 → Q直進 → Q直進 → R右折 → P左折 → A地点~ のコースです。 タイムは57秒でした。 *感想・考察 [#f4d4589a] 今回は、前回よりもロボットの制作が早く終わり、プログラムに時間をかけることができた。~ 交差点での動きをもう少しきれいにしたかった。~ 1分を切るタイムを出すことができてよかった。~ 最初から最後までほぼ確実に到達することができ、安定したプログラムにすることができてよかった。~ これ以上タイムを縮めるには、直線はほぼ完璧に進むことができるので、カーブや交差点の動きを大幅な改善ができない限り難しいと思った。