はじめに

紙コップをC地点、D地点にそれぞれ3個(合計6個)置き、C地点に置いた紙コップにはCを、
D地点に置いた紙コップにはDを紙コップの底面にマークします。
最終的に黒線で囲まれた輪の中にC地点からの紙コップとD地点からの紙コップを交互に重ねます。~ (下側から数えて奇数番目はC地点からのコップ、偶数番目はD地点からのコップになるようにします)

ロボットについて

IMG_1.jpg
IMG_2.jpg

プログラム

  • 定義
    #define roll_left OnRev(OUT_A); OnFwd(OUT_C); //左回転
    #define turn_left OnFwd(OUT_C); Off(OUT_A); //左旋回
    #define go OnFwd(OUT_A); OnFwd(OUT_C); //前進
    #define turn_right OnFwd(OUT_A); Off(OUT_C); //右旋回
    #define roll_right OnFwd(OUT_A); OnRev(OUT_C); //右回転
    #define back OnRev(OUT_A); OnRev(OUT_C); Wait(200); Off(OUT_AC); //後進
    #define top OnRev(OUT_C); OnFwd(OUT_A); Wait(CROSS_TIME); OnFwd(OUT_AC); Wait(10);
    #define left OnRev(OUT_A); OnFwd(OUT_C); Wait(20);
    #define right OnRev(OUT_C); OnFwd(OUT_A); Wait(80); OnFwd(OUT_AC); Wait(20);
  • サブルーチン
     sub line_l(){
       int ch=0; //ループ脱出用変数
       ClearTimer(0); //交差点判別用のタイマー初期化
       ClearTimer(1); //交差点誤判別防止用のタイマー初期化
       while(ch==0) //chが0の時はループを続ける
       {
           if(SENSOR_2 > 53) //白部分 右回転
         {
           ClearTimer(0); //黒部分ではないので交差点判別用のタイマーを初期化
                 roll_right;
         }
         else if(SENSOR_2 > 52) //弱白部分 右旋回
         {
           ClearTimer(0); //黒部分ではないので交差点判別用のタイマーを初期化
                 turn_right;
         }
         else if(SENSOR_2 > 44) //境界部分 直進
         {
           ClearTimer(0); //黒部分ではないので交差点判別用のタイマーを初期化
                 go;
         }
         else if(SENSOR_2 > 41) //弱黒部分 左旋回
         {
           ClearTimer(0); //黒部分ではないので交差点判別用のタイマーを初期化
                 turn_left;
         }
         else{ //黒部分 左回転
                 roll_left;
         }
       if(FastTimer(0)>CROSS_TIME&&FastTimer(1)>l_time){  //交差点判別
        Off(OUT_AC); //車輪を止める
        PlaySound(SOUND_UP);  //音を鳴らす
        Wait(100);  //1秒待つ
        ch=1; //ループ脱出の為にchを1にする
      }
      Wait(1); //0.01秒待つ 
   }
 }
 sub line_r(){
   int ch=0; //ループ脱出用変数
   ClearTimer(0); //交差点判別用のタイマー初期化
   ClearTimer(1); //交差点誤判別防止用のタイマー初期化
   while(ch==0) //chが0の時はループを続ける
   {
     if(SENSOR_2 > 53) //白部分 左回転
     {
       ClearTimer(0); //黒部分ではないので交差点判別用のタイマーを初期化
             roll_left;
     }
     else if(SENSOR_2 > 52) //弱白部分 左旋回
     {
       ClearTimer(0); //黒部分ではないので交差点判別用のタイマーを初期化
             turn_left;
     }
     else if(SENSOR_2 > 44) //境界部分 直進
     {
       ClearTimer(0); //黒部分ではないので交差点判別用のタイマーを初期化
             go;
     }
     else if(SENSOR_2 > 41) //弱黒部分 右旋回
     {
       ClearTimer(0); //黒部分ではないので交差点判別用のタイマーを初期化
             turn_right;
     }
     else{ //黒部分 右回転
             roll_right;
     }
       if(FastTimer(0)>CROSS_TIME&&FastTimer(1)>l_time){  //交差点判別
        Off(OUT_AC); //車輪を止める
        PlaySound(SOUND_UP);  //音を鳴らす
        Wait(100);  //1秒待つ
        ch=1; //ループ脱出の為にchを1にする
      }
      Wait(1); //0.01秒待つ 
   }
 }
  • 交差点判別
    if(FastTimer(0)>CROSS_TIME&&FastTimer(1)>l_time){  //交差点判別
          Off(OUT_AC); //車輪を止める
          PlaySound(SOUND_UP);  //音を鳴らす
          Wait(100);  //1秒待つ
          ch=1; //ループ脱出の為にchを1にする
        }
     ClearTimer(0);
     if(FastTimer(0)>CROSS_TIME)
     if(FastTimer(0)>CROSS_TIME&&FastTimer(1)>l_time)
  • コップの回収
       sub cup(){
       OnRev(OUT_B); //アームを下す
          Wait(50);
       Off(OUT_B);
          OnFwd(OUT_AC); //前進
          while(SENSOR_1<42); //光センサーがコップを認識するまで前進する
          Off(OUT_AC);  //停止
          OnFwd(OUT_B); //アームを上げる
          Wait(50);
          Off(OUT_B);
      }
  • 最後の処理
     sub last(){
         OnRev(OUT_C); //姿勢をまっすぐにする
         OnFwd(OUT_A);
         Wait(40);
         OnFwd(OUT_AC); //前進
         Wait(200); //2秒間待つ
         Off(OUT_AC); //停止 
         ClearTimer(0); //交差点判別用のタイマー初期化(初期化しなくてもよいが最後なので一応初期化)
         ClearTimer(1); //交差点誤判別防止用のタイマー初期化(初期化しなくてもよいが最後なので一応初期化
       }
  • 本文
     task main ()
      {
         SetSensor(SENSOR_1, SENSOR_LIGHT);
         SetSensor(SENSOR_2, SENSOR_LIGHT);
         OnFwd(OUT_AC);
         Wait(60); 
         line_l(); 
         left;
         l_time=400;
         line_l(); 
         right; 
         l_time=100;
         balance_l();
         cup();
         bottom;
         turn();
         balance_r();
         cup();
         bottom;
         turn();
         OnFwd(OUT_A);
         OnFwd(OUT_C);
         Wait(20);
         balance_r();
         cup();
         bottom;
         turn();
         OnFwd(OUT_A);
         OnFwd(OUT_C);
         Wait(20);
         balance_r();
         cup();
         bottom;
         bottom;
         bottom;
         bottom;
         l_time=200;
         OnFwd(OUT_C);
         OnRev(OUT_A);
         Wait(50);
         OnFwd(OUT_A);
         OnFwd(OUT_C);
         Wait(30);
         line_l();
         left;
         line_l();
         left;
         line_l();
         OnFwd(OUT_AC);
         Wait(50);
         Off(OUT_AC);
         OnRev(OUT_B);
         Wait(50);
         Off(OUT_B);
         OnFwd(OUT_A);
         OnRev(OUT_C);
         Wait(100);
         OnRev(OUT_AC);
         Wait(200);
         Off(OUT_AC);
     }

