2018a/Member
目次

課題

Inked2018a-mission2_LI.jpg

今回の課題は上図の矢印をトレースするロボットを作ることである。

ロボットの概要

ロボットを製作する段階でいくつかの工夫を施した。

ライントレースのプログラム

基本プログラム

ライントレースを行う際に必要なプログラムを以下のように定義した。

#define kuro 36//線上
#define haiiro 42//境界
#define siro 48//白の部分
#define spd 2
#define turn_l OnFwd(OUT_B,spd);OnRev(OUT_C,spd);//その場左回転
#define turn_r OnFwd(OUT_C,spd);OnRev(OUT_B,spd);//その場右回転
#define sasetu OnFwd(OUT_B,spd);OnRev(OUT_C,10);//左折
#define usetu OnRev(OUT_B,10);OnFwd(OUT_C,spd);//右折
#define tyoku OnFwd(OUT_BC,spd);//直進
#define STEP 1//一回の判定で進む時間

ラインの左側をトレースするプログラムを以下のように組んだ

task main ()
{
    SetSensorLight(S3);
    int i=0;
    while(i<500){
       if(SENSOR_3<kuro)
         {
          sasetu;
          i++;
         }
       else if(SENSOR_3<haiiro)
         {
          tyoku;
          i=0;
         }
       else
         {
          usetu;
          i=0;
         }
       Wait(STEP);
}

ラインの右側をトレースするプログラムを以下のように組んだ。

task main()
{
    SetSensorLight(S3);
    int i=0;
    while(i<500){
       if(SENSOR_3<kuro)
        {
         usetu;
         i++;
        }
       else if(SENSOR_3<haiiro)
        {
         tyoku;
         i=0;
        }
       else
        {
         sasetu;
         i=0;
         }
       Wait(STEP);
}

A〜Cのルート

A〜Cのルートではラインの左側をトレースするプログラムを採用した。
Cで停止後は軌道の修正を行った。

sub AC()
{
   SetSensorLight(S3);
   int i=0;
   while(i<500){
      if(SENSOR_3<kuro)
       {
        sasetu;
        i++;
       }
      else if(SENSOR_3<haiiro)
       {
        tyoku;
        i=0;
       }
      else
       {
        usetu;
        i=0;
       }
      Wait(STEP);
   }
   Off(OUT_BC);
   Wait(1000);//Cまで終了
   turn_r;
   Wait(150);
   tyoku;
   Wait(1000);
   i=0;//カウンタリセット

C〜Dのルート

このルートも左側をトレースした。
 sub CD()

{
   while(i<500){
      if(SENSOR_3<kuro)
       {
        sasetu;
        i++;
       }
      else if(SENSOR_3<haiiro)
       {
        tyoku;
        i=0;
       }
      else
       {
        usetu;
        i=0;
       }
      Wait(STEP);
   }
   Off(OUT_BC);
   Wait(1000);
   tyoku;
   Wait(100);
   turn_l;
   Wait(1100);
   i=0;//カウンタリセット
   Off(OUT_BC);
   while(i<500){
      if(SENSOR_3<kuro)
       {
        sasetu;
        i++;
       }
      else if(SENSOR_3<haiiro)
       {
        tyoku;
        i=0;
       }
      else
       {
        usetu;
        i=0;
       }
      Wait(STEP);
   }
   Off(OUT_BC);
   i=0;//カウンタリセット
   Wait(1000);//空き缶前
   tyoku;
   Wait(200);
   OnRev(OUT_A,spd);
   Wait(500);
   Off(OUT_A);
   OnRev(OUT_BC,spd);
   Wait(500);
   turn_l;
   Wait(1300);

D〜Fのルート

ここも左側をトレースした。ただし途中Eの部分で交差点と認識してしまうところがある。そのため交差点と認識したあと起動を修正し、少しの直進を加えることで突破した。

 sub DF()
   while(i<500){
      if(SENSOR_3<kuro)
       {
        sasetu;
        i++;
       }
      else if(SENSOR_3<haiiro)
       {
        tyoku;
        i=0;
       }
      else
       {
        usetu;
        i=0;
       }
      Wait(STEP);
   }
   i=0;//カウンタリセット
   tyoku;
   Wait(300);//E終了
   while(i<500){
      if(SENSOR_3<kuro)
       {
        sasetu;
        i++;
       }
      else if(SENSOR_3<haiiro)
       {
        tyoku;
        i=0;
       }
      else
       {
        usetu;
        i=0;
       }
      Wait(STEP);
   }
   i=0;//カウンタリセット
   Off(OUT_BC);//F終了

F〜Iのルート

ここも左側をトレースした。

sub FI()
   turn_l;
   Wait(1500);
   while(i<500){
      if(SENSOR_3<kuro)
       {
        sasetu;
        i++;
       }
      else if(SENSOR_3<haiiro)
       {
        tyoku;
        i=0;
       }
      else
       {
        usetu;
        i=0;
       }
      Wait(STEP);
   }
   i=0;//カウンタリセット
   Off(OUT_BC);//H終了
   Wait(1000);
   turn_r;
   Wait(1500);
   while(i<500){
      if(SENSOR_3<kuro)
       {
        sasetu;
        i++;
       }
      else if(SENSOR_3<haiiro)
       {
        tyoku;
        i=0;
       }
      else
       {
        usetu;
        i=0;
       }
      Wait(STEP);
   }
   i=0;//カウンタリセット
   Off(OUT_BC);//I終了
   Wait(1000);

I〜Jのルート

左側トレースではJに到達したか認識することができない。そのためここではラインの右側をトレースした。LとKの突破は先のEと同じ方式をとった。

sub IJ()
   while(i<500){
      if(SENSOR_3<kuro)
       {
        usetu;
        i++;
       }
      else if(SENSOR_3<haiiro)
       {
        tyoku;
        i=0;
       }
      else
       {
        sasetu;
        i=0;
       }
      Wait(STEP);
   }
   Off(OUT_BC);//L終了
   i=0;//カウンタリセット
   tyoku;
   Wait(300);
   while(i<500){
      if(SENSOR_3<kuro)
       {
        usetu;
        i++;
       }
      else if(SENSOR_3<haiiro)
       {
        tyoku;
        i=0;
       }
      else
       {
        sasetu;
        i=0;
       }
      Wait(STEP);
   }
   Off(OUT_BC);//K終了
   i=0;//カウンタリセット
   tyoku;
   Wait(300);
   while(i<500){
      if(SENSOR_3<kuro)
       {
        usetu;
        i++;
       }
      else if(SENSOR_3<haiiro)
       {
        tyoku;
        i=0;
       }
      else
       {
        sasetu;
        i=0;
       }
      Wait(STEP);
   }
   Off(OUT_BC);//J到達
   i=0;//カウンタリセット
   Wait(1000);
   tyoku;
   Wait(200);
   turn_l;
   Wait(1300);
   OnFwd(OUT_A,spd);
   Wait(500);
   Off(OUT_A);
   OnRev(OUT_BC,spd);
   Wait(800);

ゴールに向かう

空き缶を置いた後はゴールに向かう。ここでは左側のトレースを採用する。

sub JA()
   turn_r;
   Wait(2000);//Bに向かう
   while(i<500){
      if(SENSOR_3<kuro)
       {
        sasetu;
        i++;
       }
      else if(SENSOR_3<haiiro)
       {
        tyoku;
        i=0;
       }
      else
       {
        usetu;
        i=0;
       }
      Wait(STEP);
   }
   i=0;//カウンタリセット
   Wait(1000);
   turn_l;
   Wait(1100);//Aに向かう
   while(i<500){
      if(SENSOR_3<kuro)
       {
        sasetu;
        i++;
       }
      else if(SENSOR_3<haiiro)
       {
        tyoku;
        i=0;
       }
      else
       {
        usetu;
        i=0;
       }
      Wait(STEP);
   }
   tyoku;
   Wait(500);
   Off(OUT_BC);//A到達
}

プログラムの完成

完成したプログラムは以下のようになった。

task main()
{
AC();
CD();
DF();
FI();
IJ();
JA();
}

まとめ

今回はトレースするプログラムを作るのに時間がかかった。サブルーチンを用いたり、関数を用いたりと、今回は前回課題に比べ大きく成長することができたと思う。
今回は交差点の認識には黒が続いた回数をカウントする方式をとった。
機会があれば次はタイマーを用いたプログラムを使ってみたい。


添付ファイル: fileプレゼンテーション1.jpg 163件 [詳細] fileInked2018a-mission2_LI.jpg 167件 [詳細] fileimage2.jpeg 83件 [詳細] fileimage1.jpeg 171件 [詳細]

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