2011b

目次

課題

  • 脱線しないように、黒線に沿って進むロボットを作る。
  • 1周目は普通の黒線を通り、2周目は近道へ進むプログラムを作る。

意気込み

  • だい------工学部電気電子工学科。前回より完成度の高いロボットを作りたい。
  • AU--------工学部電気電子工学科。

ロボット

正面

本体正面.JPG

出来るだけ動きやすいように車体を小さくし、車輪と光センサーの幅が同じになるようにしました。

本体裏.JPG

二輪にすると不安定なので、三輪になるように調整しました

プログラム

道のり.JPG
  • 1週目は1→2→3→4→5→6→7
  • 2週目は1→2→3→4→8→6→7 で進むようなプログラムを作りました。    

ライントレース(道のり)

だい

プログラムを作って、最も苦戦したのはロータリーの部分です。走る度にずれが出来てしまうので、そこの部分も計算に入れて、正しい道を選択できるようにしました。

#define BLACK 40
#define Right OnFwd(OUT_A);OnRev(OUT_C);//右に曲がる
#define Ri OnFwd(OUT_A);Off(OUT_C);//右に曲がる(ロータリー専用)
#define Left OnRev(OUT_A);OnFwd(OUT_C);//左に曲がる
#define Le Off(OUT_A);OnFwd(OUT_C);//左に曲がる(ロータリー専用)
#define Straight OnFwd(OUT_A+OUT_C);//直進
#define Go(t) OnFwd(OUT_A+OUT_C);Wait(t);//直進(時間指定)
int double =0;//センサー1、3が黒になった回数
int pass =0;//ロータリーでセンサー1のみが黒になった回数
int jubge =0;//センサー3のみ黒になった時、判断する
void basic()
{if((SENSOR_1 < BLACK) && (SENSOR_3 > BLACK)) {Left;}//センサー1が黒、センサー3が白
 if((SENSOR_1 > BLACK) && (SENSOR_3 < BLACK)) {Right;}//センサー1が白、センサー3が黒
 if((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK)) {Straight;}//センサー1、センサー3が白
 if((SENSOR_1 < BLACK) && (SENSOR_3 < BLACK)) {PlaySound(SOUND_UP);
                                               Straight;until((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK));double++;}//センサー1、センサー3が黒    
 }
void rotary()
{if((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK)) {Straight;}//センサー1、センサー3が白
 if((SENSOR_1 < BLACK) && (SENSOR_3 > BLACK)) {Left;}//センサー1が黒、センサー3が白
 if((SENSOR_1 > BLACK) && (SENSOR_3 < BLACK)) {PlaySound(SOUND_UP);
                                               Le;until(SENSOR_3 > BLACK);pass++;}//センサー1が白、センサー3が黒
 if((SENSOR_1 < BLACK) && (SENSOR_3 < BLACK)) {PlaySound(SOUND_DOUBLE_BEEP);
                                               Le;until(SENSOR_3 > BLACK);pass++;}//センサー1、センサー3が黒
 }
void rot()
 {if((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK)) {Straight;}//センサー1、センサー3が白
  if((SENSOR_1 < BLACK) && (SENSOR_3 > BLACK)) {Left;}//センサー1が黒、センサー3が白
  if((SENSOR_1 > BLACK) && (SENSOR_3 < BLACK)) {PlaySound(SOUND_UP);
                                                Ri;until(SENSOR_1 < BLACK);
                                                Ri;until((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK));pass++;}//センサー1が白、センサー3が黒
  if((SENSOR_1 < BLACK) && (SENSOR_3 < BLACK)) {PlaySound(SOUND_DOUBLE_BEEP);
                                                Ri;until((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK));pass++;}//センサー1、センサー3が黒
  } 
void standard()
{if((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK)) {Straight;}//センサー1、センサー3が白
 if((SENSOR_1 > BLACK) && (SENSOR_3 < BLACK)) {Right;}//センサー1が白、センサー3が黒
 if((SENSOR_1 < BLACK) && (SENSOR_3 < BLACK)) {PlaySound(SOUND_DOUBLE_BEEP);Le;until((SENSOR_1 > BLACK) && (SENSOR_3 < BLACK));double++;}//センサー1、センサー3が黒
 if((SENSOR_1 < BLACK) && (SENSOR_3 > BLACK)) {Left;}//センサー1が黒、センサー3が白
}

void final()
{if((SENSOR_1 < BLACK) && (SENSOR_3 > BLACK)) {Left;}//センサー1が黒、センサー3が白
 if((SENSOR_1 > BLACK) && (SENSOR_3 < BLACK)) {Right;}//センサー1が白、センサー3が黒
 if((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK)) {Straight;}//センサー1、センサー3が白
 if((SENSOR_1 < BLACK) && (SENSOR_3 < BLACK)) {Le;until(SENSOR_3 > BLACK);double++;}//センサー1、センサー3が黒
 }
task main()
{SetSensor(SENSOR_1, SENSOR_LIGHT);//センサー1が光センサー
 SetSensor(SENSOR_3, SENSOR_LIGHT);//センサー3が光センサー
 while(double!=1){basic();}
 double =0;
 Le;
 until(SENSOR_3 < BLACK);
 Ri;
 until(SENSOR_1 > BLACK);
 while(double!=1){basic();}
 double =0;
 Ri;
 until((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK));
 Ri;
 until(SENSOR_1 < BLACK);
 while(pass!=1){rotary();}
 pass =0;
 while(pass!=1){rot();}
 pass =0;
 while(double!=2){basic();}
 double =0;
 while(double!=1)
 {if((SENSOR_1 < BLACK) && (SENSOR_3 > BLACK)){Le;until(SENSOR_3 < BLACK);}//センサー1が黒、センサー3が白
  if((SENSOR_1 > BLACK) && (SENSOR_3 < BLACK)){Ri;until(SENSOR_1 < BLACK);}{Right;}//センサー1が白、センサー3が黒
  if((SENSOR_1 < BLACK) && (SENSOR_3 < BLACK)){PlaySound(SOUND_UP);Right;until((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK));
                                               Ri;until(SENSOR_1 < BLACK);double++;}//センサー1、センサー3が黒
  if((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK)){Le;until(SENSOR_3 < BLACK);}//センサー1、センサー3が白                                                          double++;}//センサー1、センサー3が黒
  }
 double =0;
 Ri;
 until(SENSOR_3 > BLACK);
 while(double!=1)
{if((SENSOR_1 < BLACK) && (SENSOR_3 > BLACK)) {Left;}//センサー1が黒、センサー3が白
 if((SENSOR_1 > BLACK) && (SENSOR_3 < BLACK)) {Right;}//センサー1が白、センサー3が黒
 if((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK)) {Straight;}//センサー1、センサー3が白
 if((SENSOR_1 < BLACK) && (SENSOR_3 < BLACK)) {PlaySound(SOUND_UP);double++;}//センサー1、センサー3が黒
 }
 Ri;
 until(SENSOR_1 > BLACK);
 double =0;
 while(double!=1){basic();}
 double!=0;
 
 Ri;
 until((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK));
 Ri;
 until(SENSOR_1 < BLACK);
 while(pass!=1){rotary();}
 pass =0;
 while(pass!=1){rot();}
 pass =0;
 
 Ri;until(SENSOR_1 < BLACK);
 while(double!=2){basic();}
 double =0;
 Ri;
 until(SENSOR_1 < BLACK);
 Straight;
 until(SENSOR_3 > BLACK);
 while(double!=1){final();}
 double =0;
 while(double!=1){basic();}
 Straight;
 until((SENSOR_1 < BLACK) && (SENSOR_3 < BLACK));
 Straight;
 until((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK));
 
 while(double!=2){basic();}
 double =0;
 Le;
 until(SENSOR_3 < BLACK);
 Ri;
 until(SENSOR_1 > BLACK);
 while(double!=1){basic();}
 double =0;
 Ri;
 until((SENSOR_1 > BLACK) && (SENSOR_3 < BLACK));
 Ri;
 until(SENSOR_1 < BLACK);
 while(pass!=1){rotary();}
 pass =0;
 while(pass!=1){rot();}
 pass =0;
 while(double!=2){basic();}
 double =0;
 while(double!=1)
 {if((SENSOR_1 < BLACK) && (SENSOR_3 > BLACK)){Le;until(SENSOR_3 < BLACK);}//センサー1が黒、センサー3が白
  if((SENSOR_1 > BLACK) && (SENSOR_3 < BLACK)){Ri;until(SENSOR_1 < BLACK);}{Right;}//センサー1が白、センサー3が黒
  if((SENSOR_1 < BLACK) && (SENSOR_3 < BLACK)){Right;until((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK));
                                              double++;}//センサー1、センサー3が黒
  if((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK)){Le;until(SENSOR_3 < BLACK);}//センサー1、センサー3が白                                                          double++;}//センサー1、センサー3が黒
  }
 double =0;
 while(double!=1){basic();}
 double =0;
 Le;
 until(SENSOR_3 > BLACK);
 while(double!=1){basic();} 
 double!=0;
 Right;
 until(SENSOR_3 > BLACK);
 Ri;
 until(SENSOR_1 < BLACK);
 while(pass!=1){rotary();}
 pass =0;
 while(pass!=1){rot();}
 pass =0;
 Ri;until(SENSOR_1 < BLACK);
 while(double!=2){basic();}
 double =0;
 Ri;
 until(SENSOR_1 < BLACK);
 Straight;
 until(SENSOR_3 > BLACK);
 while(double!=1){final();}
 double =0;
 while(double!=1){basic();}
 Off(OUT_A+OUT_C);
 }

