ロボティクス入門ゼミ

機体

プログラム

int t;           //変数tを指定
//------サブルーチンの指定-----
//    (1)直進トレース
sub line_straight() 
{
    PlaySound(SOUND_DOUBLE_BEEP) ;
   OnRev(OUT_A+OUT_C);
    Wait(50);
    OnRev(OUT_A+OUT_C);
    while(SENSOR_1>35||SENSOR_2>45)
    {
       if(SENSOR_1>35&&SENSOR_2>45)
       {
          OnRev(OUT_A+OUT_C);
       }
      if(SENSOR_1<35&&SENSOR_2>45)
      { 
         OnRev(OUT_C);Off(OUT_A);
      }
      if(SENSOR_1>35&&SENSOR_2<45)
      {
         OnRev(OUT_A);Off(OUT_C);
      }
   }
   Off(OUT_A+OUT_C);
   Wait(50);
}
//   (2)バック
sub line_back() 
{
  PlaySound(SOUND_DOUBLE_BEEP) ;
  OnFwd(OUT_A+OUT_C);
  Wait(260);
  Off(OUT_A+OUT_C);
  Wait(50);
}
sub go_straight() 
{
   PlaySound(SOUND_LOW_BEEP) ;
   OnFwd(OUT_C);OnRev(OUT_A);Wait(10);
   OnFwd(OUT_A);OnRev(OUT_C);Wait(10);
   OnRev(OUT_A+OUT_C);Wait(50);
   OnRev(OUT_A+OUT_C);
   until(SENSOR_1<35&&SENSOR_2<45);
   Off(OUT_A+OUT_C);
   Wait(50);
}
//  (4)ゴール
sub goal()
{
   PlaySound(SOUND_FAST_UP) ;
   OnRev(OUT_A+OUT_B+OUT_C);
   Wait(50);
   OnRev(OUT_A+OUT_B+OUT_C);
   while(SENSOR_3==0)
   {
      if(SENSOR_1>35&&SENSOR_2>45)
      {
         OnRev(OUT_A+OUT_B+OUT_C);
      }
      if(SENSOR_1<35&&SENSOR_2>45)
      {
         OnRev(OUT_B+OUT_C);Off(OUT_A);
      }
      if(SENSOR_1>35&&SENSOR_2<45)
      {
         OnRev(OUT_A+OUT_B);Off(OUT_C);
      }
   }
   Off(OUT_A+OUT_B+OUT_C);
}
//------マクロの指定(改行してある)-------------
//    (5)左回転 
#define turn_left(t)
  PlaySound(SOUND_UP);
  OnRev (OUT_A+OUT_C);Wait(50);
  OnFwd(OUT_A);OnRev(OUT_C);Wait(t);
  Off(OUT_A+OUT_C);
  OnFwd(OUT_C);OnRev(OUT_A);Wait(10);
  OnFwd(OUT_A);OnRev(OUT_C);Wait(10);
  Off(OUT_A+OUT_C);Wait(50);
//      (6)右回転
#define turn_right(t)
 PlaySound(SOUND_UP) ;
 OnRev(OUT_A+OUT_C);Wait(50);
 OnFwd(OUT_C);OnRev(OUT_A);Wait(t);
 Off(OUT_A+OUT_C);
 OnFwd(OUT_C);OnRev(OUT_A);Wait(10);
 OnFwd(OUT_A);OnRev(OUT_C);Wait(10);
 Off(OUT_A+OUT_C);Wait(50);
//===================================
//=============メイン================
//===================================
task main() 
{
   SetPower(OUT_A,10);
   SetPower(OUT_C,10);
   SetSensor (SENSOR_1, SENSOR_LIGHT);
   SetSensor (SENSOR_3, SENSOR_TOUCH);
   SetSensor (SENSOR_2, SENSOR_LIGHT);
   PlaySound(SOUND_LOW_BEEP) ;
   Wait(1000);
   OnRev(OUT_A+OUT_C);
   until(SENSOR_1<35&&SENSOR_2<45);
   Off(OUT_A+OUT_C);
   Wait(50);
   repeat (3)
   {
      line_straight ();
      turn_right(100);
      line_straight();
      line_straight();
      turn_right(100);
      OnRev(OUT_B);
      line_straight();
      OnRev(OUT_A+OUT_C);
      Wait(50);
      Off(OUT_A+OUT_B+OUT_C);
      Wait(50);
      OnFwd(OUT_B);
      line_back ();
      Off(OUT_B);
      turn_right(170);
      line_straight();
      line_straight();
      turn_left(150);
      OnFwd(OUT_A+OUT_B+OUT_C);
      Wait(150);
      Off(OUT_A+OUT_B+OUT_C);
      OnRev(OUT_C);OnFwd(OUT_A);Wait(30);
      OnRev(OUT_A);OnFwd(OUT_C);Wait(30);
      Off(OUT_A+OUT_C);
      line_straight();
      line_straight();
      go_straight();
      line_straight();
      turn_left(160);
      line_straight();
      line_straight();
      turn_left(160);
      goal();
      OnFwd(OUT_A+OUT_C);
      Wait(200);
      Off(OUT_A+OUT_C);
      turn_left(100);
      line_straight();
      line_straight();
      turn_right (100);
      OnFwd(OUT_A+OUT_C);
      Wait(120);
      Off(OUT_A+OUT_C);
      line_straight();
      line_straight();
      go_straight();
    }
}

