目次
#contents

*課題 [#lb0e93b2]
**黒い線に沿って動くロボット [#xfdde901]
各チームで次のようなコースを作成し、コースを2周するようなロボットを完成させよ [#df93563e]
-黒い線の幅は15〜25ミリの範囲で一定にすること
-交差点を3か所以上設置すること
-直角のコーナーを2か所以上設置すること
-近道を2か所以上設置(直角のコーナーのショートカットも可)
-スタートにはコースに直角に5センチ程度の線を引く

ただし
-速さと正確さを追求する
-2周目はスタート地点の直前で自動ストップ
-近道を走るものと正規ルートを走るものを作成
*メンバー [#q43daba4]
-なかむ
-王
*ロボット [#i88442a6]
**工夫した点、苦労した点 [#c346d860]
*コース [#tffc67a2]
*プログラム [#u3b01ea4]
**なかむのプログラム(近道を通る) [#f62b52ef]

      #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;
                                            }     //スタート地点の手前で停止
                                      }
      }

プログラミングの工夫点
-当初、直角に曲がることができなかったので2種類の曲がり方をプログラミングに取り入れた。
-タスクを1周目と2周目で分けた。理由は単純、徹夜をして思考回路が他に回らなかった。
-ライントレースでは下部の円の部分に入れなかったので回転センサーで指定し、うまく入れるようにした。
-タイマーに使えると思い、1秒に1回音がなるようにしてみたが、バッテリーによって時間がバラバラでタイマーが使えなかった。

**王のプログラム(正規ルート) [#fb2be5ac]
*感想 [#l7e6c0c5]

*コメント [#pc6ef1dd]
コメントをどうぞ


#comment


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS