目次

課題3 懐中電灯に向かってブロックを投げるロボットの製作

以下の動きをするロボットとプログラムを作成した。

1.全方向から懐中電灯の方向を探し出し、懐中電灯に向けてブロックを投げる。懐中電灯は動かさない。
2.懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。
3.懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいてブロックを投げる。
※ただし、モータ、光センサ、タッチセンサはそれぞれ2個まで使用可。懐中電灯の代わりに携帯のライトなどを利用してもよい。

ロボット製作

ギア
ギア

ディフェレンシャル・ギアとギア

今回はタイヤを回すためのモータを1つしか使うことができないので、このギアを使った。
1つのモータで2つのタイヤを動かしているので、曲がれるようにするためにストッパーをタイヤにつけることで、曲がれるようにした。 モータの回転を変えると片方のストッパーがタイヤにひっかかり、もう片方のタイヤだけを動かすことが可能になった。 また、左右のタイヤにつけるギアの数を変え、動くようにした。

全体

全体を撮った写真
前輪が自由に動く三輪タイプにすることで、スムーズな動きをできるようにした。

横

横からの写真
バランスを考えた形にした。

前

前からの写真
センサを車体の隙間に入れることでスッキリとした形になった。

投げ
投げ

投げる部分の写真
ストッパーをつけてホイールが地面につかないようにした。

プログラム

部屋の明るさが25〜35だったため電灯との境の値を40とした。

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

#define THRESHOLD 40//光の強さを定義
sub throw()//ホイールを投げる動作
{
 OnFwd(OUT_C);
 Wait(100);
 Off(OUT_C);
}

task main ()
{
    SetSensor(SENSOR_1,SENSOR_LIGHT);//光センサーを1にセット
    SetSensor(SENSOR_3,SENSOR_LIGHT);//光センサーを3にセット
    while(true)
    {                                               
       if((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)) //光センサー1、3が共に光を感知しないとき
        {
            OnFwd(OUT_A);//左回り
            
         } 
       if else((SENSOR_1 >= THRESHOLD) && (SENSOR_3 < THRESHOLD))//光センサー1は光を感知するが、3は感知しないとき 
         {
            OnFwd(OUT_A);//左回り
                     }
       if else((SENSOR_1 < THRESHOLD) && (SENSOR_3 >= THRESHOLD))//光センサー3は光を感知するが、1は感知しないとき
          {
             OnRev(OUT_A);//右回り
            
          }
       if else((SENSOR_1 > THRESHOLD) && (SENSOR_3 > THRESHOLD))//光センサー1、3共に光を感知するとき
          {
             throw();//ホイールを投げる  
          }
    }
}

(作成者:ツチヤ)

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

電灯に近づくと光は強くなるので、「#define THRESHOLD2 45」を使い、電灯が止まったということを認識させた。

#define THRESHOLD1 40//光の強さを定義
#define THRESHOLD2 45//光の強さを定義
sub throw()//ホイールを投げる動作
{
 OnFwd(OUT_C);
 Wait(100);
 Off(OUT_C);
}

