[[2009a/A4/課題2左]] &size(20){''目次''}; #contents ---- *課題 [#va0c266e] 各チームで作成したコースを3周するロボットを製作せよ。交差点のうちの一つには500mlの空の紙パックをおき、次のような動作するプログラムを作成せよ。(他のメンバーと重ならないように一人一つのプログラムを作成する) 1.紙パックを迂回する、あるいは紙パックをもとの位置に戻したのちコースに戻って進む (交差点を通過後、紙パックが元の位置にあればよい) 2.紙パックを次の交差点まで運んで行き、その交差点に紙パックを残してさらに黒い線に沿って進む *ロボットの説明 [#ocacca31] **試作一号機(鈴作) [#y3c5460d] 試作機ということで前回の機体の形を残してシンプルな機体にした。 #ref(CIMG0904.JPG) ↓タッチセンサー #ref(02 014.JPG) ↓光センサー;タッチセンサーを一つにして光センサーを二つにすることで、より早くラインをトレースできるようにした。 #ref(02 007.JPG) 三輪タイプにすることで旋回をよりスムーズにできるようにし、シンプルではあるがそれゆえに安定性がある機体。ただ試作機なのでパックの運搬は想定していない。 鈴のひそかな自信作。まさか二号機はあんなに変わるとは;; **試作二号機(中立な稲妻作) [#u16d5fad] #ref(02 004.JPG) タッチセンサーと光センサーはそのままに車体が大幅に変化させ、とにかく奇抜さを求めた機体。車体が極めて低いため光センサーの感度は随一だが旋回にやや難がある。試作一号機からの変わりように鈴は唖然。 -実際に求めるのは小型ロボット。この形になると、コントローラ(?黄色のやつ)が落ちやすい点はなくなった。重心が下がるため、安定性がある。部品の需要も大幅減少!そして...見た目はいい。弩の感じ... **その他形にならなかった案 [#t10d2346] ↓前に突起をつけてパックを運搬できるようにしようとしたが回転するときに放してしまったので没 #ref(03 003.JPG) ↓パックを放さないようにつかもうとしたがモーター一個では厳しく没に -かなり工夫したもの。モーター一個で左右のパーツが同時に動ける設計。デメリットは大きい...不採用の原因は、もっと面白い設計があること。 #ref(CIMG0913.JPG) #ref(CIMG0915.JPG) -ロボットが進みながら三つ目のモーターは同時に動き、牛乳パックを動かす。しかしこの部分の計算はかなり面倒... #ref(CIMG0914.JPG) #ref(001.jpg) **試作三号機 [#n4014b1e] 一号機、二号機共にパックを回避するときに大きく動きすぎてラインを見失ってしまうことが多々あったので、最小の動きでパックを回避するというコンセプトの元でき上がった機体。 全体図 #ref(CIMG0916.JPG) #ref(CIMG0917.JPG) #ref(CIMG0918.JPG) パックがタッチセンサーにあたるとたちセンサーと光センサーを上に持ち上げその長い足でパックをまたぎこすという仕組み。またパックを運搬する際にはパックを足の間に挟んだまま移動、次のの交差点で放す、という考えで作った。このアイディアは中立な稲妻の案。 コントローラを固定するパーツ #ref(CIMG0925.JPG) #ref(CIMG0926.JPG) 光センサとタッチセンサ #ref(CIMG0920.JPG) #ref(CIMG0922.JPG) この部分はパックをまたぐとき持ち上がるのでできるだけ小さく作った。 タイヤ部分 #ref(CIMG0924.JPG) #ref(CIMG0921.JPG) 大きさ車体を安定させるためタイヤも大きくし前方に支える部分を作った。 伝送部分 #ref(CIMG0923.JPG) #ref(CIMG0919.jpg) タッチセンサーと光センサーを持ち上げるための部分。この構造は前回の課題でペンを上下させるための部分に使ったものを応用して作った。 **完成機 [#s665031a] 試作三号機を採用。 #ref(3 001.JPG) タッチセンサーの誤作動を防ぐためゴムを付けた *プログラム [#u0acb1ef] **線路図 [#g59b1f77] #ref(CIMG0927.JPG) **パック回避のプログラム [#k59e5d2a] #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周したら停止 **パック運搬のプログラム [#e90ec4d2] #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周したら停止 **運ぶ部分 [#y48738da] 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); } *感想 [#db312476] -鈴:最終的に機体を工夫することでプログラムが簡単ですむようにしたつもりだったけど、機体が大きくなりすぎたためカーブの部分のプログラムをより細かく曲がれるようにするのが大変だった。 -中立な稲妻:「先に古人なし」の機体にかなり工夫した。そのおかげで、プログラムの難しい部分を多少回避した。実際一号機もよくて、プログラムも早く完成したのに... まぁ、面白いロボットの方はもっといいじゃない。 *コメント [#q3911635] - ロボットの説明がわかりやすくて良いです。プログラムには、インデント(ifなどの階層ごとに行う字下げ)を入れると見やすくなると思います。また、ifでセンサーの反応を判別しているところを、センサーが白か黒か(もしくは触っていないか触っているか)について、「無反応なら0を、反応なら1を返す関数」にしてみると、もっとスリム化できるかもしれません。 -- [[こさか]] &new{2009-07-02 (木) 22:15:53}; #comment