目次
この課題は、黒い線にそって動くロボットの作成である(課題2参照)。自分は、上図のようにE地点で右折するコースを走らせた。
本体は、作り方説明書に載っているシンプルなものに光センサを取り付けた簡単なものである。
急カーブを曲がれるようにするために光センサと本体の旋回軸をなるべく近づけた。そのために、本体の中心線から光センサがずれてしまった。
コース全体を7種類の部分に分け、それぞれの部分に対応するプログラムを作り組み合わせた。以下にそれぞれのプログラムを示す。
#define THRESHOLD 45 //閾値 #define SPEED_H 35 //直進時のモーター出力値 #define SPEED_L 25 //右左折時のモーター出力値 #define OnRL(speedR,speedL) OnFwd(OUT_B,speedR); OnFwd(OUT_C,speedL); #define go_forward OnRL(SPEED_H,SPEED_H); #define spin_l OnRL(SPEED_L,-SPEED_L); //左旋回 #define spin_r OnRL(-SPEED_L,SPEED_L); //右旋回 #define turn_l OnRL(SPEED_L,0); //左折 #define turn_r OnRL(0,SPEED_L); //右折 #define STEP 1 //1回の判断で動作させる時間 #define RE_TIME1 400 #define nMAX 200 //カーブとして許容できる繰り返しの最大値 #define break_s Off(OUT_BC); Wait(300); //小休止 #define break_m Off(OUT_BC); Wait(1000); //中休止 #define CROSS_TIME 500 //交差点通過にかかる時間 #define cross_line OnRL(SPEED_L,SPEED_L); Wait(CROSS_TIME); //交差点を渡る #define turn_r45 RotateMotor(OUT_C,30,70); //45度右折くらい? #define turn_r60 RotateMotor(OUT_BC,30,120); RotateMotor(OUT_C,30,110); //60度右折くらい? #define turn_r90 RotateMotor(OUT_BC,30,15); RotateMotor(OUT_C,30,150); //90度右折くらい? #define turn_l90 RotateMotor(OUT_B,30,260); //90度左折くらい? #define turn_l60 RotateMotor(OUT_BC,30,70); RotateMotor(OUT_B,25,300); //60度左折くらい? #define turn_l45 RotateMotor(OUT_BC,30,70); //45度左折くらい? #define go_last RotateMotor(OUT_BC,35,300); //最後の直進
sub part1() { SetSensorLight(S4); int n=0; while(n<nMAX) { if(SENSOR_4<THRESHOLD-10) { spin_r; n++; //カウンタを1増やす } else { if(SENSOR_4<THRESHOLD-5) { turn_r; } else if(SENSOR_4<THRESHOLD+5) { go_forward; } else if(SENSOR_4<THRESHOLD+10) { turn_l; } else { spin_l; } n=0; //カウンタをリセット } Wait(STEP); } PlaySound(SOUND_UP); //交差点発見 turn_r60; //右折 n=0; //カウンタをリセット }
sub part2() { SetSensorLight(S4); int n=0; while(n<nMAX) { if(SENSOR_4<THRESHOLD-10) { spin_l; n++; //カウンタを1増やす } else { if(SENSOR_4<THRESHOLD-5) { turn_l; } else if(SENSOR_4<THRESHOLD+5) { go_forward; } else if(SENSOR_4<THRESHOLD+10) { turn_r; } else { spin_r; } n=0; //カウンタをリセット } Wait(STEP); } break_s; //小休止 PlaySound(SOUND_DOWN); //交差点発見 break_m; //一時停止 turn_l90; //左折 n=0; //カウンタをリセット }
sub part3() { SetSensorLight(S4); int n=0; while(n<nMAX) { if(SENSOR_4<THRESHOLD-10) { spin_l; n++; //カウンタを1増やす } else { if(SENSOR_4<THRESHOLD-5) { turn_l; } else if(SENSOR_4<THRESHOLD+5) { go_forward; } else if(SENSOR_4<THRESHOLD+10) { turn_r; } else { spin_r; } n=0; //カウンタをリセット } Wait(STEP); } PlaySound(SOUND_UP); //交差点発見 spin_r; Wait(nMAX*STEP); //進行方向修正 cross_line; //横断 n=0; //カウンタをリセット }
sub part4() { SetSensorLight(S4); int n=0; while(n<nMAX) { if(SENSOR_4<THRESHOLD-10) { spin_l; n++; //カウンタを1増やす } else { if(SENSOR_4<THRESHOLD-5) { turn_l; } else if(SENSOR_4<THRESHOLD+5) { go_forward; } else if(SENSOR_4<THRESHOLD+10) { turn_r; } else { spin_r; } n=0; //カウンタをリセット } Wait(STEP); } PlaySound(SOUND_UP); //交差点発見 spin_r; Wait(RE_TIME1); //進行方向調整 turn_l45; //左折 n=0; //カウンタをリセット }
sub part5() { SetSensorLight(S4); int n=0; while(n<nMAX) { if(SENSOR_4<THRESHOLD-10) { spin_r; n++; //カウンタを1増やす } else { if(SENSOR_4<THRESHOLD-5) { turn_r; } else if(SENSOR_4<THRESHOLD+5) { go_forward; } else if(SENSOR_4<THRESHOLD+10) { turn_l; } else { spin_l; } n=0; //カウンタをリセット } Wait(STEP); } break_s; //小休止 PlaySound(SOUND_DOWN); //交差点発見 break_m; //一時停止 spin_l; Wait(nMAX*STEP); //進行方向修正 cross_line; //横断 n=0; //カウンタをリセット }
sub part6() { SetSensorLight(S4); int n=0; while(n<nMAX) { if(SENSOR_4<THRESHOLD-10) { spin_r; n++; //カウンタを1増やす } else { if(SENSOR_4<THRESHOLD-5) { turn_r; } else if(SENSOR_4<THRESHOLD+5) { go_forward; } else if(SENSOR_4<THRESHOLD+10) { turn_l; } else { spin_l; } n=0; //カウンタをリセット } Wait(STEP); } PlaySound(SOUND_UP); //交差点発見 turn_r90; //右折 n=0; //カウンタをリセット }
sub part7() //右側通行→Aの敷地内に停車(F→E→A) { SetSensorLight(S4); int n=0; while(n<nMAX) { if(SENSOR_4<THRESHOLD-10) { spin_r; n++; //カウンタを1増やす } else { if(SENSOR_4<THRESHOLD-5) { turn_r; } else if(SENSOR_4<THRESHOLD+5) { go_forward; } else if(SENSOR_4<THRESHOLD+10) { turn_l; } else { spin_l; } n=0; //カウンタをリセット } Wait(STEP); } spin_l; Wait(nMAX*STEP); //進行方向修正 go_last; //直進 PlaySound(SOUND_DOWN); //終了 }
task main() { part1(); //A→E右折(右) part2(); //E→P左折(左) part3(); //P→Q直進(左) part4(); //Q→R左折(左) part5(); //R→T直進(右) part5(); //T→T直進(右) part6(); //T→H右折(右) part1(); //H→G右折(右) part2(); //G→S左折(左) part3(); //S→P直進(左) part4(); //P→Q左折(左) part6(); //Q→F右折(右) part7(); //F→A直進(右) }
()内の文字(右、左)は黒線のどちら側を通るかを示す。
所定のコースを走行し終わったあとのタイムは1分29秒であった。
まずは、無事に完走させることができたことを嬉しく思う。特に、授業中にみんなの前で発表できたのはよかった。発表会のときは、最後のF→Aの部分で事前にプログラムの中に組み込んだ「きらきら星」を流すことによってF→Aの機械が沈黙する部分で盛り上げることができたと思う。 Mission1の「まとめ・感想」で書いた反省のようにタスクメインはコンパクトかつシンプルに、また全体を通して"カッコイイ"プログラムになったと思う。最後の課題となるMission3では、さらに"スマート"にしたいと思う。