プログラムの説明

僕たちの班で作ったコースでは、おおよそ線の白部分が数値で53以上、やや白が52〜53、境界部分
が44〜52、やや黒が41〜44、黒部分が41未満と計測された。よってそれに準じてプログラムを作っ
た。
今回は時間によってライントレースするようになっている。
交差点を判別するタイマーとして、FastTimer(0)がある。光センサーが黒部分の判定をしている時
にカウントをして、0.4秒以上続いたら交差点として判別する。また、黒部分以外の時はClearTimer(0)でFastTimer(0)を初期化する。
また今回はコースが複雑なため、交差点をロボットが間違って認識しないようFastTimer(1)という 別のタイマーを用いた。小さなカーブを交差点として誤判別しないために指定秒数間交差点判別を行わないようにする。ここで、指定秒数を変数としてl_timeをグローバル変数として定義する。また、ライントレース開始時にClearTimer(1)でFastTimer(1)を初期化する。

 

交差点は黒部分が長く続いた時に交差点として判別するようにした。そこでタイマーを使い黒部分以外の時は以下の関数でタイマーを初期化するようにした。また交差点と判別したことが分かるよ~うに、判別したら音を鳴らすようにした。


感想

今回の課題では自分はあまり班に対して貢献できませんでした。
一つには班に元々プログラミングに関して詳しい方がいたためですが、改めて自分の知識や技能の
不足を痛感しました。
近いうちに小学校でもプログラミングの授業が入ってくるそうですが、自分ももっと色々な機会を
利用して深く学んでいきたいと思いました。
自分は今まで正しくプログラミング出来れば、機械も正しく動くと思っていたのですが、実際はど
うも違うようで、前期の約半年間ロボティクス入門ゼミを取ってみて、微調整に予想以上の時間を
取られたことに新鮮な驚きを感じました。


添付ファイル: fileIMG_2.jpg 96件 [詳細] fileIMG_1.jpg 104件 [詳細] fileIMG_02.jpg 50件 [詳細] fileIMG_01.jpg 50件 [詳細] fileIMG_0151.jpg 59件 [詳細] fileIMG_0150.jpg 49件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-08-09 (火) 14:31:09 (1109d)