今回のロボットはライントレースを行うためのものです。ライントレースとは、ロボットに光センサーを取り付け、線に沿って動かすことです。コースについては後ほど...
ロボット上部から見て左側にある光センサーを光センサー1,右側にある光センサーを光センサー2とする。今回は黒い線の上ではなく、その両サイドの白い部分に沿って進むませ、黒い部分に光センサーが反応した場合、軌道修正を行うように設計しました。
白い部分に両光センサーがある限り、直進する以外の行動を起こさないので、直進し続けます。
光センサー2が黒い部分に反応すると...
ロボットは赤い矢印の方向に軌道修正し、再び動き始めます。
センサー1が黒い部分に反応すると...
ロボットは赤い矢印の方向に軌道修正し、再び動き出します。
黒い部分に両光センサーが反応し、後退と停止を行います。
前方タッチセンサーが反応し、後退と停止を行い、再び動き出します。
交差点で直行させるラインを描く必要はありますが、黒いラインの上を沿わせる光センサーよりも二つのセンサーの幅が広くなることにより、速いスピードでカーブを曲がる場合でもコースから外れにくいです。
上記したように、交差点にて、コースと直角に黒い線を描くことによって、その位置に達すると両光センサーが反応します。すると、後退と停止を行い、再び動き出します。
task main () { SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_2, SENSOR_TOUCH); SetSensor(SENSOR_3, SENSOR_LIGHT); while (true) { while(SENSOR_2 == 0) { if (SENSOR_1 < THRESHOLD) { if (SENSOR_3 < THRESHOLD) { Off(OUT_A+OUT_C); //停止 Wait(100); OnFwd(OUT_A+OUT_C); //直進 Wait(100); } else { OnFwd(OUT_C); //右に方向修正 OnRev(OUT_A); } } else { if (SENSOR_3 < THRESHOLD) { OnFwd(OUT_A); //左に方向修正 OnRev(OUT_C); } else { OnFwd(OUT_A+OUT_C); //直進 } } } OnRev(OUT_A+OUT_C); //ぶつかった時に後退、停止、直進する Wait(100); Off(OUT_A+OUT_C); Wait(500); OnFwd(OUT_A+OUT_C); Wait(100); Off(OUT_A+OUT_C); } }
ライントレースを行うためのプログラムです。
#define C1 131 #define C2 262 #define C3 523 #define Ds1 139 #define Ds2 277 #define Ds3 554 #define D1 147 #define D2 294 #define D3 587 #define Es1 156 #define Es2 311 #define Es3 622 #define E1 165 #define E2 330 #define E3 659 #define F1 175 #define F2 349 #define F3 698 task play_music() { while(true) { PlayTone(F3,14); Wait(19); PlayTone(F3,14); Wait(19); PlayTone(F3,14); Wait(19); PlayTone(D3, 7); Wait(12); PlayTone(F3,14); Wait(19); PlayTone(F3,14); Wait(19); PlayTone(D3, 7); Wait(7); PlayTone(F3, 7); Wait(12); PlayTone(D3, 7); Wait(7); PlayTone(F3,14); Wait(19); PlayTone(E3,14); Wait(19); PlayTone(E3,14); Wait(19); PlayTone(E3,14); Wait(19); PlayTone(C3, 7); Wait(12); PlayTone(E3,14); Wait(19); PlayTone(E3,14); Wait(19); PlayTone(C3, 7); Wait(7); PlayTone(E3, 7); Wait(12); PlayTone(C3, 7); Wait(7); PlayTone(E3,14); Wait(19); } }
通常走行状態で流れる音楽です。タッチセンサーが反応しない限りは流れ続けます。
#define DO1 262 #define DO2 523 #define RA1 110 #define RA2 220 #define SI1 117 #define SI2 233 #define RE1 147 #define RE2 294 #define MI1 165 #define MI2 330 #define FA1 175 #define FA2 349 task play_music() { while (true) { PlayTone(DO1, 15); Wait(20); PlayTone(DO2, 15); Wait(20); PlayTone(RA1, 15); Wait(20); PlayTone(RA2, 15); Wait(20); PlayTone(SI1, 15); Wait(20); PlayTone(SI2, 15); Wait(20); Wait(60); PlayTone(DO1, 15); Wait(20); PlayTone(DO2, 15); Wait(20); PlayTone(RA1, 15); Wait(20); PlayTone(RA2, 15); Wait(20); PlayTone(SI1, 15); Wait(20); PlayTone(SI2, 15); Wait(20); Wait(60); PlayTone(FA1, 15); Wait(20); PlayTone(FA2, 15); Wait(20); PlayTone(RE1, 15); Wait(20); PlayTone(RE2, 15); Wait(20); PlayTone(MI1, 15); Wait(20); PlayTone(MI2, 15); Wait(20); Wait(60); PlayTone(FA1, 15); Wait(20); PlayTone(FA2, 15); Wait(20); PlayTone(RE1, 15); Wait(20); PlayTone(RE2, 15); Wait(20); PlayTone(MI1, 15); Wait(20); PlayTone(MI2, 15); Wait(20); Wait(60); } }
激突した場合に流れる音楽です。
下のプログラムは、前述した3つのプログラムをまとめて実際に使用したプログラムです。
#define THRESHOLD 40 // 閾値 #define DO1 262 #define DO2 523 #define RA1 110 #define RA2 220 #define SI1 117 #define SI2 233 #define RE1 294 #define RE2 587 #define MI1 311 #define MI2 622 #define FA1 349 #define FA2 698 #define C3 523 #define Ds3 554 #define D3 587 #define Es3 622 #define E3 659 #define F3 698 task play_music_1() { while(true) { PlayTone(F3,14); Wait(19); //マリオのテーマ(スター状態) PlayTone(F3,14); Wait(19); PlayTone(F3,14); Wait(19); PlayTone(D3, 7); Wait(12); PlayTone(F3,14); Wait(19); PlayTone(F3,14); Wait(19); PlayTone(D3, 7); Wait(7); PlayTone(F3, 7); Wait(12); PlayTone(D3, 7); Wait(7); PlayTone(F3,14); Wait(19); PlayTone(E3,14); Wait(19); PlayTone(E3,14); Wait(19); PlayTone(E3,14); Wait(19); PlayTone(C3, 7); Wait(12); PlayTone(E3,14); Wait(19); PlayTone(E3,14); Wait(19); PlayTone(C3, 7); Wait(7); PlayTone(E3, 7); Wait(12); PlayTone(C3, 7); Wait(7); PlayTone(E3,14); Wait(19); } } task play_music_2() // 音楽を演奏するタスク { while (true) { PlayTone(DO1, 15); Wait(20); //マリオのテーマ(地下ステージ) PlayTone(DO2, 15); Wait(20); PlayTone(RA1, 15); Wait(20); PlayTone(RA2, 15); Wait(20); PlayTone(SI1, 15); Wait(20); PlayTone(SI2, 15); Wait(20); Wait(60); PlayTone(DO1, 15); Wait(20); PlayTone(DO2, 15); Wait(20); PlayTone(RA1, 15); Wait(20); PlayTone(RA2, 15); Wait(20); PlayTone(SI1, 15); Wait(20); PlayTone(SI2, 15); Wait(20); Wait(60); PlayTone(FA1, 15); Wait(20); PlayTone(FA2, 15); Wait(20); PlayTone(RE1, 15); Wait(20); PlayTone(RE2, 15); Wait(20); PlayTone(MI1, 15); Wait(20); PlayTone(MI2, 15); Wait(20); Wait(60); PlayTone(FA1, 15); Wait(20); PlayTone(FA2, 15); Wait(20); PlayTone(RE1, 15); Wait(20); PlayTone(RE2, 15); Wait(20); PlayTone(MI1, 15); Wait(20); PlayTone(MI2, 15); Wait(20); Wait(60); } } task main () { SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_2, SENSOR_TOUCH); SetSensor(SENSOR_3, SENSOR_LIGHT); while (true) { stop play_music_2 ; // 後退用音楽(マリオのテーマ(地下ステージ))を停止 start play_music_1 ; // 直進用音楽(マリオのテーマ(スター状態))を開始 while(SENSOR_2 == 0) { if (SENSOR_1 < THRESHOLD) { if (SENSOR_3 < THRESHOLD) { stop play_music_1 ; // 直進用音楽(マリオのテーマ(スター状態))を停止 Off(OUT_A+OUT_C); //停止 Wait(100); OnFwd(OUT_A+OUT_C); //直進 Wait(100); start play_music_1 ; // 直進用音楽(マリオのテーマ(スター状態))を開始 } else { OnFwd(OUT_C); //右に方向修正 OnRev(OUT_A); } } else { if (SENSOR_3 < THRESHOLD) { OnFwd(OUT_A); //左に方向修正 OnRev(OUT_C); } else { OnFwd(OUT_A+OUT_C); //直進 } } } stop play_music_1 ; // 直進用音楽(マリオのテーマ(スター状態))を停止 start play_music_2 ; // 後退用音楽(マリオのテーマ(地下ステージ))を開始 OnRev(OUT_A+OUT_C); //ぶつかった時に後退、停止、直進する Wait(100); Off(OUT_A+OUT_C); Wait(500); OnFwd(OUT_A+OUT_C); Wait(100); Off(OUT_A+OUT_C); } }
コメントをお願いします。