目次
各チームで次のようなコースを作成し、コースを2周するようなロボットを完成させよ
ただし
#define TH 40 //光センサーの閾値 #define go OnFwd(OUT_A+OUT_C); //まっすぐ進む #define sasetu SetPower(OUT_A,1);SetPower(OUT_C,1);OnRev(OUT_A);OnFwd(OUT_C);Wait(1); //左折 #define usetu SetPower(OUT_A,1);SetPower(OUT_C,1);OnFwd(OUT_A);OnRev(OUT_C);Wait(1); //右折 #define migi SetPower(OUT_A,1);SetPower(OUT_C,4);OnFwd(OUT_A);OnRev(OUT_C);Wait(1); //右にカーブ #define hidari SetPower(OUT_A,4);SetPower(OUT_C,1);OnRev(OUT_A);OnFwd(OUT_C);Wait(1); //左にカーブ #define teisi Off(OUT_A+OUT_C); //停止 #define taiki Wait(1) //100分の1秒間停止 task play_music () //1秒に1回音がなるタスク { while (true) { PlaySound(0);Wait(100); } } task main () //1周目のタスク { SetPower(OUT_A,2); //左のトルクを2に設定 SetPower(OUT_C,2); //右のトルクを2に設定 SetSensor(SENSOR_1,SENSOR_ROTATION); //回転センサー定義 SetSensor(SENSOR_2, SENSOR_LIGHT); //左の光センサー定義 SetSensor(SENSOR_3, SENSOR_LIGHT); //右の光センサー定義 ClearSensor(SENSOR_1); //回転センサーを0に戻す go; //まっすぐ進む start play_music; //音を鳴らすタスクを連動させる while (true) { go; if ((SENSOR_2 < TH)&&(SENSOR_3 > TH)) { hidari; } //左が黒、右が白で左にカーブ if ((SENSOR_3 < TH)&&(SENSOR_2 > TH)) { migi; } //左が白、右が黒で右にカーブ if ((SENSOR_3 < TH)&&(SENSOR_2 < TH)) { teisi; taiki; } //交差点を判定 if ((SENSOR_1 < -300)&&(SENSOR_3 < TH)&&(SENSOR_2 > TH)){ usetu; } //マシンが中の四角のエリアに入り、左が白、右が黒なら右折 if ((SENSOR_1 < -300)&&(SENSOR_3 > TH)&&(SENSOR_2 < TH)){ sasetu; } //マシンが中の四角のエリアに入り、左が黒、右が白なら左折 if ((SENSOR_1 < -160)&&(SENSOR_1 > -175)&&(SENSOR_3 < TH)){ OnFwd(OUT_A); OnRev(OUT_C); Wait(25); go; Wait(10); } //近道に入る if ((SENSOR_1 < -1070)&&(SENSOR_1 > -1080)&&(SENSOR_3 < TH)){ OnFwd(OUT_A); OnRev(OUT_C); Wait(30); go; Wait(10); } //近道に入る if ((SENSOR_1 < -1430)&&(SENSOR_1 > -1470)){ go; Wait(10); } //下部の円のエリアに入る if ((SENSOR_1 < -1900)&&(SENSOR_1 > -1940)){ go; Wait(10); } //下部の円のエリアから出る if ((SENSOR_1 < -1980)&&(SENSOR_2<TH)&&(SENSOR_3<TH)){ ClearSensor (SENSOR_1); start follow_line; } //スタート地点に戻ったら回転センサーをリセットし、2周目のタスクを起動 } } task follow_line () //2周目のタスク { SetPower(OUT_A,2); //左のトルクを2に指定 SetPower(OUT_C,2); //右のトルクを2に指定 SetSensor(SENSOR_1,SENSOR_ROTATION); //回転センサー定義 SetSensor(SENSOR_2, SENSOR_LIGHT); //光センサー定義 SetSensor(SENSOR_3, SENSOR_LIGHT); //光センサー定義 ClearSensor(SENSOR_1); //回転センサーをリセット stop main; //1周目のタスクを停止 while (true) { go; if ((SENSOR_2 < TH)&&(SENSOR_3 > TH)) { hidari; } //左が黒、右が白で左にカーブ if ((SENSOR_3 < TH)&&(SENSOR_2 > TH)) { migi; } //右が黒、左が白で右にカーブ if ((SENSOR_3 < TH)&&(SENSOR_2 < TH)) { teisi; taiki; } //交差点を判定 if ((SENSOR_1 < -300)&&(SENSOR_3 < TH)&&(SENSOR_2 > TH)){ usetu; } //図の内部の四角のエリアに入り、左が白、右が黒で右折 if ((SENSOR_1 < -300)&&(SENSOR_3 > TH)&&(SENSOR_2 < TH)){ sasetu; } //図の内部の四角いエリアに入り、左が黒、右が白で左折 if ((SENSOR_1 < -160)&&(SENSOR_1 > -175)&&(SENSOR_3 < TH)){ OnFwd(OUT_A); OnRev(OUT_C); Wait(25); go; Wait(10); } //近道に入る if ((SENSOR_1 < -1070)&&(SENSOR_1 > -1080)&&(SENSOR_3 < TH)){ OnFwd(OUT_A); OnRev(OUT_C); Wait(30); go; Wait(10); } //近道に入る if ((SENSOR_1 < -1430)&&(SENSOR_1 > -1470)){ go; Wait(10); } //下部の円のエリアに入る if ((SENSOR_1 < -1900)&&(SENSOR_1 > -1940)){ go; Wait(10); } //下部の円のエリアから出る if (SENSOR_1 < -1980){ teisi; } //スタート地点の手前で停止 } }
プログラミングの工夫点
#define TH 40 //光センサーの閾値 #define go OnFwd(OUT_A+OUT_C); //まっすぐ進む #define sasetu SetPower(OUT_A,1);SetPower(OUT_C,1);OnRev(OUT_A);OnFwd(OUT_C);Wait(1); //左折 #define usetu SetPower(OUT_A,1);SetPower(OUT_C,1);OnFwd(OUT_A);OnRev(OUT_C);Wait(1); //右折 #define migi SetPower(OUT_A,1);SetPower(OUT_C,4);OnFwd(OUT_A);OnRev(OUT_C);Wait(1); //右にカーブ #define hidari SetPower(OUT_A,4);SetPower(OUT_C,1);OnRev(OUT_A);OnFwd(OUT_C);Wait(1); //左にカーブ #define teisi Off(OUT_A+OUT_C); //停止 #define taiki Wait(1) //100分の1秒間停止 task play_music () //1秒に1回音がなるタスク { while (true) { PlaySound(0);Wait(100); } } task main () //1周目のタスク { SetPower(OUT_A,2); //左のトルクを2に設定 SetPower(OUT_C,2); //右のトルクを2に設定 SetSensor(SENSOR_1,SENSOR_ROTATION); //回転センサー定義 SetSensor(SENSOR_2, SENSOR_LIGHT); //左の光センサー定義 SetSensor(SENSOR_3, SENSOR_LIGHT); //右の光センサー定義 ClearSensor(SENSOR_1); //回転センサーを0に戻す go; //まっすぐ進む start play_music; //音を鳴らすタスクを連動させる while (true) { go; if ((SENSOR_2 < TH)&&(SENSOR_3 > TH)) { hidari; } //左が黒、右が白で左にカーブ if ((SENSOR_3 < TH)&&(SENSOR_2 > TH)) { migi; } //左が白、右が黒で右にカーブ if ((SENSOR_3 < TH)&&(SENSOR_2 < TH)) { teisi; taiki; } //交差点を判定 if ((SENSOR_1 < -280)&&(SENSOR_3 < TH)&&(SENSOR_2 > TH)){ usetu; } //マシンが中の四角のエリアに入り、左が白、右が黒なら右折 if ((SENSOR_1 < -280)&&(SENSOR_3 > TH)&&(SENSOR_2 < TH)){ sasetu; } //マシンが中の四角のエリアに入り、左が黒、右が白なら左折 if ((SENSOR_1 < -1390)&&(SENSOR_1 > -1430)){ go; Wait(10); } //下部の円のエリアに入る if ((SENSOR_1 < -1860)&&(SENSOR_1 > -1900)){ go; Wait(10); } //下部の円のエリアから出る if ((SENSOR_1 < -1940)&&(SENSOR_2<TH)&&(SENSOR_3<TH)){ ClearSensor (SENSOR_1); start follow_line; } //スタート地点に戻ったら回転センサーをリセットし、2周目のタスクを起動 } } task follow_line () //2周目のタスク { SetPower(OUT_A,2); //左のトルクを2に指定 SetPower(OUT_C,2); //右のトルクを2に指定 SetSensor(SENSOR_1,SENSOR_ROTATION); //回転センサー定義 SetSensor(SENSOR_2, SENSOR_LIGHT); //光センサー定義 SetSensor(SENSOR_3, SENSOR_LIGHT); //光センサー定義 ClearSensor(SENSOR_1); //回転センサーをリセット stop main; //1周目のタスクを停止 while (true) { go; if ((SENSOR_2 < TH)&&(SENSOR_3 > TH)) { hidari; } //左が黒、右が白で左にカーブ if ((SENSOR_3 < TH)&&(SENSOR_2 > TH)) { migi; } //右が黒、左が白で右にカーブ if ((SENSOR_3 < TH)&&(SENSOR_2 < TH)) { teisi; taiki; } //交差点を判定 if ((SENSOR_1 < -280)&&(SENSOR_3 < TH)&&(SENSOR_2 > TH)){ usetu; } //図の内部の四角のエリアに入り、左が白、右が黒で右折 if ((SENSOR_1 < -280)&&(SENSOR_3 > TH)&&(SENSOR_2 < TH)){ sasetu; } //図の内部の四角いエリアに入り、左が黒、右が白で左折 if ((SENSOR_1 < -1390)&&(SENSOR_1 > -1430)){ go; Wait(10); } //下部の円のエリアに入る if ((SENSOR_1 < -1860)&&(SENSOR_1 > -1900)){ go; Wait(10); } //下部の円のエリアから出る if (SENSOR_1 < -1940){ teisi; } //スタート地点の手前で停止 } }
プログラミングの工夫点
コメントをどうぞ