目次

黒い線に沿って動くロボット

各チームで次のようなコースを作成し、コースを2周するようなロボットを完成させよ

ただし

メンバー

ロボットの紹介

ロボットの工夫点

写真

コース

DSCN0450.JPG

プログラム

近道をたどるプログラム (担当:なかむ)

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

プログラミングの工夫点

感想

コメント

コメントをどうぞ



添付ファイル: fileDSCN0450.JPG 250件 [詳細] fileDSCN0445.JPG 271件 [詳細] fileDSCN0446.JPG 269件 [詳細] fileDSCN0447.JPG 290件 [詳細] fileDSCN0443.JPG 154件 [詳細] fileDSCN0442.JPG 268件 [詳細] fileDSCN0441.JPG 276件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-02-08 (火) 13:30:54