目次

メンバー

もぇくぇ
ゼンチン

課題の内容

各チームで作成したコースを1周するロボットを製作せよ。交差点以外のコース上に350mlの空の空き缶を2個以上おき、空き缶にぶつかった時には次のような動作するプログラムを作成せよ。(他のメンバーと重ならないように一人一つのプログラムを作成する)

  1. 空き缶をコース上に戻して再びコースに戻って進む
  2. 空き缶を次の交差点まで運んで行き、その交差点に空き缶を残してさらにコースに沿って進む
  3. 奇数回目に空き缶に遭遇したら、その場で反転して進み、偶数回目に遭遇したら、空き缶を押しのけて進む

ただし、

  • 速さと正確さを追求すること
  • コースを1周したら自動的に止まること
  • 交差点では一時停止すること

ロボットの紹介

全体図

上から見た図

比較的シンプルな構造の中に、
光センサーが二つ
タッチセンサーが一つ
アームが一つ
という今回の課題をクリアするのに十分な装備を備えた機体。
おそらく使った部品の数、という点では最も少ない部類に分類されるかと思います。
それでも普通にライントレースをする分には十分。
 
光センサーを二つ用いることにより、
1。両方の光センサーが「白」を感知しているとき
  →直進を続ける
2。片方の光センサーが「黒」(コースのライン)を感知しているとき
  →黒を感知したセンサーの方に方向転換
3.両方の光センサーが「黒」を感知しているとき 3.両方の光センサーが「黒」を感知しているとき
  →交差点に達したことを意味するので、一時停止したのち、直進
以上3つの動作パターンをスムーズに行えるようになりました。

横から見た図

普段はアームは上げられており、タッチセンサーに反応があるとアームが降りて
このように缶をホールドします。
すこしアームの範囲が狭く、缶を入れるために
多少位置の微調整が必要だったところは反省点でした。
また、写真を見ていただければ分かると思いますが、タッチセンサーに反応があった後に
すぐにアームを下ろすと、アームの長さの関係でうまく缶をホールドできません。
これは、缶を挟む前にマシンを少しバックさせることで対処しました。

マシン前面部

バンパー部

写真の青い丸が光センサー、赤い丸がタッチセンサーです。
光センサーはマシン全面、さらにお互いの距離を近めに配置し、進行時のズレをなるべく回避するようにしました。
タッチセンサーにはバンパーを装着し、缶に当たったときに安定して作動するよう配慮。

苦労した点

最初はどのようにマシンを組んだものかと悩みましたが、
去年の人たちのページやマシンの説明書を参考にしつつ、課題をクリアするのには何が必要なのかを考えていきました。
最終的にはかなりコンパクトにまとまったので満足です。

コース

couse.jpg

図の通り、交差点付近が綺麗な直線になっていないため
うっかりすると光センサーの誤作動を招く、諸刃の剣。
素人にはお薦め出来ない。
いや、本当に苦労したんです…
普通の交差点だったらいらぬ苦労はしなくてすんだのに…
こんなコースにしたのは誰だ!?
…あ、俺たちでした…

プログラム

もぇくぇのプログラム

#define H 40 //左光センサーの閾値
#define F 50 //右光センサーの閾値
task main()
{
 SetSensor(SENSOR_1, SENSOR_LIGHT);//端子1に光センサーを接続
 SetSensor(SENSOR_3, SENSOR_LIGHT);//端子3に光センサーを接続
 SetSensor(SENSOR_2, SENSOR_TOUCH);//端子2にタッチセンサーを接続
 int cross=0; //交差点を通過した回数
while(cross<6)//コースの巡回プログラム
 {if ((SENSOR_1 > H)&&(SENSOR_3 > F))//両方の光センサーが白を感知しているとき
 {OnFwd(OUT_A+OUT_C);Wait(5);}//
  if ((SENSOR_1 > H)&&(SENSOR_3 < F))//端子3の光センサーが黒を感知しているとき
 {OnFwd(OUT_A);OnRev(OUT_C);Wait(3); }
  if ((SENSOR_1 < H)&&(SENSOR_3 > F))//端子1の光センサーが黒を感知しているとき
 {OnRev(OUT_A);OnFwd(OUT_C);Wait(3);}
  if ((SENSOR_1 < H)&&(SENSOR_3 < F))//交差点を感知したとき
 {Off(OUT_A+OUT_C);
   Wait(100);
   OnFwd(OUT_A+OUT_C);Wait(20);
   cross++;}//交差点を横断した回数を増加
 if (SENSOR_2==1)//タッチセンサーに空き缶がぶつかったとき
 {OnRev(OUT_A+OUT_C);Wait(40);//一度後退します
  OnFwd(OUT_A);OnRev(OUT_C);Wait(10);//位置の微調整
  Off(OUT_A+OUT_C);
  Wait(100);
  OnFwd(OUT_B);Wait(10);//アームを下ろします
  Off(OUT_B);
  Wait(100);
  OnRev(OUT_A);OnFwd(OUT_C);Wait(270);//回れ右
  Off(OUT_A+OUT_C);
  Wait(100);
  OnRev(OUT_B);Wait(17);//アームを上げます
  Wait(100);
  OnFwd(OUT_A);OnRev(OUT_C);Wait(330);}}//回れ左
  Off(OUT_A+OUT_C);
}

工夫した点

光センサーの感度が異なるため、閾値を右と左でそれぞれ変えました。
最初は両方40で統一していたのですが、うまく反応しないので初めは
「この光センサー壊れてるんじゃ?」
と思ったりもしましたが、何とか原因が発見できてよかったです。

今後改善すべき点

いまいちコース上での動作が安定しないので、もう少しコース巡回のプログラムを
改善していきたいと思います。

ゼンチン

#define L 40
#define R 50
#define go OnFwd(OUT_A+OUT_C);                             //進む
#define back OnRev(OUT_A+OUT_C);             //戻る
#define turn_r OnFwd(OUT_C);OnRev(OUT_A);   //右に回る
#define turn_l OnFwd(OUT_A);OnRev(OUT_C);   //左に回る
#define teisi Off(OUT_A+OUT_C);             //止まる
#define turn OnFwd(OUT_A);OnRev(OUT_C);wait(300)      //右に回るtime free
#define arm_down  OnFwd(OUT_B);Wait(8);Off(OUT_B);         //アームを下ろす
#define arm_up     OnRev(OUT_B);Wait(8);Off(OUT_B);     //アームを上げる
task main ()
{
	SetSensor(SENSOR_1,SENSOR_LIGHT);
      SetSensor(SENSOR_2,SENSOR_TOUCH);
	SetSensor(SENSOR_3,SENSOR_LIGHT);
 int flag=0;                           //交差点を通った数
while(flag<6)                          //6回通るまで

if(SENSOR_1>L)
            {if(SENSOR_3>R){go;}//センサーが両方白なら直進
             else {turn_r;}//右が黒なら右折
                }
        else{
        if (SENSOR_3>R){turn_l;}  //左が黒なら左折
        else{teisi;wait(50);flag++;go;}  //両方黒ならflagを1足して直進。
                }
    if(SENSOR_2==1)       //空き缶にぶつかったら運搬プログラム開始  
          {teisi;Wait(10);arm_down;turn;arm_up;turn; //空き缶を後ろに置く
    }
   
  }
}
 }
teisi;    //6回交差点を通ったら、元の位置まで進んで終了!!
  

工夫した点

if文を多く使うことで光センサについてのプログラムをまとめることができました。
センサの反応度が左右によって違うので、それに対応させてプログラムを作りました。

今後改善すべき点

サブルーチンを使ったことで逆にプラグラムが長くなってしまったので、次回以降はプログラムの全体を考えてから作るべきだと思いました。
if文を使いすぎて{}が増えてしまい分かりずらくなってしまいました。

感想・考察

もぇくぇ

かなりプログラミングが複雑になり、難易度が急上昇しました。
また、コースがアレであったので交差点を横断する際には
コースを無視してあさっての方向に走ってしまったり
ふてぶてしくもショートカットをしようとしたり
一切の弁明の効かぬループ地獄へ突入したりしたので苦労しました。
しかし、とりあえずもできて何よりです。

ゼンチン

今回の課題では、光センサとタッチセンサの二種類のセンサを同時に使わなければいけなかったので大変でした。
交差点を無視したり、空き缶にぶつかっても反応しなかったりと、
なかなかうまくいきませんでしたが、どうにか完成できたのでよかったです。

コメント

  • 書くべきことは書かれていますが、全体的に文量が少ないので、さらに工夫した点などを充実させてみてください -- TAKA? 2010-07-02 (金) 17:33:36
  • 書くべきことは書けています。図や写真を用いて詳しくわかりやすくを目指してください。ラインとレースの原理を説明しても良いです。プログラムはindentや空行を駆使して、見やすくしたほうが理解して改良しやすいと思います -- FI? 2010-07-12 (月) 17:38:43

コメントをお願いします。


添付ファイル: filecarside2.jpg 228件 [詳細] filecarbamper.jpg 234件 [詳細] filecarside.jpg 162件 [詳細] fileovercarjpg.jpg 247件 [詳細] filecouse.jpg 250件 [詳細]

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