task main ()
{
    SetSensor(SENSOR_1,SENSOR_LIGHT);//光センサーを1にセット
    SetSensor(SENSOR_3,SENSOR_LIGHT);//光センサーを3にセット
    while(true)
    {                                               
       while((SENSOR_1 < THRESHOLD1) && (SENSOR_3 < THRESHOLD1)) //光センサー1、3が共に光を感知しないとき
        {
            OnFwd(OUT_A);//左回り
            Wait(100);
            Off(OUT_A);
         } 
       while((SENSOR_1 >= THRESHOLD1) && (SENSOR_3 < THRESHOLD1))//光センサー1は光を感知するが、3は感知しないとき 
         {
            OnFwd(OUT_A);//左回り
            Wait(100);
            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共に光を感知するとき
          {
             OnFwd(OUT_A);
             Wait(10);
             OnRev(OUT_A);
             Wait(10);
             Off(OUT_A);
                         
          }
        while((SENSOR_1 >= THRESHOLD2) && (SENSOR_3 >= THRESHOLD2))//光センサー1、3共に光を強く感知するとき
          {
             throw();//ホイールを投げる
          }
    }
}

(作成者:キリハラ)

3.懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいてブロックを投げる。

電灯から50cmのところで光の強さを計測すると48だった。したがって、「#define THRESHOLD2 48」を使った。

#define THRESHOLD1 40//光の強さを定義
#define THRESHOLD2 48//光の強さを定義
sub throw()//ホイールを投げる動作
{
 OnFwd(OUT_C);
 Wait(100);
 Off(OUT_C);
}

task main ()
{
    SetSensor(SENSOR_1,SENSOR_LIGHT);//光センサーを1にセット
    SetSensor(SENSOR_3,SENSOR_LIGHT);//光センサーを3にセット
    while(true)
    {                                               
       while((SENSOR_1 < THRESHOLD1) && (SENSOR_3 < THRESHOLD1)) //光センサー1、3が共に光を感知しないとき
        {
            OnFwd(OUT_A);//左回り
            Wait(100);
            Off(OUT_A);
         } 
       while((SENSOR_1 >= THRESHOLD1) && (SENSOR_3 < THRESHOLD1))//光センサー1は光を感知するが、3は感知しないとき 
         {
            OnFwd(OUT_A);//左回り
            Wait(100);
            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共に光を感知するとき
          {
             OnFwd(OUT_A);
             Wait(10);
             OnRev(OUT_A);
             Wait(10);
             Off(OUT_A);
          }
        while((SENSOR_1 >= THRESHOLD2) && (SENSOR_3 >= THRESHOLD2))//光センサー1、3共に光を48以上感知するとき
          {
             throw();//ホイールを投げる            
          }
    }
}

(作成者:ツチヤ)

苦労・工夫した点

  • モータと本体をつなぐ線の接触が悪くて大変だった。ブロックをうまく使い何とか動いた。
  • はじめはディフェレンシャル・ギアを使ったロボットの仕組みを理解するのが難しかったが、何度もロボットやプログラムを改良し使いこなすことができた。
  • 光センサーを二つ付けたのを活かし光をより精度良く探せるようにした。
  • 補助輪をつけたことで車体のバランスもとれ、動きがスムーズになった。

感想

  • 今回は時間が少なくてとても大変だった。
  • 最初モーターを二つしか使えないという条件は難しすぎると思っていたが、色々と工夫をして何とかなったと思う。
  • ロボコンでは今まで学んだ事を活かしてロボットを作っていきたい。

未解決問題

  • 今回のプログラムでもそれなりの動きをしたが、光源の方向を探す場合に、絶対的な明るさを基準にするのではなく各方向の明るさを相対的に比べるようなプログラムに改良すればもっと正確な動きをさせることができたかもしれない。
  • 光センサを駆動輪側につけて、前後反対にしてみる。

コメントをお願いします

  • 光源の方向を探す場合には、絶対的な明るさを基準にするのではなくて各方向の明るさを相対的に比べるようなプログラムにしましょう。 -- 松本 2008-07-08 (火) 08:49:53
  • 光センサを駆動輪側につけて、前後反対にしてもよいかもしれません。 -- 松本 2008-07-08 (火) 08:51:24

課題1のプログラムでは、光の強さが最大でなくともある程度以上強い方向を初めて向いたときにも投げてしまうおそれがあります。
変数を使ったバージョンも作ってみてください。他のページも参考になります。 F.I.


添付ファイル: file02.jpg 277件 [詳細] file01.jpg 262件 [詳細] file投げ2.jpg 269件 [詳細] fileギヤ.jpg 266件 [詳細] filegiya 120件 [詳細] file投げ3.jpg 279件 [詳細] file全体3.jpg 304件 [詳細] file前3.jpg 272件 [詳細] file横3.jpg 137件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-08-18 (月) 20:48:55 (4021d)