[[2009a/A1/課題1左]]~ 目次 #CONTENTS *ライントレースロボットを作ろう [#re055184] 条件は下の3つのどれかを満たせて線の上を走るロボット 1交差点上に牛乳パックを置き、それを迂回する。 2パックを動かして元の位置に戻す。 3パックを次の交差点まで運ぶ。 *コース [#u389bbc8] コースはデザイン重視で作ったため交差同士の距離が近かったり、コースの感覚が近かったりと難易度があがってしまいました。コースとしての面白みは無い気もするけど後戻りができないのでコレに決定! &ref(course.jpg); *ロボット [#gd075396] 本体やタイヤなどの基本パーツは教科書通りの物を使用。 タッチセンサーの部分は重さと力のモーメントを利用するために、上から長めになるように作成。下の突起物二つはパックを中心で捉えられるように設置。 パックを動かす部分の棒の先端にタイヤを装着。 *プログラミング [#yfaa5aeb] 迂回バージョン #define turnR OnFwd(c);OnRev(a);Wait(105);Off(a+c); :右に90度方向転換 #define turnL OnFwd(a);OnRev(c);Wait(83);Off(a+c); :左に90度方向転換 #define a OUT_A #define c OUT_C #define THRESHOLD 45 :明るさが45以下の時に反応 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_TOUCH); SetSensor(SENSOR_3,SENSOR_LIGHT); int x; x=0; while(true) {if(SENSOR_2==1) ;タッチセンサーが反応した時にパックを迂回 {OnRev(a+c);Wait(10); turnL; OnFwd(a+c);Wait(120); turnR; OnFwd(a+c);Wait(250); OnFwd(c);OnRev(a);Wait(120);Off(a+c);; OnFwd(a+c);Wait(150); Off(a+c) ;} if (SENSOR_1>THRESHOLD){ 左右の光センサーが白を探知しているときに前進 if (SENSOR_3>THRESHOLD){ OnFwd(a+c);} else{ :左の光センサーが白、右のセンサーが黒を探知したときに少し右に回転 OnFwd(a); Wait(5); Off(a);OnRev(c);Wait(1);Off(c);}} else{ if(SENSOR_3>THRESHOLD){OnFwd(c);Wait(5);Off(c);OnRev(a);Wait(1);Off(a);} :左センサーが黒、右のセンサー が白を探知したときに少し左に回転 else{OnFwd(a+c);Wait(10);Off(a+c);x = x + 1;}} :左右のセンサーが黒を探知したときに少しすすんでカウント数を1プラス if(x == 6) :カウントが6回(コースを1週)になった時に停止 break;}} パックをその場で動かして元の位置に戻して進むバージョン #define a OUT_A #define c OUT_C #define THRESHOLD 45 :明るさが45以下の時に反応 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_TOUCH); SetSensor(SENSOR_3,SENSOR_LIGHT); int x; x=0; :カウンター while(true){ if(SENSOR_2==1){ :タッチセンサーが反応したとき OnFwd(a+c);Wait(120);Off(a+c); :回転したときパックが元の位置に戻るように前進 OnFwd(c);OnRev(a);Wait(200);Off(a+c); :180°回転 OnFwd(a);OnRev(c);Wait(100);Off(a+c);} :元の向きに回転 if (SENSOR_1>THRESHOLD){ :左が白のとき if (SENSOR_3>THRESHOLD){ :両方白のとき OnFwd(a+c);} else{ :右が黒のとき、右に曲がる OnFwd(a); Wait(7); Off(a); OnRev(c); Wait(1); Off(c); } } else{ :左が黒のとき if(SENSOR_3>THRESHOLD){ :右が白のとき、左に曲がる OnFwd(c); Wait(7); Off(c); OnRev(a); Wait(1); Off(a); } else{ :交差点の上 OnFwd(a+c); Wait(10); Off(a+c); x = x + 1; :交差点ごとにカウント } } if(x == 6)break; :カウントが一周分すると終了 } }*まとめ [#e4cbe133] **コメントください* [#s30b4e80] コメント欄がなかったので直接書き込みます。ifでセンサーの反応を判別しているところを、センサーが白か黒か(もしくは触っていないか触っているか)について、「無反応なら0を、反応なら1を返す関数」にしてみると、もっとスリム化できるかもしれません。(こさか)