プログラムの解説

マクロ、サブルーチン編 〜首をふれ、首を!〜

(1)直進トレース

sub line_straight() 
{
    PlaySound(SOUND_DOUBLE_BEEP) ; //ピーピーと音を鳴らす
   OnRev(OUT_A+OUT_C);       //少しだけ直進
    Wait(50);
    OnRev(OUT_A+OUT_C);
    while(SENSOR_1>35||SENSOR_2>45) //センサー1,2のどちらかが黒線に乗っていないとき
    {
       if(SENSOR_1>35&&SENSOR_2>45) //1,2の両方とも黒線に乗っていないとき
       {
          OnRev(OUT_A+OUT_C); //そのまま直進
       }
      if(SENSOR_1<35&&SENSOR_2>45) //1が黒線に乗ったとき
      { 
         OnRev(OUT_C);Off(OUT_A);  //Cを回転して軌道修正
      }
      if(SENSOR_1>35&&SENSOR_2<45) //3が黒線に乗ったとき
      {
         OnRev(OUT_A);Off(OUT_C);  //Aを回転して軌道修正
      }
   }
   Off(OUT_A+OUT_C); //1,2共に黒線に乗ったとき、停止
   Wait(50);
}

(2)バック

sub line_back() 
{
  PlaySound(SOUND_DOUBLE_BEEP) ;
  OnFwd(OUT_A+OUT_C);
  Wait(260);
  Off(OUT_A+OUT_C);
  Wait(50);
}

(3)直進トレースなし

sub go_straight() 
{
   PlaySound(SOUND_LOW_BEEP) ;
   OnFwd(OUT_C);OnRev(OUT_A);Wait(10); // 首
   OnFwd(OUT_A);OnRev(OUT_C);Wait(10); // 振り
   OnRev(OUT_A+OUT_C);Wait(50);
   OnRev(OUT_A+OUT_C);
   until(SENSOR_1<35&&SENSOR_2<45);
   Off(OUT_A+OUT_C);
   Wait(50);
}

(4)ゴール

sub goal()
{
   PlaySound(SOUND_FAST_UP) ;
   OnRev(OUT_A+OUT_B+OUT_C);
   Wait(50);
   OnRev(OUT_A+OUT_B+OUT_C);
   while(SENSOR_3==0)
   {
      if(SENSOR_1>35&&SENSOR_2>45)
      {
         OnRev(OUT_A+OUT_B+OUT_C);
      }
      if(SENSOR_1<35&&SENSOR_2>45)
      {
         OnRev(OUT_B+OUT_C);Off(OUT_A);
      }
      if(SENSOR_1>35&&SENSOR_2<45)
      {
         OnRev(OUT_A+OUT_B);Off(OUT_C);
      }
   }
   Off(OUT_A+OUT_B+OUT_C);
}

(5)左回転 

#define turn_left(t)
  PlaySound(SOUND_UP);
  OnRev (OUT_A+OUT_C);Wait(50);
  OnFwd(OUT_A);OnRev(OUT_C);Wait(t);
  Off(OUT_A+OUT_C);
  OnFwd(OUT_C);OnRev(OUT_A);Wait(10); //
  OnFwd(OUT_A);OnRev(OUT_C);Wait(10); //首振り
  Off(OUT_A+OUT_C);Wait(50);      //

(6)右回転

#define turn_right(t)
 PlaySound(SOUND_UP) ;
 OnRev(OUT_A+OUT_C);Wait(50);
 OnFwd(OUT_C);OnRev(OUT_A);Wait(t);
 Off(OUT_A+OUT_C);
 OnFwd(OUT_C);OnRev(OUT_A);Wait(10);
 OnFwd(OUT_A);OnRev(OUT_C);Wait(10);
 Off(OUT_A+OUT_C);Wait(50);

メインタスク編 〜先生!腰が限界です〜

task main() 
{
   SetPower(OUT_A,10);
   SetPower(OUT_C,10);
   SetSensor (SENSOR_1, SENSOR_LIGHT);
   SetSensor (SENSOR_3, SENSOR_TOUCH);
   SetSensor (SENSOR_2, SENSOR_LIGHT);
      line_straight();  //(1)
      line_straight();  //(1)
      go_straight();    //(3)
    }               //ここまでを3回繰り返す
}
1、解説 バック〜スタート地点.JPG

添付ファイル: fileD1000022.JPG 276件 [詳細] fileD1000025.JPG 138件 [詳細] fileD1000028.JPG 262件 [詳細] fileD1000026.JPG 253件 [詳細] fileD1000027.JPG 247件 [詳細] file1、解説 バック〜スタート地点.JPG 245件 [詳細] file1、解説 ゴール〜バック.JPG 255件 [詳細] file1、解説 直進〜ゴール.JPG 276件 [詳細] file1、解説 バック〜直進.JPG 275件 [詳細] file1、解説 キャッチ〜バック.JPG 252件 [詳細] file1、解説 スタート〜キャッチ.JPG 250件 [詳細]

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