*ロボットの紹介 [#xad7c17c]
-アームの部分が予定より大きくなってしまったので、ロボットの本体を少し後ろに設置することで重心が前に行き過ぎないようにしました。
-アームの形をシンプルにすることで、アームを壊れにくくしました。
-缶をつかむメインのアーム以外にも下に缶が倒れないようにサポートする動かないアームを取り付けましたが、それでもたまに倒れてしまうことがあり今後の課題です。
-タッチセンサーを使わないことで、缶が軽すぎて反応しないという問題点を解決しました。

*コース攻略 [#b8c0055d]
-タッチセンサーを使わないので、時間ごとにロボットの動きを変え攻略しました。
-閾値の値を変えることで交差点を渡るようにしました。
-時間ごとに区切ったプログラムが切り替わるごとに音を出すようにしたことで、どのプログラムがうまくいって、どのプログラムがうまくいかないのかが分かりやすくなりました。
-最後の缶を置くところは、ロボットが180度回転し缶を置いて少し下がりまた180度回転して元に戻りゴールに帰るというプログラムにしました。

*プログラムの説明 [#ab8ab5e8]
#define THRESHOLD 45
#define HIPOWER 7
#define LOWPOWER 2
#define set_power_H SetPower(OUT_AC,HIPOWER);
#define set_power_L SetPower(OUT_AC,LOWPOWER);
#define set_power_N SetPower(OUT_B,LOWPOWER);
#define go_fwd set_power_H; OnFwd(OUT_AC);
#define arm_fwd set_power_N; OnFwd(OUT_B);Wait(30);Off(OUT_B);
#define arm_bwd set_power_N; OnRev(OUT_B);Wait(30);Off(OUT_B);
#define turn_left1 set_power_L ;OnFwd(OUT_C);OnRev(OUT_A);
#define turn_left0 set_power_L ;\
  OnFwd(OUT_C);Off(OUT_A);
#define turn_right0 set_power_L ;\
  OnFwd(OUT_A);Off(OUT_C);
#define turn_right1 set_power_L ;\
  OnFwd(OUT_A);OnRev(OUT_C);
#define STEP 1
#define nMAX 200
#define short_break Off(OUT_AC); Wait(100);
#define CROSS_TIME 300
#define cross_line set_power_L;\
 OnFwd(OUT_A);OnRev(OUT_C);\
   Wait(CROSS_TIME);short_break;
task main () {
	SetSensor(SENSOR_2, SENSOR_LIGHT);
	int nOnline=0;
	ClearTimer(0);
 while(FastTimer(0)<=600){
  while(nOnline < nMAX && FastTimer(0)<=600){
    
   if(SENSOR_2< THRESHOLD -13) {
      turn_left1;
      nOnline++;
   }else{
    if(SENSOR_2< THRESHOLD -11){
     turn_left0;
   }else if(SENSOR_2< THRESHOLD -7){
     go_fwd;
   }else if(SENSOR_2< THRESHOLD -1){
     turn_right0;
   }else{
      turn_right1;
    }
    nOnline=0;
    }
    Wait(STEP);
   }
 }
	arm_fwd;
	PlaySound(SOUND_CLICK);
while(FastTimer(0)<=1600){
  while(nOnline < nMAX && FastTimer(0)<=1600){
   if(SENSOR_2< THRESHOLD -13) {
      turn_left1;
      nOnline++;
   }else{
    if(SENSOR_2< THRESHOLD -11){
     turn_left0;
   }else if(SENSOR_2< THRESHOLD -7){
     go_fwd;
   }else if(SENSOR_2< THRESHOLD -1){
     turn_right0;
   }else{
      turn_right1;
    }
    nOnline=0;
    }
    Wait(STEP);
   } 
 }
	PlaySound(SOUND_DOUBLE_BEEP);
	ClearTimer(0);
	turn_right1;
	Wait(10);
	arm_fwd;
while(FastTimer(0)<=1200){
  while(nOnline < nMAX && FastTimer(0)<=1200){
 
  
   if(SENSOR_2< THRESHOLD -15) {
      turn_right1;
      nOnline++;
   }else{
    if(SENSOR_2< THRESHOLD -13){
     turn_right0;
   }else if(SENSOR_2< THRESHOLD -7){
    go_fwd;
   }else if(SENSOR_2< THRESHOLD +2){
     turn_left0;
   }else{
      turn_left1;
    }
    nOnline=0;
    }
    Wait(STEP);
    }
 } 
	PlaySound(SOUND_DOWN); 
	turn_left1;
	Wait(10);
	arm_fwd;
 while(FastTimer(0)<=2000){
  while(nOnline < nMAX && FastTimer(0)<=2000){
   if(SENSOR_2< THRESHOLD -13) {
      turn_left1;
      nOnline++;
   }else{
    if(SENSOR_2< THRESHOLD -11){
     turn_left0;
   }else if(SENSOR_2< THRESHOLD -7){
     go_fwd;
   }else if(SENSOR_2< THRESHOLD -1){
     turn_right0;
   }else{
      turn_right1;
    }
    nOnline=0;
    }
    Wait(STEP);
   }
 }
	PlaySound(SOUND_LOW_BEEP);
	turn_right1;
	Wait(20);
	arm_fwd;
 while(FastTimer(0)<=2900){
  while(nOnline < nMAX && FastTimer(0)<=2900){
   if(SENSOR_2< THRESHOLD -15) {
      turn_right1;
      nOnline++;
   }else{
    if(SENSOR_2< THRESHOLD -13){
     turn_right0;
   }else if(SENSOR_2< THRESHOLD -7){
   go_fwd;
   }else if(SENSOR_2< THRESHOLD +2){
     turn_left0;
   }else{
      turn_left1;
    }
    nOnline=0;
    }
    Wait(STEP);
    } 
  } 
	PlaySound(SOUND_FAST_UP);
	arm_fwd;
 while(FastTimer(0)<=4500){
  while(nOnline < nMAX && FastTimer(0)<=4500){
   if(SENSOR_2< THRESHOLD -13) {
      turn_right1;
      nOnline++;
   }else{
    if(SENSOR_2< THRESHOLD -11){
     turn_right0;
   }else if(SENSOR_2< THRESHOLD -7){
     go_fwd;
   }else if(SENSOR_2< THRESHOLD -1){
     turn_left0;
   }else{
      turn_left1;
    }
    nOnline=0;
    }
    Wait(STEP);
   }
  }  
	PlaySound(SOUND_DOUBLE_BEEP);
	turn_left1; Wait(275);
	arm_bwd;
	OnRev(OUT_AC); Wait(100);
	turn_left1; Wait(275);
 while(FastTimer(0)<=5500){
  while(nOnline < nMAX && FastTimer(0)<=5500){
   if(SENSOR_2< THRESHOLD -13) {
      turn_left1;
      nOnline++;
   }else{
    if(SENSOR_2< THRESHOLD -11){
     turn_left0;
   }else if(SENSOR_2< THRESHOLD -7){
     go_fwd;
   }else if(SENSOR_2< THRESHOLD -1){
     turn_right0;
   }else{
      turn_right1;
    }
    nOnline=0;
    }
    Wait(STEP);
   }
	short_break;
	turn_right1;Wait(nMAX*STEP);
	cross_line;
	nOnline=0;
   }
}


*感想 [#q6db5aad]
-ライントレースをするロボットを作ることは実際にやってみるととても難しく、様々な困難がありました。しかしその問題点を解決するためにどのようなロボット、そしてプログラムにすればよいかといろいろと悩むことで、新しい発見ができました。例えば、電池の残量やロボット本体の重さ・重心などの様々な原因で光センサーの値や移動速度が変化してしまうので、常に同じ動きができるわけではない。ではその問題が動作そのものにできるだけ支障を出さないようにするにはどうすればよいか。それには、Waitをあまり使わないようにすることが大切です。Waitはある一定時間その動作を続けるというプログラムなので、電池残量が大きくかかわってしまうからです。このほかにもいろいろな問題点がありましたが、そのたびになぜそうなるのか、どうすればそうならないか、を考えることで、大変でしたが何とかできるようになったと思います。

*反省点 [#gc8ee745]
-自分のパソコンでUSBメモリが起動できず、ペアにとても迷惑をかけてしまった。
-この講義の勉強にあまり時間をかけられなかった。
-サブルーチンや関数などを完璧に理解できてない。

*まとめ [#rc4a5766]
-最初はプログラムが全く理解できずにとても戸惑った。一応の完成はしたが、理解できていないところも多くペアには本当に迷惑をかけてしまって申し訳なかった。
-成功するときもあったが失敗のが多いので、今回の反省点を見つめなおし次回の次の課題に活かしていきたい。

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS