目次
#contents

* 課題2 [#pbb2e130]
#ref(./2017a-mission2.png,75%,コース全体像)
上図のコースを作成し、そのラインを認識して走らせるプログラムを作成する。

詳しくは[[課題2>2017a/Mission2]]参照

私は「E地点右折コース」のプログラムを作成した。

* ロボットの説明 [#m7645e56]
#ref(./1499343142721.jpg,75%,コース全体像);
#ref(./1499304166499.jpg,75%,コース全体像);
#ref(./1499304158029.jpg,75%,コース全体像);

最初は、説明書の通りに作ったベースの前方にセンサーを付けた物を走らせていたが、その場合、交差点での90°回転や、カーブの内側を走る際に、センサーやタイヤの幅が大きいことによって、

コースから大きくズレてしまうというという問題が生じた。

そこで、上の写真のようにタイヤを接続する部分のパーツを極力少なくすることによって、タイヤの幅、本体とセンサーとの距離を近づけ、より狭い範囲での旋回やカーブを行えるようにした。

* プログラムの説明 [#qefd5b8e]
** 定数 [#r361ab3f]
センサーによって今どこを走っているのかを認識させるために、コース外、境界、内側と段々と黒に近づくように定数を設定した。
 #define SHIRO 50     //コース外の紙の上の色
 #define SHIROHAI 44  //コースの縁の境界面
 #define HAI 39       //コース内側


** マクロ [#t7c8ebec]
 #define turn_r Off(OUT_C);OnFwd(OUT_A);Wait(2);Off(OUT_AC);   //右にカーブ
 #define turn_l Off(OUT_A);OnFwd(OUT_C);Wait(2);Off(OUT_AC);   //左にカーブ
 #define senkai_l OnFwd(OUT_C);OnRev(OUT_A);Wait(1);Off(OUT_AC); //右に旋回
 #define senkai_r OnFwd(OUT_A);OnRev(OUT_C);Wait(1);Off(OUT_AC); //左に旋回
交差点に到着して次のコースへ入る分岐点には、3つの動きを用意した

 #define tenkan_r OnFwd(OUT_AC); Wait(40);OnFwd(OUT_A);OnRev(OUT_C);Wait(90);Off(OUT_AC); //90°右回転
 #define tenkan_l OnFwd(OUT_AC); Wait(40);OnFwd(OUT_C);OnRev(OUT_A);Wait(90);Off(OUT_AC); //90°左回転
 #define tenkan_tyokusin OnFwd(OUT_AC);Wait(30);Off(OUT_AC); //そのまま直進

 #define itiziteisi Off(OUT_AC); PlaySound(SOUND_DOWN); Wait(100); //音を鳴らし、1秒間停止する
**ライン上を走らせるブログラム [#u9d8abb1]
 SetSensor(SENSOR_1, SENSOR_LIGHT);
 
   int n=0;
    while( n < 40)
      { if(SENSOR_1 > SHIRO)
         {senkai_l;}
        else if(SENSOR_1 > SHIROHAI)
         {turn_l;}
        else if(SENSOR_1 > HAI)
         {turn_r;}
        else 
         {senkai_r;n++;}
       } 
ラインの境界上を走らせ、一番黒い所を走ったらカウンターを1つ上げることで、交差点から交差点までの1つの区間での黒い部分の総数をカウントし、一定以上の値になったら交差点と認識させるようにした。

このカウンターの定数と総数を区間ごとに変えて設定することで、一連の道を走らせた。

HからGまでのコースは、小さいカーブの内側を走る部分があり、ここを走るときはセンサーが黒と認識するので、この区間でのカウンターの総数が130と極端に多くなった。
** メインタスク [#vc84780d]
 task main()
 { SetSensor(SENSOR_1, SENSOR_LIGHT);
 
   int n=0;
    while( n < 40)
      { if(SENSOR_1 > SHIRO)
         {senkai_l;}
        else if(SENSOR_1 > SHIROHAI)
         {turn_l;}
        else if(SENSOR_1 > HAI)
         {turn_r;}
        else 
         {senkai_r;n++;}
       }                                    //AからE
   
   PlaySound(SOUND_UP); tenkan_r;
   
   int m=0;
    while( m < 10)
      { if(SENSOR_1 > SHIRO)
         {senkai_l;}
        else if(SENSOR_1 > SHIROHAI)
         {turn_l;}
        else if(SENSOR_1 > HAI)
         {turn_r;}
        else 
         {senkai_l;m++;}
       }                                    //EからP
  
   itiziteisi; OnFwd(OUT_C);tenkan_l;
 
   int l=0;
    while( l < 4)
      { if(SENSOR_1 > SHIRO)
         {senkai_r;}
        else if(SENSOR_1 > SHIROHAI)
         {turn_r;}
        else if(SENSOR_1 > HAI)
         {turn_l;}
        else 
         {senkai_l;l++;}
       }                                     //PからQ 
 
   PlaySound(SOUND_UP); tenkan_tyokusin;
 
   int o=0;
    while( o < 4)
      { if(SENSOR_1 > SHIRO)
         {senkai_r;}
        else if(SENSOR_1 > SHIROHAI)
         {turn_r;}
        else if(SENSOR_1 > HAI)
         {turn_l;}
        else 
         {senkai_l;o++;}
       }                                      //QからR
 
   PlaySound(SOUND_UP);tenkan_tyokusin;
 
   int p=0;
    while( p < 10)
      { if(SENSOR_1 > SHIRO)
         {senkai_l;}
        else if(SENSOR_1 > SHIROHAI)
         {turn_l;}
        else if(SENSOR_1 > HAI)
         {turn_r;}
        else 
         {senkai_r;p++;}
       }                                      //RからT
   
   itiziteisi; tenkan_tyokusin;
 
   int q=0;
    while( q < 9)
      { if(SENSOR_1 > SHIRO)
         {senkai_l;}
        else if(SENSOR_1 > SHIROHAI)
         {turn_l;}
        else if(SENSOR_1 > HAI)
         {turn_r;}
        else 
         {senkai_r;q++;}
       }                                      //TからT
   
   itiziteisi; tenkan_tyokusin;
 
   int r=0;
    while( r < 10)
      { if(SENSOR_1 > SHIRO)
         {senkai_l;}
        else if(SENSOR_1 > SHIROHAI)
         {turn_l;}
        else if(SENSOR_1 > HAI)
         {turn_r;}
        else 
         {senkai_r;r++;}
       }                                       //TH 
 
   PlaySound(SOUND_UP); tenkan_r;
 
   int a=0;
    while( a < 130)
      { if(SENSOR_1 > SHIRO)
         {senkai_l;}
        else if(SENSOR_1 > SHIROHAI)
         {turn_l;}
        else if(SENSOR_1 > HAI)
         {turn_r;}
        else 
         {senkai_r;a++;}
       }                                       //HからG 
 
   PlaySound(SOUND_UP); tenkan_tyokusin; 
 
   int b=0;
    while( b < 10)
      { if(SENSOR_1 > SHIRO)
         {senkai_r;}
        else if(SENSOR_1 > SHIROHAI)
         {turn_r;}
        else if(SENSOR_1 > HAI)
         {turn_l;}
        else 
         {senkai_l;b++;}
       }                                        //GからS
 
   itiziteisi; tenkan_l;
 
   int c=0;
    while( c < 3)
      { if(SENSOR_1 > SHIRO)
         {senkai_r;}
        else if(SENSOR_1 > SHIROHAI)
         {turn_r;}
        else if(SENSOR_1 > HAI)
         {turn_l;}
        else 
         {senkai_l;c++;}
       }                                         //SからP
 
   PlaySound(SOUND_UP); tenkan_tyokusin;
 
   int x=0;
    while( x < 1)
      { if(SENSOR_1 > SHIRO)
         {senkai_r;}
        else if(SENSOR_1 > SHIROHAI)
         {turn_r;}
        else if(SENSOR_1 > HAI)
         {turn_l;}
        else 
         {senkai_l;x++;}
       }                                         //PからQ
 
   PlaySound(SOUND_UP); tenkan_tyokusin;
   
   int y=0;
    while( y < 3)
      { if(SENSOR_1 > SHIRO)
         {senkai_r;}
        else if(SENSOR_1 > SHIROHAI)
         {turn_r;}
        else if(SENSOR_1 > HAI)
         {turn_l;}
        else 
         {senkai_l;y++;}
       }                                          //QからF
 
   PlaySound(SOUND_UP); tenkan_r;
   
   int z=0;
    while( z < 50)
      { if(SENSOR_1 > SHIRO)
         {senkai_r;}
        else if(SENSOR_1 > SHIROHAI)
         {turn_r;}
        else if(SENSOR_1 > HAI)
         {turn_l;}
        else 
         {senkai_l;z++;}
       }                                          //FからA
 
   PlaySound(SOUND_DOWN); Off(OUT_AC);
 
 }

* まとめ [#e8264463]
** 反省 [#w4ea5522]
まずロボットの形状については、今回は4輪による走行を行ったが、片方のモーターのみによる回転の時に、もう片方のタイヤを引きずる面積が大きくなってしまうので微妙なコースからのズレや、タイヤに負担がかかることによってパーツが外れてきてしまうなど、デメリットが多くなってしまった。

この問題は、タイヤを二輪にしていれば、回転の幅やセンサーまでの距離といった問題もまとめて解決出来たのだと、後から分かった。

次に、プログラムについては、線上を走らせるだけならば上手く作れたが、私が用いた変数のカウンターによる交差点やカーブの判別は、コースの部分毎に最大数を変えればいいので、修正が楽な反面、コースの部分の数だけ定義の異なる「while」のプログラムを作らなければならなくなったので、メインタスクの中身が大きくなり、本体への送信にかなりの時間を要するようになってしまった。

ある程度似た距離を走らせる部分毎にまとめて上手く良い最大数を決めれば、サブルーチンとして整理できたかもしれないと思ったので、今後時間があれば上手くまとめられるようにしたい。
** 感想 [#bdcc8e67]
今回の課題は、前回のものと違い、ロボットよりもプログラムの制作により時間がかかった。最初はセンサーを使って色を見分けさせるのにも、数字の設定などに時間がかかったが、上手く線を認識して、カーブなどを滑らかにロボが曲がっていった時には、大きな達成感を得た。

次に機会があった時には、カーブや交差点がより増えて複雑になったコースでも走らせることが出来るようなロボットとプログラムを制作したい。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS