2009a/A4/課題2左?

''目次''


課題

各チームで作成したコースを3周するロボットを製作せよ。交差点のうちの一つには500mlの空の紙パックをおき、次のような動作するプログラムを作成せよ。(他のメンバーと重ならないように一人一つのプログラムを作成する)

1.紙パックを迂回する、あるいは紙パックをもとの位置に戻したのちコースに戻って進む (交差点を通過後、紙パックが元の位置にあればよい)

2.紙パックを次の交差点まで運んで行き、その交差点に紙パックを残してさらに黒い線に沿って進む

ロボットの説明

試作一号機(鈴作)

試作機ということで前回の機体の形を残してシンプルな機体にした。

CIMG0904.JPG

↓タッチセンサー

02 014.JPG

↓光センサー;タッチセンサーを一つにして光センサーを二つにすることで、より早くラインをトレースできるようにした。

02 007.JPG

三輪タイプにすることで旋回をよりスムーズにできるようにし、シンプルではあるがそれゆえに安定性がある機体。ただ試作機なのでパックの運搬は想定していない。 鈴のひそかな自信作。まさか二号機はあんなに変わるとは;;

試作二号機(中立な稲妻作)

02 004.JPG

タッチセンサーと光センサーはそのままに車体が大幅に変化させ、とにかく奇抜さを求めた機体。車体が極めて低いため光センサーの感度は随一だが旋回にやや難がある。試作一号機からの変わりように鈴は唖然。

  • 実際に求めるのは小型ロボット。この形になると、コントローラ(?黄色のやつ)が落ちやすい点はなくなった。重心が下がるため、安定性がある。部品の需要も大幅減少!そして...見た目はいい。弩の感じ...

その他形にならなかった案

↓前に突起をつけてパックを運搬できるようにしようとしたが回転するときに放してしまったので没

03 003.JPG

↓パックを放さないようにつかもうとしたがモーター一個では厳しく没に

  • かなり工夫したもの。モーター一個で左右のパーツが同時に動ける設計。デメリットは大きい...不採用の原因は、もっと面白い設計があること。
CIMG0913.JPG
CIMG0915.JPG
  • ロボットが進みながら三つ目のモーターは同時に動き、牛乳パックを動かす。しかしこの部分の計算はかなり面倒...
CIMG0914.JPG
001.jpg

試作三号機

一号機、二号機共にパックを回避するときに大きく動きすぎてラインを見失ってしまうことが多々あったので、最小の動きでパックを回避するというコンセプトの元でき上がった機体。

 全体図

CIMG0916.JPG
CIMG0917.JPG
CIMG0918.JPG

パックがタッチセンサーにあたるとたちセンサーと光センサーを上に持ち上げその長い足でパックをまたぎこすという仕組み。またパックを運搬する際にはパックを足の間に挟んだまま移動、次のの交差点で放す、という考えで作った。このアイディアは中立な稲妻の案。

コントローラを固定するパーツ

CIMG0925.JPG
CIMG0926.JPG

光センサとタッチセンサ

CIMG0920.JPG
CIMG0922.JPG

この部分はパックをまたぐとき持ち上がるのでできるだけ小さく作った。

タイヤ部分

CIMG0924.JPG
CIMG0921.JPG

大きさ車体を安定させるためタイヤも大きくし前方に支える部分を作った。

伝送部分

CIMG0923.JPG
CIMG0919.jpg

タッチセンサーと光センサーを持ち上げるための部分。この構造は前回の課題でペンを上下させるための部分に使ったものを応用して作った。

完成機

 試作三号機を採用。

3 001.JPG

タッチセンサーの誤作動を防ぐためゴムを付けた

プログラム

線路図

CIMG0927.JPG

パック回避のプログラム

 #define THRESHOLD 50//光センサーの値を決める
 {
 SetSensor(SENSOR_1, SENSOR_LIGHT); //光センサー1
 SetSensor(SENSOR_2, SENSOR_TOUCH); //タッチセンサー
 SetSensor(SENSOR_3, SENSOR_LIGHT); //光センサー2
 int n;//変数nを使う
 n=0;//変数nを0にする
 While(N<6){//関数nが6になる=3周するまで続ける
 if (SENSOR_1 >=THRESHOLD){if (SENSOR_3 >=THRESHOLD){
 Onfwd(OUT_A+OUT_C); }//光センサーが両方白のとき前進

 else{Off(OUT_C);

 Onfwd(OUT_A);OnRev(OUT_C);}//光センサ−2が黒のとき左へ修正
 else{if (SENSOR_3 >=THRESHOLD)
 { Off(OUT_A);Onfwd(OUT_C);OnRev(OUT_C);}//光センサ−1が黒のとき右へ修正
 if((SENSOR_1 <THRESHOLD)&&(SENSOR_3 <THRESHOLD))//両光センサーが黒のとき
 {Off(OUT_A+OUT_C);Wait(100); Onfwd(OUT_A+OUT_C); 
  n==n+1}//一度止まって前進。変数nに1プラス
  if(SENSOR_2==1);
  {Off(OUT_A+OUT_C);Wait(50); 
  OnRev(OUT_A+OUT_C);//タッチセンサーが反応したら後退
 Wait(10);Off(OUT_A+OUT_C)
 ;OnRev(OUT_B);Wait(50);Off(OUT_B);//センサーを持ち上げる
 Onfwd(OUT_A+OUT_C); Wait(50);
  Onfwd(OUT_B);Off(OUT_B);//パックをまたいでセンサーをおろ
  }}
 Off(OUT_A+OUT_C);//変数nが6になる=3周したら停止

パック運搬のプログラム

 #define THRESHOLD 50//光センサーの値を決める
 {
 SetSensor(SENSOR_1, SENSOR_LIGHT); //光センサー1
 SetSensor(SENSOR_2, SENSOR_TOUCH); //タッチセンサー
 SetSensor(SENSOR_3, SENSOR_LIGHT); //光センサー2
 int n;//変数nを使う
 n=0;//変数nを0にする
 While(N<6){//関数nが6になる=3周するまで続ける
 if (SENSOR_1 >=THRESHOLD){if (SENSOR_3 >=THRESHOLD){Onfwd(OUT_A+OUT_C); }//光センサーが両方白のとき前進

 else{Off(OUT_C);Onfwd(OUT_A);}}//光センサ−2が黒のとき左へ修正

 else{if (SENSOR_3 >=THRESHOLD){ Off(OUT_A);Onfwd(OUT_C);}}//光センサ−1が黒のとき右へ修正
 if((SENSOR_1 <THRESHOLD)&&(SENSOR_3 <THRESHOLD))//両光センサーが黒のとき
 {Off(OUT_A+OUT_C);Wait(100); Onfwd(OUT_A+OUT_C); n==n+1}//一度止まって前進。変数nに1プラス
 if(SENSOR_2==1);{}}
 Off(OUT_A+OUT_C);//変数nが6になる=3周したら停止

運ぶ部分

 if (SENSOR_2 == 1)//タッチセンサが反応したら... 
 {
 n=n+1//変数プラス1、交差点に一回到着を表す
 Off(OUT_A+OUT_C);//まず止める
 OnRev(OUT_A+OUT_C); Wait(5);//少し後ろに退く
 Off(OUT_A+OUT_C);//また止める
 OnRev(OUT_B);//タッチセンサーと光センサーを持ち上げる 
 Wait(50);
 start G_S;//同時にロボットは前進、 
 repeat (20)//タッチセンサーと光センサーを上に固定
 {
 OnRev(OUT_B); Wait(3);//落ちったらまた上がる設定
 Off(OUT_B); Wait(2);
 }
 stop G_S;//前進停止 
 OnFwd(OUT_B);//「籠」を降ろす 
 Wait(40);
 OnFwd(OUT_A+OUT_C);//牛乳パックと一緒に前進
 if((SENSOR_1 <THRESHOLD)&&(SENSOR_3 <THRESHOLD))//次の交差点に到着したら...
 {
 n=n+1//変数プラス1
 Off(OUT_A+OUT_C);//まず止める
 OnFwd(OUT_A+OUT_C); Wait(95);//牛乳パックの置く場所まで前進
 Off(OUT_A+OUT_C);//また止める
 OnRev(OUT_B); Wait(50);//「籠」を持ち上げる
 start G_S;//同時にロボットは前進、牛乳パックを残す
 repeat (20)//前と同じ、持ち上げる状態を保持
 {
 OnRev(OUT_B); Wait(3);
 Off(OUT_B); Wait(2);
 }
 stop G_S;//前進停止 
 OnFwd(OUT_B); Wait(40);//タッチセンサーと光センサーを降ろす
 OnFwd(OUT_A+OUT_C);また進む
 }
 }
 task G_S()//同時に前進するためもう一つタスクを同時に行う
 {
 OnFwd(OUT_A+OUT_C); Wait(100);
 Off(OUT_A+OUT_C);
 }

感想

  • 鈴:最終的に機体を工夫することでプログラムが簡単ですむようにしたつもりだったけど、機体が大きくなりすぎたためカーブの部分のプログラムをより細かく曲がれるようにするのが大変だった。
  • 中立な稲妻:「先に古人なし」の機体にかなり工夫した。そのおかげで、プログラムの難しい部分を多少回避した。実際一号機もよくて、プログラムも早く完成したのに... まぁ、面白いロボットの方はもっといいじゃない。

コメント

  • ロボットの説明がわかりやすくて良いです。プログラムには、インデント(ifなどの階層ごとに行う字下げ)を入れると見やすくなると思います。また、ifでセンサーの反応を判別しているところを、センサーが白か黒か(もしくは触っていないか触っているか)について、「無反応なら0を、反応なら1を返す関数」にしてみると、もっとスリム化できるかもしれません。 -- こさか? 2009-07-02 (木) 22:15:53
  • 紙パックをまたぐというのは面白いアイディアだと思いますし、それを実現させた技術もすごいと思います。疑問に思ったのは2つ目のプログラムで、センサが上に上がっているときにどのようにライントレースするのでしょうか?(今回のコースでは交差点間が直線なので関係ありませんが) -- FI? 2009-07-03 (金) 02:57:43


添付ファイル: fileCIMG0927.JPG 208件 [詳細] file3 001.JPG 215件 [詳細] fileCIMG0926.JPG 271件 [詳細] fileCIMG0925.JPG 225件 [詳細] file001.jpg 229件 [詳細] file00.jpg 115件 [詳細] fileCIMG0924.JPG 222件 [詳細] fileCIMG0923.JPG 247件 [詳細] fileCIMG0922.JPG 222件 [詳細] fileCIMG0921.JPG 222件 [詳細] fileCIMG0920.JPG 209件 [詳細] fileCIMG0919.jpg 209件 [詳細] fileCIMG0918.JPG 216件 [詳細] fileCIMG0917.JPG 231件 [詳細] fileCIMG0916.JPG 220件 [詳細] fileCIMG0915.JPG 215件 [詳細] fileCIMG0914.JPG 227件 [詳細] fileCIMG0913.JPG 211件 [詳細] file03 003.JPG 220件 [詳細] file03 002.JPG 127件 [詳細] file03 001.JPG 114件 [詳細] file02 004.JPG 222件 [詳細] file02 014.JPG 214件 [詳細] file02 007.JPG 214件 [詳細] file01.jpg 123件 [詳細] fileCIMG0907.JPG 113件 [詳細] fileCIMG0905.JPG 147件 [詳細] fileCIMG0904.JPG 235件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-07-03 (金) 02:59:56 (3703d)