課題3は簡単にまとめると缶の上に乗っているボールを別の缶の上に乗せるというものだった。詳しくは2019b/Mission3を参照。私たちは効率を重視し、3つのボールを一度に運ぶロボットを作った。†ボールを確保する機構は上の写真のように、ゴムを使って組み立てた。(以後この機構をゴム枠と言う。)ボールを確保するにはゴム枠をボールに押し付ける。すると、ボールがゴムを通り抜け、上に乗るため、ボールが確保できる。この時、ゴムの柔軟性により、ゴム枠が多少缶からずれてしまってもボールを確保できる。ボールを確保したら、そのままゴム枠を上に上げることで、ゴム枠の後ろに連結しているレールの上にボールが貯まる仕組みになっている。†ボールを缶に乗せる時のポイントとなるのは左の写真のアームである。このアームでボールを抑え、ゴム枠を上に上げることでボールがゴムを通り抜け缶の上に乗る仕組みとなっている。このとき、2つ工夫した点がある。1つは下に示す棒についてである。見えにくいが、この棒があることによって、アームを左に傾けるとレールの傾斜が無くなり、アームを右に傾けるとレールに傾斜が付きボールがゴム枠の方へ転がるようになっている。2つ目は、ボールを缶に乗せるときにゴム枠にボールが一つずつ乗るように、ボールの運び役かつ、次のボールのストッパーの役割を果たす突起である。この突起はゴム枠と連動しているため、写真のように、ゴム枠が床と水平になると出てきて、ゴム枠が垂直になると隠れるようになっている。したがって、ボールを缶に置く時には、下の写真のようにボールを隔てることができる。缶の位置の把握には超音波センサを使った。超音波センサは付ける位置が重要になるので悩んでいたが、ゴム枠とアームを下の写真のようにうまく利用すると、良い位置に付けることができた。写真の位置を超音波センサの初期位置とした。その他のセンサとしては、光センサをライントレースのために2つ使った。最終的な全体像はこのようになった。初めは写真のキャスターの部分が、プラスチックの部品で支えるだけになっていたが、実際に走らせてみると摩擦が大きく、モータに負担が掛かっていそうだったのでキャスターに変えた。初めはボールを掴む機構と缶に置く機構を別々に逆方向に付けていたが、同一方向に付けることで、旋回などの手間を省き、進行方向のライントレースだけで全てを行えるようにした。†その場で旋回するのはよく使うため、関数にしておいた。私たちのロボットは構造上、缶からボールを取ったあとも超音波センサが缶に反応してしまうため、取ったあとの缶をどかすために指定距離だけ前後に動くプログラムを作った。†ライントレースでは光センサを2つ使って制御した。10上のように閾値などを設定した。Off(OUT_BC);}比例制御について説明する。上の写真では光センサの閾値がwhiteに近づくほど出力が大きくなるような図を書いた。black)の部分は説明された。これでは光センサの閾値がblackに近くなると出力が小さくなり過ぎて動かないことがあった。加えることで黒に近づいてもある程度の出力が出るように補正した。超音波センサはたまにおかしな値を出すときがあるため、より確実に超音波センサの値を出すために50回センサの値を測って、その平均をとるようにした。†ロボットを動かし始めたとき、どこに超音波センサがあっても必ず定位置にくるようにアームとゴム枠を使って調整した。アームは少し重いため、出力を2倍にしている箇所がある。†メインプログラムをすっきりさせたかったので通信からボール確保までを一連の流れとしてまとめた。†これもメインプログラムをすっきりさせるために一連の流れとしてまとめたものである。私のプログラムは時間が足りずボールを一つ置くまでしかできなかった。そのため、本番ではグループ内の別の人のプログラムを使った。直前で電池がなくなり、出力が変わってしまったため失敗した。†まず、今回の課題ではロボットの構造を何度も作り直したり、継ぎ足したり、変えたりと、ハード面で時間を使いすぎてしまった。そのため、プログラムに使う時間が少なくなってしまい十分なプログラムが組めなかった。ロボットの構造は良かったので、前回の反省は生かせたと思う。このゼミを通して、プログラムの基礎的なことは身についたと思う。プログラムは時間のほとんどをデバックに使っていることや、それ故に分かりやすいプログラムを書くことが大切であるということを痛いほど実感した。この経験を今後に生かしていきたいと思う。