[[2008a/A10/課題3右]]
*目次 [#d38a03e1]
#contents
*課題3:光を追いかけるロボット [#w5bbb5bc]
**課題 [#ra0a3f4b]
インストの「top secret」を参考にして、白いホイールを投げるロボットを作成し、以下の動きをするようにプログラムを作成せよ。
(重複しないように一人一つ以上のプログラムを作成すること)

1 全方向から懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げる。懐中電灯は動かさない。 

2 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。 

3 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいてブロックを投げる。
**条件 [#ab1aa0a3]
モーター、光センサー、タッチセンサーはそれぞれ2個まで使用可。
*マシンの紹介 [#w2a19f8e]
**課題・条件[#tdd460b5]
モーターが2個までしか使えないので走らせるので1個、ブロックを投げさせるために1個使う、計2個でいくことにした
***タイヤ [#t0f58c3a]
#ref(2008a/A10/課題3右/2.jpg,100%,全体)
1個のモーターでタイヤを回すためのものである
ディファレンシャルギアを用いることにより左右で違う回転をしてもちゃんと動くようにした。

原理としては左右のタイヤが同一方向に回転するときは外側の濃いグレーのパーツ全体が回り

左右で違う時は内側のギアが回転しずれを調整するようになっている。 
***光センサー [#ye1ba4f3]
#ref(2008a/A10/課題3右/1.jpg,100%,全体)
光をさがすためにも間隔を大きくあけた
光センサーの感覚が狭いと脱線しやすかったので

センサーの感覚を広げることで感知する範囲が広がり、脱線しにくくなった。
***ブロックを投げる部分 [#tefe84d6]
#ref(2008a/A10/課題3右/3.jpg,100%,全体)
上から振り下ろすようにして物を投げるようにした
アームにブロックを乗せ、上から振り下ろすようにして物を投げるようにした
*プログラム [#vfec59cf]
ここのチームは3人なので1人1つプログラムを担当するようにした

1 全方向から懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げる。懐中電灯は動かさない。 水上担当

2 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。 辻担当

3 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいてブロックを投げる。 吉村担当
**1 回転して最も明るい場所にブロックを投擲するプログラム [#l246bdc6]
 #define RUN_TIME 300    //一周する時間
 task  main()
 {SetSensor(SENSOR_1,SENSOR_LIGHT);  //光センサーを定義
 {OnFwd(OUT_A);  //左タイヤを回転させる
 until (SENSOR_1 > 55) ;   // センサの値が55以上(適当に調節)になるまで回る
 {Off(OUT_A);  //タイヤ停止
 {int i,max;      //i,maxを定義
 SetSensor(SENSOR_1,SENSOR_LIGHT);     //センサ1を光センサーに設定
  max=0;                    //光度の値の変数:一番明るかったところを記憶するための変数
 
  ClearTimer(1);              // Timer(1) をリセット
 
  while(FastTimer(1) < RUN_TIME){      //FastTimer(1)がRUN_TIME以下の時に繰り返す     OnFwd(OUT_A);             //進行方向左に回転する
     if(SENSOR_1 >= max){     // より明るいところを発見した場合
        ClearTimer(0);           // Timer(0) をリセット
        max=SENSOR_1;       //maxの値は光センサ
     }                   //一周回る間に一番明るいところがmaxに記憶され、Timer(0)はその地点からスタートする。
  }
  OnRev(OUT_A);                   //逆回転する
  Wait(FastTimer(0));            //一番明るい位置まで回転
  Off(OUT_A);                 //一番明るい位置で停止
  
 OnFwd(OUT_C);  //ブロックを投げる
 Wait(5);
 Off(OUT_C);}  //終了
 }
 }

**2 光を動かしたとき光に向かって進み、光の動きを止めればブロックを投げるプログラム [#x8b1e840]
 #define THRESHOLD 65   //光の明るさを定義する
 task main()
 {
 SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサーの定義する
 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3を光センサーの定義する  
 SetPower(OUT_A,7); //モーターの出力を7にする
 while(true){
  if(SENSOR_1 > THRESHOLD){    
    OnFwd(OUT_A);             //左に光が強いとき左に回る
  }
  if(SENSOR_1 < THRESHOLD){
    OnRev(OUT_A);       //右に光が強いとき右に回る
  }
  if((SENSOR_1 > THRESHOLD) && (SENSOR_3 > THRESHOLD)) {
    Off(OUT_A);
    OnFwd(OUT_C);
    Wait(20);
    Off(OUT_C);       //左右のセンサーが明るさの定義値より強い明るさのとき物を投げる
  }
  if((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)) {
    OnFwd(OUT_A);
  }         //左右のセンサーに光があたっていないとき回転して光をさがす
 }
 }
**3 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいてブロックを投げる。 [#v465ae07]
 #define THRESHOLD  50     //光の明るさの規定値1を42に設定
 #define THRESHOLD  58     //光の明るさの規定値2を51に設定 
 #define THRESHOLD  42     //光の明るさの規定値1を42に設定
 #define THRESHOLD  51     //光の明るさの規定値2を51に設定 
 task main ()
 {
  SetSensor(SENSOR_1,SENSOR_LIGHT);       //光センサを1にセットする
  SetSensor(SENSOR_3,SENSOR_LIGHT);       //光センサを3にセットする
  SetPower(OUT_A,7);                     //モーターの出力を7に設定する
  while(true)
 {                                               
       while((SENSOR_1 < THRESHOLD1) && (SENSOR_3 < THRESHOLD1))     //光センサ1とセンサ3が同時に規定値の光を感知できないとき
  {
  OnFwd(OUT_A);
  Wait(150);      //左に向きを変える動作をする。
  Off(OUT_A);
 }
  while((SENSOR_1 >= THRESHOLD1) && (SENSOR_3 < THRESHOLD1))    //光センサ1は十分な光を感知するが、3はそれに足りないとき 
 {
  OnFwd(OUT_A);
  Wait(50);     //左に少しだけ向きを変える動作をする
  Off(OUT_A);
 }
  while((SENSOR_1 < THRESHOLD1) && (SENSOR_3 >= THRESHOLD1))    //逆にセンサ3は十分な光を感知できるが、センサ1は感知できなかったとき
 {
  OnRev(OUT_A);
  Wait(30);     //右に向きを少しだけ変える動作をする
  Off(OUT_A);       
 }
  while((THRESHOLD1 <= SENSOR_1 <= THRESHOLD2) && (THRESHOLD1 <= SENSOR_3 <= THRESHOLD2))    //さらにセンサ1、センサ3が同時に規定値1より多くしかし規定値2に満たない光を感知したとき
 {
  OnFwd(OUT_A);   //右に少し
  Wait(10);
  OnRev(OUT_A);   //左に少し
  Wait(10);
  Off(OUT_A);    //蛇行しながら前に進んで止まる動作をする
 }
        while((SENSOR_1 >= THRESHOLD2) && (SENSOR_3 >= THRESHOLD2))        //センサ1、センサ2が同時に規定値2以上の光を感知したとき
          {
  OnFwd(OUT_C);   //止まってる上体でアームを振り下ろしブツを前に投げる。
  Wait(5);
  Off(OUT_C);}    //以上
          }
    }
}
*苦労・工夫したところ [#lbd9af4b]
・とりあえず走らせてみようとして走らせてはみたものの全然前に走ってくれなかったこと
*今後の課題・反省 [#w1081322]
・みんなの都合が合わなくて集まることがあまりないまま1週間迎えてしまった

・プログラムの意味を理解しながらやればかなりはやくプログラムを組めたと思う

・ディファレンシャルギアで目指せ4輪駆動!・・・やりようによってはできる気がするんですが考えるのが大変ですねー
*感想 [#hf87e862]
・やはり1週間は短すぎる気がした。チーム全員で集まることができる日が少ないのをなんとかしたいと思った。 by 辻

・一週間では短い気がした。プログラムがだんだん複雑になってきて作るのが大変だが、ロボコンは何とか成功させたい。 by 水上

・システムが微妙にちがうロボを1からつくって、デリケートなプログラム組んでそれを1週間以内は拷問だったですよ。まあ詰まっててがんばった1週間でした。 by吉村
*この作品に関してのコメント [#j2847f4e]
コメントよろしくお願いします
- 最初の課題では、絶対的な明るさ(閾値)を方向判定の基準にするのではなく、各方向から最も明るい方向を捜し出すようなプログラムにしてください。 -- [[松本]] &new{2008-07-08 (火) 09:09:06};

#comment
プログラムについて~
1:相対的に光の強さが最大の方向に投げられるとなお良いです。~
2:懐中電灯が止まることをどう認識すればよいか考えるといいと思います。


訪問者
本日&counter(today);
昨日&counter(yesterday);
合計&counter(all);


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