目次

はじめに

今回の課題は、下図の黒い線をたどっていくロボットとプログラムを作りゴールを目指すというものである。
私は「E地点直進プログラム」を作った。
A→E→F→Q→R→S→G→H→T→T→R→S→P→E→A と進んでいく。

2017a-mission2.png

ロボットの説明

今回のロボットは小回りをきかせるために出来るだけ車体を小さくし、前方に光センサーを取り付けた。
光センサーと車体の位置を極力近づけることで、旋回半径を小さくすることに成功した。
車体を二輪で作る案も検討したが、安定性と正確性を考慮した結果四輪にすることにした。

IMG_0793.JPG
IMG_0797.JPG
IMG_0800.JPG

プログラムについて

定義

メインタスクを少しでも簡略化するためにいくつかの決まった動作を定義した。

#define sikii 40
#define migi Off(OUT_C);OnFwd(OUT_A);Off(OUT_AC);Wait(2);
#define hidari Off(OUT_A);OnFwd(OUT_C);Off(OUT_AC);Wait(2);
#define migisen OnRev(OUT_C);OnFwd(OUT_A);Wait(2);Off(OUT_AC);Wait(2);
#define hidarisen PlaySound(SOUND_UP);OnFwd(OUT_AC);Wait(43);OnFwd(OUT_C);  OnRev(OUT_A);Wait(22);OnRev(OUT_A);Wait(82);Off(OUT_AC);
#define hidarimage    OnFwd(OUT_AC);Wait(43);OnFwd(OUT_C);OnRev(OUT_A);Wait(15);OnRev(OUT_A);Wait(50);Off(OUT_AC);
#define oto  PlaySound(SOUND_DOWN);Off(OUT_AC);Wait(100);
#define mae OnFwd(OUT_AC);Wait(20);

メインタスク

メインタスクでは、タイマー式ではなくカウントアップ方式を採用した。
最初の方はタイマー式で挑戦していたが誤作動が多く電池にも左右されやすいことからカウントアップ方式にした。
変数を大量に使ったため非常に長いプログラムとなった。

task main()
 {
  SetSensor(SENSOR_1, SENSOR_LIGHT);

  int n=0;

  while(n < 3){
  OnFwd(OUT_AC); 
  if(SENSOR_1 >= 50){
  migisen;
  }else if(SENSOR_1 >= sikii){
  migi;
  }else if(SENSOR_1 >= 36){
  hidari;
  }else if(SENSOR_1 <= 35){
  hidari;
  n++;
  }
 }
 hidarisen;   //F
  int l=0;

  while(l < 3){
  OnFwd(OUT_AC); 
  if(SENSOR_1 >= 50){
  migisen;
  }else if(SENSOR_1 >= sikii){
  migi;
  }else if(SENSOR_1 >= 36){
  hidari;
  }else if(SENSOR_1 <= 35){
  hidari;
  l++;
  }
 }
  
  oto;
  hidarisen;   //Q

  int m=0;

  while(m < 3){
  OnFwd(OUT_AC); 
  if(SENSOR_1 >= 50){
  migisen;
  }else if(SENSOR_1 >= sikii){
  migi;
  }else if(SENSOR_1 >= 36){
  hidari;
  }else if(SENSOR_1 <= 35){
  hidari;
  m++;
  }
 }

   mae;      //R
   int o=0;

  while(o < 3){
  OnFwd(OUT_AC); 
  if(SENSOR_1 >= 50){
  migisen;
  }else if(SENSOR_1 >= sikii){
  migi;
  }else if(SENSOR_1 >= 36){
  hidari;
  }else if(SENSOR_1 <= 35){
  hidari;
  o++;
  }
 }

 hidarimage;      //S

  int p=0;
 while(p < 3){
  OnFwd(OUT_AC); 
  if(SENSOR_1 >= 50){
  migisen;
  }else if(SENSOR_1 >= sikii){
  migi;
  }else if(SENSOR_1 >= 36){
  hidari;
  }else if(SENSOR_1 <= 35){
  hidari;
  p++;
  }
 }

 hidarisen;         //G
 int q=0;
 while(q < 3){
  OnFwd(OUT_AC); 
  if(SENSOR_1 >= 50){
  migisen;
  }else if(SENSOR_1 >= sikii){
  migi;
  }else if(SENSOR_1 >= 36){
  hidari;
  }else if(SENSOR_1 <= 35){
  hidari;
  q++;
  }
 }
 
 OnFwd(OUT_C);
 Wait(200);
 OnRev(OUT_A);
 Wait(100);
 Off(OUT_AC);

 int k=0;

  while(k < 3){
  OnFwd(OUT_AC); 
  if(SENSOR_1 >= 50){
  migisen;
  }else if(SENSOR_1 >= sikii){
  migi;
  }else if(SENSOR_1 >= 36){
  hidari;
  }else if(SENSOR_1 <= 35){
  hidari;
  k++;
  }
 }

 hidarisen;  //H

 int c=0;
 while(c < 3){
  OnFwd(OUT_AC); 
  if(SENSOR_1 >= 50){
  migisen;
  }else if(SENSOR_1 >= sikii){
  migi;
  }else if(SENSOR_1 >= 36){
  hidari;
  }else if(SENSOR_1 <= 35){
  hidari;
  c++;
  }
 }
  PlaySound(SOUND_DOWN);Off(OUT_AC);Wait(100);
  mae;  //T1

 int r=0;
 while(r < 3){
  OnFwd(OUT_AC); 
  if(SENSOR_1 >= 50){
  migisen;
  }else if(SENSOR_1 >= sikii){
  migi;
  }else if(SENSOR_1 >= 36){
  hidari;
  }else if(SENSOR_1 <= 35){
  hidari;
  r++;
  }
 }

 PlaySound(SOUND_DOWN);Off(OUT_AC);Wait(100);
  mae;    //T2 

 int y=0;
 
 while(y < 3){
  OnFwd(OUT_AC); 
  if(SENSOR_1 >= 50){
  migisen;
  }else if(SENSOR_1 >= sikii){
  migi;
  }else if(SENSOR_1 >= 36){
  hidari;
  }else if(SENSOR_1 <= 35){
  hidari;
  y++;
  }
 }
  
  oto;
  hidarisen;  //R

  int e=0;

  while(e < 3){
  OnFwd(OUT_AC); 
  if(SENSOR_1 >= 50){
  migisen;
  }else if(SENSOR_1 >= sikii){
  migi;
  }else if(SENSOR_1 >= 36){
  hidari;
  }else if(SENSOR_1 <= 35){
  hidari;
  e++;
  }
 }

 OnFwd(OUT_AC);
 Wait(20);      //S
   int a=0;

  while(a < 3){
  OnFwd(OUT_AC); 
  if(SENSOR_1 >= 50){
  migisen;
  }else if(SENSOR_1 >= sikii){
  migi;
  }else if(SENSOR_1 >= 36){
  hidari;
  }else if(SENSOR_1 <= 35){
  hidari;
  a++;
  }
 }
  hidarimage;     //P

  int g=0;
 while(g < 3){
  OnFwd(OUT_AC); 
  if(SENSOR_1 >= 50){
  migisen;
  }else if(SENSOR_1 >= sikii){
  migi;
  }else if(SENSOR_1 >= 36){
  hidari;
  }else if(SENSOR_1 <= 35){
  hidari;
  g++;
  }
 }
 PlaySound(SOUND_DOWN);Off(OUT_AC);Wait(100);
 hidarisen;   //E
 int d=0;
 while(d < 3){
  OnFwd(OUT_AC); 
  if(SENSOR_1 >= 50){
  migisen;
  }else if(SENSOR_1 >= sikii){
  migi;
  }else if(SENSOR_1 >= 36){
  hidari;
  }else if(SENSOR_1 <= 35){
  hidari;
  d++;
  }
 }
 OnFwd(OUT_AC);
 Wait(50);

 }

感想・反省

今回の反省点は、メインプログラムが長くなってしまったことである。タイマー式ではなくカウントUP方式を採用したためwhileのたびに違う変数を定義したためどうしても簡略化することが出来なかった。一度簡略化したプログラムで試したところ理由はわからないが誤作動が多発してしまった。まだまだプログラミングの知識が足りないのでもっと勉強していきたい。。
反省点はあるものの、しっかりとゴールし与えられた課題をクリアできたのはうれしく達成感を得ることが出来た。また、前回よりも複雑なプログラムを作ったのでプログラミングの力は少しずつではあるがついてきている。次回は今回の反省を生かしてより美しいプログラムを作っていきたい。


添付ファイル: fileIMG_0797.JPG 83件 [詳細] fileIMG_0793.JPG 84件 [詳細] fileIMG_0800.JPG 76件 [詳細] file2017a-mission2.png 74件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-07-07 (金) 16:17:26