[[2016a/Member]]

*困惑の吐露のような愚痴の発散のような [#mfc00170]

 Ris一体、それに準じて光センサーも一つで課題をこなさなくてはならないことになっていた。何を言っているのかわからないだろうが私にもわからない。

 時間かけた結果も散々だった。

 Ris一体、それに準じて光センサーも一つで課題をこなさなくてはならないことになっていた。何を言っているのかわからないだろうが私にもわからない。~
 時間かけた結果も散々だった。~
 その上で先生のまとめのお言葉を聞いた時「うわぁ先生その狙いでやってらっしゃったとはマジドンピシャで身にしみました先生そういうことだったんですね先生」ってなった。詳しくは後述。グダグダしてないと辛すぎて書けないんじゃ!!!!!!!!


*ハード [#g814f17e]

<写真全体のみ>
 
 まず前述の通り
 まず前述の通り~
 ・Ris一つ~
 ・=モーター3っつまで~
 ・=光センサー一つのみ~
で考える必要があった。なんでだよ。しらん。地面に巻いた水をすくえるかってんだ。しらん。~
その結果大前提として~
「ライントレースに光センサーを費やす以上、コップ回収には光センサーは使用不可」~
 またコードの調子が悪く、「タッチセンサーも使用が厳しい」という結論。つまり、「動きの正確さ及び確実性が必要」ということになった、なんてこったい。~
という前置きはここまでにして。~

 ・Ris一つ
 ・=モーター3っつまで
 ・=光センサー一つのみ
 行動原理および作戦としては、~
「コップを横向きにひっくり返して重ねていく」「『運ぶ』のではなく『引きずっていく』」~
という発想である。コップ回収にセンサー利用が0である以上コップの初期位置に頼ることにした。要するに運。~
 だってコップ見つけるセンサー持てないんだもんね。~

で考える必要があった。なんでだよ。しらん。地面に巻いた水をすくえるかってんだ。しらん。その結果大前提として
**構造 [#g6a7fcf9]
***アーム [#j1093ab7]
<写真1>

「ライントレースに光センサーを費やす以上、コップ回収には光センサーは使用不可」
 1.モーターから、一番小さいギア→一番大きいギアの順に伝達。これによって多少「馬力向上」と「回転速度低下」が実現される。~
 2.このタイヤと平行なモーターの回転運動をを棒の回転運動に変換する。理屈上はモーター自体タイヤと垂直でも良いはずだが、RIS上のコードの断線が怖すぎて回避。%%あと時間がなかったのと%%わかりやすさも優先された。(&color(#ea5550){※1};)~
 +α.この当たりは「補強(A)」や「先端の動作で必要(B)」な部分。(A)は丁度光センサー設置のブロックの穴にハマった上にはめると強度が上がったので活用。偶然の産物。(B)は後述(&color(#00947a){☆1};)。~

またコードの調子が悪く、「タッチセンサーも使用が厳しい」という結論。つまり、「動きの正確さ及び確実性が必要」ということになった、なんてこったい。
…そういえば光センサーの記述してない。~
 前回の課題にてこの位置にしたから、というわけだけでは実はなかった。数値変えればどうにでもなるし。まあライントレースうまく行くとわかっている位置としてかなりポイントは確かに高かったけども。~
 1つめに、前方であること。アームに比較的近いところであること。~
 2つめに、コップを引きずる上で邪魔にならないこと。~
 3つめに、正確なライントレースを求めるために、「あまり車体を振らないようにする=センサーが回転中心から遠すぎない」こと。(回転中心から遠いと、一瞬車体が曲がった時の円周が大きくなり、理想のグレーゾーンを超えて曲がりやすく、理想のグレーゾーンに留まりにくいことが課題2での結論。)

という前置きはここまでにして。
この点から、~
<前方写真>
 設置点Aはバンパー(後述☆2)の「わかりやすさ」を優先したことにより断念。(物理的に無理)~
 設置点Bはバンパーと紙コップの位置的な相性から「ここは空いている方が確実性があがる」という結論に至る。(たぶん後述☆2)~
 そして設置点C。繰り返しの試行の結果「いうほどアームの影は影響してこない。走らせたらうまくライントレースしたから問題ない。」という結論に至る。~
 つまり、~
   作戦上のバンパーの有り方の形状>>>>>>>>>>>>>>バンパーの構造>>>>アームの影。~

 行動原理および作戦としては、

「コップを横向きにひっくり返して重ねていく」「『運ぶ』のではなく『引きずっていく』」
<アーム先写真>
 回転方向は図の通り。
 ここが先述(&color(#ea5550){※1};)によって親指上向きにした右ねじの方向へ回っていると歯車1は反時計回り、歯車2は時計回りに回転し、アームは閉じていく。このアームが閉じ切った(紙コップをつかむ/つかみ損ねてシュールにも閉じ切る)とき、この歯車1/2の回転は阻止され、動かなくなる。すると、このアームには右ねじの方向の回転力が依然加わるために、この回転軸を中心にしてアーム軸の反対側(右側)にアームがひっくり返る。この運動を十分な高さで、コップの初期状態を広い口を上向きに設置して行えば、アームの反対側(右側)に伏せた状態で詰まれていくことを狙っている。~
 逆にアームを初期状態に戻すとき、「コップが進むだけで入ってくれるように」アームを開いた状態にする必要がある。そのときはこの、棒が伸びている部分(&color(#ea5550){色付け忘れんなよ俺氏};)が「アーム回転軸がこれ以上右ねじの反対方向に回転しない状態」を作り出し、それによってアーム回転軸の回転が歯車1/2に伝達するようになっている(完全に逆操作)。なおこの棒(=ストッパー)はアームが水平に開く状態を維持するのにも一役買っている。%%正味軽くて固定されていればなんでもよかったが%%軽さもコンパクトさも良好であり、アームの運動に阻害せず、かつ「アームが水平である」「アームを開く」のに欠かせない部分となった。さらにこれは(&color(#00947a){☆1};)の延長にあるものであり、固定のためのパーツ増量を活かした部分である。~
 なお、アームの軸回転が戻っている途中にアームが開きそうにも思うが、「完全に開いた状態を『確実に』つくる」にはこのワンクッション(?)がかなり確実性を上げる。~
 歯車2についているこの部分(&color(#ea5550){色付け忘れんなよ俺氏};)は「アームが開ききった状態」を確定するもので、開きすぎて変なところで引っかかることを防ぎ、また、アームの閉じる時間をプログラミングした時に最大値が制限されるので安定しやすい等のメリットがある。~

という発想である。コップ回収にセンサー利用が0である以上コップの初期位置に頼ることにした。要するに運。
<画像余裕あったら解説>

**構造 [#g6a7fcf9]
モーターから、一番小さいギア→一番大きいギアの順に
***バンパー [#t013f3ce]
<画像バンパー>
 運ぶ(笑)ためのバンパー(仮称)である。バンパーの役割はない。むしろガードレール。~
 仕組みはGIFアニメにて。~

<じふあにめ>

 本体は特にゴツさを極力削ったつもりである。~


**経緯 [#t6dd33d4]

 光センサーは先述したので省略。~
***アーム [#kf43e754]
 まず、先生に教授いただいた方法を試してみた。女子二人で活動する、というのはつまり「いうほど幼少の頃そういうので遊んでないから知識がない」ことに直結していたので、「とりあえずやってみよう」という調子になるのはいたって自然である。と主張する。~
 教えていただいた機構は以下の通り。~

<じぐあにめ〜>

 これについての考察として、~
・歯車の数が多い~
・ブロックで連結しなければならない→重たくなりそう~
・Ris一台分で動作させる必要がある →つまりアームの方が重くてバランスが持っていかれる~
                 →補強用ブロックも足りないのでは?~
・歯車とブロックの融合したごついモーターをRisの近くに設置できるのか~
というのは共通認識レベルで考えた。おそらくちゃんとそれらを解決できる方法があったのかもしれないが、その場では「応用的なアームを考えよう」という発想に至った。~


 重いアームが何故問題なのかを考えた時、それは「重いものを振ると重心が飛んでいくため安定しないからだ」と行きつき、~
・重くても、動かなければ重心は安定している~
・軽ければ、動いても重心は安定しやすい~
のどちらかにしようと意見をまとめた。~

 最初に考えたのは「エレベーター方式」である。おそらく「持ち上げる」という動作に対し連想するものにエレベーターは必ず関わる上に、初めに見た過去のロボコンの印象から浮かんだ発想だったと思う。しかし、~
・構造が複雑化=センサーなしでできると思えない+一台分では部品が足りない~
・紙コップは寸胴ではないので、両側からの押し上げ式の持ち上げは難しいのではないか~
・箱型(よくあるエレベーター)であれば「持ち上げる」動作と、ロボコンの規定上、「ロボットから離脱させる動作」が必要=モーターが一つ足らないのでは~
であるために断念。

本当に一台分でやらされたの糞だなあいつらどうさせようとしてたんだ当日手ぶらで来たし

 となれば、と「軽量化」に着手。~
 そこで浮かんだのが、「ブロックと歯車で回転運動を伝達する」のではなく、「棒一本での回転運動の伝達」である。~
 早速見本(歯車連結)と見比べながら試作。実際にモーターに接続するであろう向きまで考えて%%(あっモーターの向きこの時の名残かもしれない)%%いざ手で歯車を回してシミュレーション。~

 その結果が
<Gifあにめ?>
こうである。~

 つまり想定していた動きと、得た動きはこのように差異があり、~
<画像>
求めていた「タイヤと平行な向きの、上昇する回転運動」ではなく、「棒自体の回転運動」が永遠になされることが判明。確かに「棒の回転運動」を止める仕組みがないもんなァ…~



 











*プログラム [#ldd385a5]
**定義 [#i6399169]

 #define straight 5
 #define carb 2   
 #define KAITEN 2
 #define set_straight SetPower(OUT_AC,straight);
 #define set_carb SetPower(OUT_AC,carb);
 #define set_kaiten SetPower(OUT_AC,KAITEN);
 #define arm_tsukamu(t) set_kaiten; OnFwd(OUT_B); Wait(t); Off(OUT_B);
 #define arm_hanasu(t) set_kaiten; OnRev(OUT_B); Wait(t); Off(OUT_B);
 #define go_forward set_straight; OnFwd(OUT_AC);
 #define turn_leftL set_carb; OnFwd(OUT_C); OnRev(OUT_A);
 #define turn_leftS set_carb; OnFwd(OUT_C); Off(OUT_A);
 #define turn_rightS set_carb; OnFwd(OUT_A); Off(OUT_C);
 #define turn_rightL set_carb; OnFwd(OUT_A); OnRev(OUT_C);
 #define black 38                   //10行目
 #define glayA 42
 #define glayB 45
 #define glayC 48
 #define white 50 
 #define KURO 11
 #define TURN_TIME 90
 #define TUKAMU_TIME 3
 #define HANASU_TIME 3
 #define MA_NO_ZIKAN 3
 #define ma_wo_toru Off(OUT_B); Wait(MA_NO_ZIKAN);

**サブルーチン [#t41a11a4]
 8個までなの本当に罠だよぉ!~

 sub go_go_left()
 {
    Off(OUT_AC);
    Wait(100);
    PlaySound(SOUND_FAST_UP); 

    go_forward;
    Wait(50);
    turn_leftL;
    Wait(TURN_TIME);
    Off(OUT_AC);
    go_forward;
    Wait(50);
 }

 sub go_go_right()
 {
    Off(OUT_AC);
    Wait(100);
    PlaySound(SOUND_FAST_UP); 

    turn_rightL;
    Wait(TURN_TIME);
    Off(OUT_AC);
 }

 sub go_go_forward()
 {
    Off(OUT_AC);
    Wait(100);
    PlaySound(SOUND_FAST_UP); 

    go_forward;
    Wait(50);
    Off(OUT_AC);
 }

 sub go_go_forward2()
 {
    Off(OUT_AC);
    Wait(100);
    PlaySound(SOUND_CLICK); 

    go_forward;
    Wait(100);
    Off(OUT_AC);
 }

 sub go_follow()//サブルチンくんが8個までって怒られたっぽいのでどうせならと統合
 {
    ClearTimer(1); 
  while (FastTimer(1) <= 300) {   //タイマー0を使用
    if (SENSOR_2 < black) {        //黒の範囲にいるとき、
      turn_leftL;
    } else if (SENSOR_2 < glayA) { //黒寄りのところにいるとき、
      turn_leftS;                      //少し左に曲がりながら、
    } else if (SENSOR_2 < glayB) { //白寄りのところにいるとき、
      go_forward;                      //直進し、
    } else  {                      //それ以外のとき、つまり白いところにいるとき、 
      turn_rightL;                     //大きく右へいきながら、
    } 
    Wait(1);                       //この判定を0.01秒ごとにする
  }


        ClearTimer(0);
  while (FastTimer(0) <= KURO) {   //タイマー0を使用
    if (SENSOR_2 < black) {        //黒の範囲にいるとき、
      turn_leftL;
    } else if (SENSOR_2 < glayA) { //黒寄りのところにいるとき、
      turn_leftS;                      //少し左に曲がりながら、
       ClearTimer(0);                  //タイマーをリセットかける
    } else if (SENSOR_2 < glayB) { //白寄りのところにいるとき、
      go_forward;                      //直進し、
      ClearTimer(0);                   //タイマーをリセットする
    } else  {                      //それ以外のとき、つまり白いところにいるとき、 
      turn_rightL;                     //大きく右へいきながら、
      ClearTimer(0);                   //タイマーをリセットする。
    } 
    Wait(1);                       //この判定を0.01秒ごとにする
  }


 }



 sub tukamu()
 {
  repeat(6) {  
    arm_tsukamu(TUKAMU_TIME);
    ma_wo_toru;}
   OnRev(OUT_AC);
   Wait(80);
   Off(OUT_ABC);
   
   turn_rightL;
   Wait(30);
   Off(OUT_AC);
  repeat(6) {  
    arm_tsukamu(TUKAMU_TIME);
    ma_wo_toru;
  }
  Off(OUT_B);
  Wait(5);
  repeat(3) {  
    arm_tsukamu(TUKAMU_TIME);
    ma_wo_toru;
  }
 }

 sub hanasu()
 {
  repeat(22) {  
    arm_hanasu(HANASU_TIME);
    ma_wo_toru;
  }
 }

 sub turn_180()
 {
   turn_rightL;
   Wait(170);
   Off(OUT_AC);
   go_forward;
   Wait(50);
   Off(OUT_AC);

 }


 task main ()
 {
   SetSensor(SENSOR_2,SENSOR_LIGHT);
    go_follow();
    go_go_forward();//1
    go_follow();
    go_go_forward();//2
    go_follow();
    go_go_right();//3
    go_follow();//4C
 
  int move_time;  // 整数型の変数を宣言
  move_time = 0;  

    go_forward;
    Wait(move_time);
    Off(OUT_AC);//Cコップ圏内1
    tukamu();
    Off(OUT_B);
    Wait(100);
    hanasu();
    Off(OUT_B);
    Wait(100);//コップひっくり返し完
    turn_180();
    go_follow();
    go_go_forward();
    go_follow();//D着

    turn_rightL;
    Wait(50);
    go_forward;
    Wait(move_time);
    Off(OUT_AC);//Dコップ圏内2
    tukamu();
    Off(OUT_B);
    Wait(100);
    hanasu();
    Off(OUT_B);
    Wait(100);//コップひっくり返し完
    turn_180();
    go_follow();
    go_go_forward();
    go_follow();//C着

  move_time += 60;

    go_forward;
    Wait(move_time);
    Off(OUT_AC);//Cコップ圏内3
    tukamu();
    Off(OUT_B);
    Wait(100);
    hanasu();
    Off(OUT_B);
    Wait(100);//コップひっくり返し完
    OnRev(OUT_AC);
    Wait(move_time);
    turn_180();
    go_follow();
    go_go_forward();
    go_follow();//D着

    turn_rightL;
    Wait(50);
    go_forward;
    Wait(move_time);
    Off(OUT_AC);//Dコップ圏内4
    tukamu();
    Off(OUT_B);
    Wait(100);
    hanasu();
    Off(OUT_B);
    Wait(100);//コップひっくり返し完
    OnRev(OUT_AC);
    Wait(move_time);
    turn_180();
    go_follow();
    go_go_forward();
    go_follow();//C着

  move_time += 50;

    go_forward;
    Wait(move_time);
    Off(OUT_AC);//Cコップ圏内5
    turn_rightS;
    Wait(30);
    Off(OUT_AC);
    tukamu();
    Off(OUT_B);
    Wait(100);
    hanasu();
    Off(OUT_B);
    Wait(100);//コップひっくり返し完
    OnRev(OUT_AC);
    Wait(move_time);
    turn_180();
    go_follow();
    go_go_forward();
    go_follow();//D着

    turn_rightL;
    Wait(50);
    go_forward;
    Wait(move_time);
    Off(OUT_AC);//Dコップ圏内6
    turn_rightS;
    Wait(30);
    Off(OUT_AC);
    tukamu();
    Off(OUT_B);
    Wait(100);
    hanasu();
    Off(OUT_B);
    Wait(100);//コップひっくり返しすべて完
    OnRev(OUT_AC);
    Wait(move_time);
    turn_180();
    go_follow();
    go_go_right();//S脱出
    go_follow();

    go_go_left();

    go_follow();//Q到着

    turn_rightL;
    Wait(360);
    Off(OUT_AC);
    turn_rightS;
    Wait(90);
    Off(OUT_AC);

    go_go_left();
    Off(OUT_ABC);
 }

(&color(#00947a){☆1};) (&color(#00afcc){☆2};)


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