2018a/Member
目次

課題

Inked2018a-mission2_LI.jpg

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

ロボットの概要

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

  • センサーの位置
    センサーでライントレースする際にセンサーがロボットから離れていると急なカーブに対応できない。よって今回のロボットは前輪の位置になるべく近くなるよう設計した。
  • 後輪の構造
    センサーを前輪になるべく近づけるにあたり、本体をモーター部分にのせる形となった。そのため本体の重さに耐えるべく後輪のタイヤを二つ使い支えるようにした。
    image1.jpeg
  • 缶を運ぶ仕組み
    缶はつかんで運ぶのではなく、四角形の枠で缶をとらえ、引きずりながらかこぶことにした。
    横から機体を見たときは下図のようになり、灰色の部分が缶を捉えるわくであり、黒の矢印のように上下することによって缶を捉える。
    プレゼンテーション1.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 42件 [詳細] fileInked2018a-mission2_LI.jpg 47件 [詳細] fileimage2.jpeg 26件 [詳細] fileimage1.jpeg 48件 [詳細]

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