AU

Timerを使うと毎回多少の違いが出てしまうので使わないようにしてみた。

#define BLACK 40
#define Right OnFwd(OUT_A);OnRev(OUT_C);//右に曲がる
#define RI(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);//右に曲がる(時間指定)
#define Left OnRev(OUT_A);OnFwd(OUT_C);//左に曲がる
#define Straight OnFwd(OUT_A+OUT_C);//直進
#define ST(t) OnFwd(OUT_A+OUT_C);Wait(t);
#define Stop(t) Off(OUT_A+OUT_C);Wait(t);
int a =0;//センサー1、3が黒になった回数
int b =0;//ロータリーでセンサー3のみが黒になった回数
task main()
{ SetSensor(SENSOR_1, SENSOR_LIGHT);//センサー1が光センサー
  SetSensor(SENSOR_3, SENSOR_LIGHT);//センサー3が光センサー
  while(a!=2)
  {if((SENSOR_1 < BLACK) && (SENSOR_3 > BLACK)) {Left;}//センサー1が黒、センサー3が白
   if((SENSOR_1 > BLACK) && (SENSOR_3 < BLACK)) {Right;}//センサー1が白、センサー3が黒
   if((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK)) {Straight;}//センサー1、センサー3が白
   if((SENSOR_1 < BLACK) && (SENSOR_3 < BLACK)) {PlaySound(SOUND_CLICK);Stop(50);a++;ST(30);}//センサー1、センサー3が黒    
   }
  a =0;
  PlaySound(SOUND_UP);
  RI(50);
 while(b!=2)
  {if((SENSOR_1 < BLACK) && (SENSOR_3 > BLACK)) {Left;}//センサー1が黒、センサー3が白
   if((SENSOR_1 > BLACK) && (SENSOR_3 < BLACK)) {PlaySound(SOUND_DOUBLE_BEEP);Stop(50);b++;ST(30);}//センサー1が白、センサー3が黒
   if((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK)) {Straight;}//センサー1、センサー3が白
   if((SENSOR_1 < BLACK) && (SENSOR_3 < BLACK)) {Straight;}//センサー1、センサー3が黒   
   } 
 b =0;
 RI(50);
 PlaySound(SOUND_UP);
 while(a!=2)
  {if((SENSOR_1 < BLACK) && (SENSOR_3 > BLACK)) {Left;}//センサー1が黒、センサー3が白
   if((SENSOR_1 > BLACK) && (SENSOR_3 < BLACK)) {Right;}//センサー1が白、センサー3が黒
   if((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK)) {Straight;}//センサー1、センサー3が白
   if((SENSOR_1 < BLACK) && (SENSOR_3 < BLACK)) {PlaySound(SOUND_CLICK);Straight;a++;}//センサー1、センサー3が黒
   }
 a =0;
Left;until((SENSOR_1 > BLACK) && (SENSOR_3 < BLACK ));
while(b!=1)
 {if((SENSOR_1 < BLACK) && (SENSOR_3 > BLACK)) {Left;until((SENSOR_1 > BLACK) && (SENSOR_3 < BLACK)) }//センサー1が黒、センサー3が白
  if((SENSOR_1 > BLACK) && (SENSOR_3 < BLACK)) {Straight;}//センサー1が白、センサー3が黒
  if((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK)) {Right;until((SENSOR_1 > BLACK) && (SENSOR_3 < BLACK))}//センサー1、センサー3が白
Straight(60);
while(a!=2)
  {if((SENSOR_1 < BLACK) && (SENSOR_3 > BLACK)) {Left;}//センサー1が黒、センサー3が白
   if((SENSOR_1 > BLACK) && (SENSOR_3 < BLACK)) {Right;}//センサー1が白、センサー3が黒
   if((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK)) {Straight;}//センサー1、センサー3が白
   if((SENSOR_1 < BLACK) && (SENSOR_3 < BLACK)) {PlaySound(SOUND_CLICK);Straight;a++;}//センサー1、センサー3が黒
   }
 a =0;
 RI(60);
 PlaySound(SOUND_UP);
 Straight(10);
 while(b!=2)
  {if((SENSOR_1 < BLACK) && (SENSOR_3 > BLACK)) {Left;}//センサー1が黒、センサー3が白
   if((SENSOR_1 > BLACK) && (SENSOR_3 < BLACK)) {PlaySound(SOUND_DOUBLE_BEEP);Straight;b++;}//センサー1が白、センサー3が黒
   if((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK)) {Straight;}//センサー1、センサー3が白
   if((SENSOR_1 < BLACK) && (SENSOR_3 < BLACK)) {Straight;}//センサー1、センサー3が黒   
   } 
 b =0;
 RI(60);
 PlaySound(SOUND_UP);
 while(a!=3)
  {if((SENSOR_1 < BLACK) && (SENSOR_3 > BLACK)) {Left;}//センサー1が黒、センサー3が白
   if((SENSOR_1 > BLACK) && (SENSOR_3 < BLACK)) {Right;}//センサー1が白、センサー3が黒
   if((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK)) {Straight;}//センサー1、センサー3が白
   if((SENSOR_1 < BLACK) && (SENSOR_3 < BLACK)) {PlaySound(SOUND_CLICK);Straight;a++;}//センサー1、センサー3が黒
   }
 a =0;
while(a!=1)
  {if((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK)) {Straight;}//センサー1、センサー3が白
   if((SENSOR_1 < BLACK) && (SENSOR_3 < BLACK)) {PlaySound(SOUND_CLICK);Stop(50);a++;ST(30);}//センサー1、センサー3が黒 
 a =0;
while(a!=2)
  {if((SENSOR_1 < BLACK) && (SENSOR_3 > BLACK)) {Left;}//センサー1が黒、センサー3が白
   if((SENSOR_1 > BLACK) && (SENSOR_3 < BLACK)) {Right;}//センサー1が白、センサー3が黒
   if((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK)) {Straight;}//センサー1、センサー3が白
   if((SENSOR_1 < BLACK) && (SENSOR_3 < BLACK)) {PlaySound(SOUND_CLICK);Stop(50);a++;ST(30);}//センサー1、センサー3が黒    
   }
  a =0;
  PlaySound(SOUND_UP);
  RI(50);
while(b!=2)
  {if((SENSOR_1 < BLACK) && (SENSOR_3 > BLACK)) {Left;}//センサー1が黒、センサー3が白
   if((SENSOR_1 > BLACK) && (SENSOR_3 < BLACK)) {PlaySound(SOUND_DOUBLE_BEEP);Stop(50);b++;ST(30);}//センサー1が白、センサー3が黒
   if((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK)) {Straight;}//センサー1、センサー3が白
   if((SENSOR_1 < BLACK) && (SENSOR_3 < BLACK)) {Straight;}//センサー1、センサー3が黒   
   } 
 b =0;
 RI(50);
 PlaySound(SOUND_UP);
 while(a!=3)
  {if((SENSOR_1 < BLACK) && (SENSOR_3 > BLACK)) {Left;}//センサー1が黒、センサー3が白
   if((SENSOR_1 > BLACK) && (SENSOR_3 < BLACK)) {Right;}//センサー1が白、センサー3が黒
   if((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK)) {Straight;}//センサー1、センサー3が白
   if((SENSOR_1 < BLACK) && (SENSOR_3 < BLACK)) {PlaySound(SOUND_CLICK);Straight;a++;}//センサー1、センサー3が黒
   }
 a =0;
 RI(60);
 PlaySound(SOUND_UP);
 Straight(10);
 while(b!=2)
  {if((SENSOR_1 < BLACK) && (SENSOR_3 > BLACK)) {Left;}//センサー1が黒、センサー3が白
   if((SENSOR_1 > BLACK) && (SENSOR_3 < BLACK)) {PlaySound(SOUND_DOUBLE_BEEP);Straight;b++;}//センサー1が白、センサー3が黒
   if((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK)) {Straight;}//センサー1、センサー3が白
   if((SENSOR_1 < BLACK) && (SENSOR_3 < BLACK)) {Straight;}//センサー1、センサー3が黒   
   } 
 b =0;
 RI(60);
 PlaySound(SOUND_UP);
 while(a!=3)
  {if((SENSOR_1 < BLACK) && (SENSOR_3 > BLACK)) {Left;}//センサー1が黒、センサー3が白
   if((SENSOR_1 > BLACK) && (SENSOR_3 < BLACK)) {Right;}//センサー1が白、センサー3が黒
   if((SENSOR_1 > BLACK) && (SENSOR_3 > BLACK)) {Straight;}//センサー1、センサー3が白
   if((SENSOR_1 < BLACK) && (SENSOR_3 < BLACK)) {PlaySound(SOUND_CLICK);Straight;a++;}//センサー1、センサー3が黒
   }
 a =0;
 OFF(OUT_A+OUT_C);
 }

工夫点

  • 車体については、二輪にして前にボタンをつけることで、安定を増すようにしました。
  • プログラムは、ロータリー用とそれ以外の道用で分けるようにしました。

反省点

前回より新しく学ぶ部分も多かったが、ロボットの改良に手間取ってしまい、プロブラムを作る時間が短くなってしまった。また、ロータリーの時のプログラムが難しかった。 次回はこれを機会に、より良いロボットとプログラムを作れるようにしたい。

コメント


添付ファイル: file道のり.JPG 215件 [詳細] file本体裏.JPG 216件 [詳細] file本体正面.JPG 224件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-12-29 (木) 20:10:33 (2736d)