#contents

*課題の内容 [#w675310e]
[[課題3>2017a/Mission3]]を参照。

*ロボットの説明 [#l7753cf6]
ロボットの全体像である。
#ref(2017a/Member/shiori/Mission3/全体前.jpg)
↑正面から見た写真
#ref(2017a/Member/shiori/Mission3/全体後ろ.jpg)
↑背面から見た写真
#ref(2017a/Member/shiori/Mission3/全体横.jpg)
↑真横から見た写真

ロボットは、初めはキャタピラで缶を持ち上げるロボットの予定だったが、うまくいかないことがあり、別のしくみのロボットにした。詳しくは下の過去の取り組みに書く。
ロボットはコンピューター2つの赤外線送受信部を合わせ、缶を集める機能と缶を積む機能の両方を持つロボット1台にした。片方のコンピューター(上の横から見た写真の、右側のコンピューター)は缶を挟み、持ち上げる機能、もう片方のコンピューター(同じ写真の、左側のコンピューター)はロボットの移動を司っている。
**台車の部分 [#n82b335b]
台車の部分は2つのモーターがそれぞれタイヤを回し
前進後退だけでなく、旋回もできるようにした。
**缶を挟み、つかむ部分 [#vf7bc1a3]
缶を挟む部分には1つのモーターを用い、歯車を上手く噛み合わせて、1つの歯車を回すと、両端の歯車が左右対称に回るようにし、腕の部分が下の写真のピンクの矢印の方向に動く。また、両方には一定以上の力が加わると空回りする歯車(白い歯車)を使い、ずっとモーターを回しても壊れずに缶をつかんでいられるようにした。つまり、缶をつかんでいるときはずっとこのモーターを回している。
#ref(2017a/Member/shiori/Mission3/歯車.jpg)
**缶を持ち上げる部分 [#n1f67680]
#ref(2017a/Member/shiori/Mission3/ぎざぎざ.jpg)
缶をつかむ部分につけたギザギザの棒
#ref(2017a/Member/shiori/Mission3/持ち上げ.jpg)
コンピューターの部分につけたモーター

上の写真のようにギザギザの棒を、缶をつかんでいる部分につけた。また、コンピューターの部分に歯車をつけたモーターを回す。これらを噛み合わせて、缶をつかんでいる部分を上下できるようにしようとした。練習段階では、ちゃんと缶を持ち上げることができたが、重いため、持ち上げた状態を維持するのが難しかった。持ち上げている間、モーターをずっと回すことで缶をつかんでいる部分が落ちてこないようにした。本番では缶をつかんでいる部分が重かったせいか、またギザギザの部分が歯車とかみ合っていなかったせいか、持ち上げることができなかった。重さ的にかなりモーターに負荷をかけてしまっていたので反省している。
*動きの説明・実際の動き [#d2cb0908]
#ref(2017a/Member/shiori/Mission3/動き計画.JPG)

青線で示したのは計画していた動きである。
#ref(2017a/Member/shiori/Mission3/実際の動き.JPG)

赤線で示しているのは実際の動き(記憶なので覚えている範囲である)である。プログラムする時間がなく、計画通りの動きをさせることができなかった。
*プログラムの説明 [#rc5e5f1d]
ロボットを作る方にほとんどの時間を奪われ、プログラミングできる時間が非常に少なかった。そのためたくさんの欠陥があり、計画通りの動きを実現することができなかった。
**台車側コンピューター [#na7142b3]
***定数・マクロ・サブルーチンの定義 [#c041b14c]
  #define signal_can 11       //積む側のプログラムに移行する指示
  #define signal_move 12     //台車側のプログラムに移行する指示
  #define signal_last 13     //最後ゴールの円に缶を離す指示
  #define back(t) OnFwd(OUT_AC); Wait(t); Off(OUT_AC);              //後退
  
  sub move_can()    //缶を積む前と積んでいるときの台車の動き
  {
     OnRev(OUT_AC);
     until(Message() == signal_can);    //缶を見つけるまで前進
     OnRev(OUT_AC);                   
     Wait(150);
     Off(OUT_AC);                      //缶との距離を詰める
     until(Message() == signal_move);  //缶上げ終わるまで停止
  }
  
  
  sub tyokkaku()      //90度曲がるときの動き
  {
     OnFwd(OUT_C);
     OnRev(OUT_A);
     Wait(80);
     Off(OUT_AC);
  }
  
  sub last()     //最後に缶をゴールに置くときの動き
  {
     turn_left(31);
     SendMessage(signal_last);        //左に少し曲がり、缶を離すように指示を出す
     until(Message() == signal_move);
     back(100);                       //動けと指示が来たら後ろに下がり缶から離れる
  }
***タスクメイン[#dd0c8655]
  task main()
  {
     ClearMessage();
     move_can();                           //1つ目の缶を見つけるまで
     tyokkaku();                           //曲がる
     move_can();                           //2つ目の缶を見つけるまで
     last();                               //缶をゴールに置いていく間
  }

実際の動きで、直角に曲がり切れなかったのは、tyokkakuのサブルーチンのWait(80)の時間が短かったからだと思う。
**缶を感知・持ち上げる側のコンピューター [#j0dd7c72]
***定数・マクロ・サブルーチンの定義 [#z16f2020]
  #define signal_can 11              //積む側のプログラムに移行する指示
  #define signal_move 12             //台車側のプログラムに移行する指示
  #define signal_last 13             //最後缶をゴールに置く指示
  #define close OnFwd(OUT_B);   //アームを閉じる
  #define open(t) OnRev(OUT_B); Wait(t); Off(OUT_B);    //アームを開く
  #define can_up(t) OnRev(OUT_A); Wait(t); Off(OUT_A);  //アームを上げる
  #define can_down(t) OnFwd(OUT_A); Wait(t); Off(OUT_A); //アームを下げる
  #define can_find 28                    //缶判別の光センサーの値
  
  sub hazime()      //動き始め(缶を見つけるまでは何もしない)
  {
     Off(OUT_AB);
     until(SENSOR_2 < can_find);
     SendMessage(signal_can);       //光センサーの値が缶のある値を下回ったら缶があると感知
     Wait(150);   //缶との距離を詰めている間少し待つ
  }
  
  sub ageru()  //缶を持ち上げる
  {
     close;
     can_up(200);
     SendMessage(signal_move);    //持ち上げ終わったら台車側に動けと指示する
  }
  
  sub idoutyuu()  //移動中缶を上げる(重さで少し下がってくるので)
  {
     while(SENSOR_2 < can_find){          //缶が下がってきたら光センサーの値が小さくなる
          can_up(10);
          Wait(20);            //0.1秒アームを上げ、0.2秒待つ
     }
  }
  
  sub tumu()  //缶を積む
  {   
      can_up(20);  //上まで上げる
      SendMessage(signal_can);
      can_down(100);  //缶を合わせる
      open(100);      //開いて
      can_down(100);  //下まで下げて次の缶を持ち上げる準備
  }
  
  sub last()  //最後ゴールに缶を置く時
  {
      until(Message() == signal_last);
      can_down(200);
      SendMessage(signal_move);
  }     

***タスクメイン [#zf89abe4]
  task main()
  {
      SetSensor(SENSOR_2,SENSOR_LIGHT);
  
      hazime();
      ageru();
      idoutyuu();
      tumu();
      ageru();
      last();
  }
ちょうどいいcan_findの値を見つけるほどの時間がなかったので、練習段階では缶を認識しなかったり、缶がないのに認識してしまったりすることがあった。

実際、1回目のageruのサブルーチンまでうまくいっていることが確認できた。つまり、缶を見つけ、缶を挟み、持ち上げる、というところまでは練習段階ではうまくいっていた。直角に曲がれないことや、ロボットの性能が悪く一度持ち上げた缶が落ちてしまうことにより、それ以降は計画通り動かなかった。曲がる時間を調節する時間があればよかった。また、一度上げた缶が下がってきた場合は、缶を上げ続けることで対処しようとしたが、ロボットの性能の悪さからか、うまくできなかった。
*失敗点・うまくいかなかった原因 [#ycc22ad6]
上記の通り、ロボットがモーターにとても負荷をかけるしくみ(特に持ち上げる部分)であった。
プログラムにかけられる時間がとても少なかったため、不備が出てきてしまった。
特に曲がる時間や缶を認識する光センサーの値の調節に十分な時間が割けなかった。
プログラムとロボットの両方に不備ができ、その結果上のような計画と全く違う動きになってしまった。残り数日というときにロボットのしくみを全く別のものにしなければ、時間が足りなくなることはなかったかもしれないと思う。
*過去の取り組み [#k1f8dce7]
一度作ったが壊してしまったロボットについて書こうと思う。
#ref(2017a/Member/shiori/Mission3/失敗作歯車.jpg)
オレンジ色の矢印を回すことにより、壁をキャタピラのほうに動かし缶をキャタピラに押し付けることができる。ここには一定以上の力が加わると空回りする白い歯車を使った。青色の矢印のモーターを回すことにより、キャタピラを回し缶を持ち上げることができる。実際に持ち上げることができていた。
#ref(2017a/Member/shiori/Mission3/失敗作全体.jpg)
オレンジの部分に缶が入り、キャタピラで持ち上げられていくしくみである。

一度持ち上げた缶は弁(上方向には缶を通すが下方向には缶を通さない)で止めようとした。残念ながら弁の写真がないが、タッチセンサーを使ったロボットを作ったときに、タッチセンサをおおっていた部分をそのまま使おうとした。

問題となったのは、弁のせいで一度持ち上げた缶が傾いてしまう、ということであった。弁の仕組みだけなくし、別の缶を上で固定しておく仕組みを考えればよかったと思う。
問題となったのは、弁のせいで一度持ち上げた缶が傾いてしまう、ということであった。弁の仕組みだけなくし、缶を上で固定しておく別の仕組みを考えればよかったと思う。
*感想・反省点 [#hc2bb957]
缶を普通に押せば3点はもらえることは分かってはいたが、どうしても缶を積み上げたくて缶を積み上げることにこだわってしまったため、結局できずに0点になってしまった。しかし、自分としては点数を気にせず最後まで缶を積み上げようと努力していたことはよかったと思う。失敗点・うまくいかなかった原因に書いてある通り、とにかく時間がなかった。もしかしたら、はじめのキャタピラ型のロボットを壊さずに何とか工夫してやっていけば、時間的にもうまくいったかもしれないと思った。今後ロボットを作る場面には遭遇しないとは思うが、この経験を生かして、早め早めに何かに取り組んでいけたらと思う。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS