今回の課題でコップを運ぶために使った方法は、コップを持ち上げて運び重ねていく方法です。ロボットのコップを掴む動作は、先生が授業で話していた一つのモータで掴んで持ち上げる仕組みを使いました。基本的に一台でコップを運び、もう一台はQ地点で待機して壁にして、コップが倒れないようにしました。左の写真がコップを運ぶロボットで、右の写真が壁になるロボットです。†コップを運ぶロボットでは、コップを認識するためにセンサが必要なので、そのために光センサを使いました。下の写真のように組み合わせることで光センサを両方真ん中の位置に合わせた。†コップを運ぶロボットのアームと当たらないように、アームを紙コップの下の方を軽く抑えられるような位置にした。†アームを下したときに、下の写真の赤丸の部分でアームをこれ以上下がらないようにしているが、センサを取り付けている部分の固定が弱いため、下すときの衝撃でとれてしまうことがある。固定の仕方を試行錯誤したが、良い方法が見つからず時間も足りないと考え、このまま進めることにした。†ライントレースのプログラムは、私の課題2のプログラムのマクロとサブルーチンをそのまま使いました。intersection()はサブルーチンの個数が8個を超えてしまうのでmain()に直接書きました。他の部分は変更が無いので説明は課題2で見てください。二台のロボットの通信をするための数値をSIGNALONとして定義した。紙コップにある程度近づいた時の光センサの値をWHITEとして定義した。回収したコップを数える変数cup_countは後で説明するcup_down()でも使用したかったのでグローバル変数にした。紙コップの位置と番号を下の図のように決め、番号ごとに掴む動作cup1(),cup2(),cup3()と定義した。光センサの値がWHITEより大きくなるまでゆっくり直進するようにした。細かい移動は旋回や前後進を使い、時間で指定した。最初のコップを置くときは、壁になるロボットと通信して動作をさせるようにした。コップを前に押すことで、次のコップを重ねるときにコップがうまく重なる位置に調整するようにした。†switch文を使い、交差点判別をするたびに変数cの値を増やしていき順番に動作するようにした。順番にすべて書いていくとcaseがとても多くなってしまうので、cの値をリセットしてcase2に戻ってくるようにし、変数course_checkを使うことでC地点に行くか、D地点に行くかを交互にできるようにし、変数cup_countを使うことでどのコップを回収する動作をするのか判断できるようにすることで無駄を省いた。すべてのコップを回収し終わったら、変数dを1にすることでwhile文を抜け、動作を停止するようにした。†ライントレースも含めたすべてのプログラムは以下のようになる。壁用のロボットは光センサがないので、すべて時間指定の動作になってしまった。動作はコメント文の通りです。†1回目は、壁ロボットが想定より進まず、紙コップを下したときに壁ロボットの上に当たってしまい1つも置くことができなかった。2回目は、紙コップを1つ置くことができたが、そのあとラインに戻れず続行不能となった。結果は1つ置くことができたおかげで2位でした。†なかなかロボットを組み立てることができず、時間もあまりとれなかったため、私がほとんどプログラムを組むようになってしまった。みんなでプログラムを考えていきたかった。ロボコン前まではうまくいっていたが、電池の微妙な減りによって、本番では動作が変わってしまいラインに戻ることができず残念だった。アームの力が強すぎたので、ギアを変えたりして弱くした方がよかったと思いました。優勝したグループがひっくり返して重ねていくような方法をしていたのを見て、持ち上げて重ねるといった形に縛られ過ぎていたと思いました。