#contents

*メンバー [#j7070d75]
-[[mame>2014a/Member/mame/Mission2]]
-[[dai>2014a/Member/dai/Mission2]]
-[[tadanobo>2014a/Member/tadanobo/Mission2]]
-bgpat

*課題について [#c46329ec]
**概要 [#h82d3cef]
#ref(2014a/Mission2/2014a-mission2.png)
A・B・Cに置いてある紙コップを同じ数字の紙コップに重ねる。
A・B・Cには1・2・3が書かれた紙コップを置き、配置はくじで決める。

詳しくは[[課題2のページ>2014a/Mission2]]を見てください。

*ロボットの制作 [#oce76dd3]
方向性が定まらず時間がないと焦っていたときに、[[tadanobo>2014a/Member/tadanobo/Mission2]]がNXTを持ち帰ってロボットを作って来てくれました。
#ref(2014a/Member/bgpat/Mission2/original.jpg,100%)
これをベースに全員で改良しました。
以下で私が改良に関わった部分の解説をしたいと思います。
それ以外の部分は[[他のメンバー>#j7070d75]]のページをご覧ください。

**アーム [#e6528912]
紙コップを掴むためのアームです。
本体に近いモーターを回してアーム全体を下ろしてからアーム先のモーターを回して紙コップを掴み、本体側のモーターを逆に回してアーム全体を持ち上げます。
下ろすときは本体側のモーターでアームを下ろしてからアーム先のモーターを回して紙コップを離します。
#ref(2014a/Member/bgpat/Mission2/arm1.jpg,25%)

まず、紙コップを判別するために光センサーを付けました。
紙コップには色を塗っていいことになっているので、
油性ペンと鉛筆で濃さを調節した紙コップを3つ作り、
判別できるようにしました。

次に掴む部分にガイドを取り付けました。
理由は2つあり、1つ目は位置のズレによる取りこぼしを少なくするためです。
2つ目は紙コップの判別を正確に行うためです。
光センサーを使って紙コップの明るさを測定しますが、測る位置が同じでないと正確に判別できません。
紙コップを持ち上げたあとに一度離してもう一度掴むことで、ガイドにそって常に同じ部分に紙コップが来るようになります。

&ref(2014a/Member/bgpat/Mission2/arm-sensor1.jpg,17%);
→
&ref(2014a/Member/bgpat/Mission2/arm-sensor2.jpg,17%);

**ドライブベース [#le3f36b6]
ロボットの移動に関する部分です。
前輪にモーターを2個、後輪にタイヤを1個使っています。
#ref(2014a/Member/bgpat/Mission2/drivebase1.jpg,50%)

後輪を一番大きいタイヤのゴムを外したものにしました。
はじめは見本と同じキャスターでしたが、
車体が重すぎてタイヤ以外の部分が地面についてしまいうまく曲がれなくなったため、
うまく曲がれるものに改良することになりました。
見本のように向きを変えることはできませんが、
摩擦が少ないので引きずりながらも曲がることができます。
#ref(2014a/Member/bgpat/Mission2/drivebase2.jpg,25%)

あと、トレース用の光センサーがついていましたが、超音波センサーの精度が予想以上によかったため外しました。

**紙コップとの距離を測るセンサー [#l8170a85]
車体の正面についている超音波センサーです。
縦に向けることで測定精度が上がりました。

*プログラム [#zf8c6513]
このページには「どういうプログラムを書いたか」だけを記載します。
とても長いので、このページには「どういうプログラムを書いたか」だけを記載します。
ソースはzip形式でダウンロードできます。
&ref(2014a/Member/bgpat/Mission2/src.zip);
master.nxcがマスター用、slave.nxcがスレーブ用のプログラムとなります。
編集を容易にするため、機能毎にファイルを分けて#includeで読み込んでいます。

**大まかな流れ [#n17c36f9]
スタートするとαのように動いて紙コップを取りに行きます。
紙コップを取るとβのように動いて紙コップを置きに行きます。
これをA〜Cまで繰り返します。
#ref(2014a/Member/bgpat/Mission2/cource1.png)

紙コップを取りに行くとき、置きに行くときは同じ動作です。
向きを変えて画像のように進み、紙コップを取るor置く動作のあと、それぞれのスタート位置に戻ります。
#ref(2014a/Member/bgpat/Mission2/cource2.png)
こうすることで、書くプログラムの量が減り、調整に時間をあてることができました。

**位置の調整方法 [#mcc19b2e]
向きや距離はモーターの回転センサーから計算し、指定した角度だけ回転したり指定した距離だけ進むことができます。
向きは左右の差、距離は回転数から求めています。

回転センサーだけでの調整ではズレが生じるため、超音波センサーを使って紙コップとの位置を調整します。
超音波センサーは正面の障害物との距離を測ることができるので、
車体を左右に振って一番近くなったところが紙コップの方向となります。
近ければ近いほど精度があがりますが、
超音波センサーは6cmくらいまでしか測定できないため、
6cmのところまで近づいて紙コップの方向を向いたあと、
適切な距離まで下がることで紙コップをとるor置くことができる位置に車体を移動させます。

**紙コップを取る、置く [#l1234038]
アームの操作はモーターを回すだけですが、回転数が多すぎても少なすぎてもちゃんと取るor置くことができないため、
ここでも回転センサーを使って制御しています。
指定した角度になるまでモーターを動かし続けます。

本体側のモーターは、アームの先にモーターが付いているのでアームが重く、
力の調整が難しくなっています。
ONとOFFだけの制御ではアームが跳ね上がってしまうことがあり、紙コップの取れる位置まで下がらないことがあります。
このため、指定した角度になったあとも小さい力で押さえつけるようにモーターを動かし続け、ずれないよにします。

アーム先のモーターは、紙コップを掴んでいるとき力をかけ続けます。
こうすることで紙コップを落とすことなく持ち上げることができます。

**NXT本体間の通信 [#j9aa06ed]
NXTにはモーターを3つまでしか接続することができません。
今回は走行用に2個、アームに2個のモーターを使っているのでNXT間で通信を行いモーターを制御する必要があります。

通信にはBluetoothを使います。
slaveはアームの制御だけを行い、masterはアームを動かしているときは待機します。
***master [#laf4140d]
+slaveのプログラムを起動させる
+slaveに命令を送る
+slaveから終了メッセージが送られてくるまで待機する
***slave [#qcadea0c]
+masterからメッセージが来るまで待機する
+masterからの送られてきた命令を実行する
+masterに終了したことを通知する
このような流れになっています。

紙コップを持ち上げてガイドに固定したあと判別が可能になりますが、それまでに紙コップの明るさを測定すると正確に判別することができません。
プログラムを起動するだけでは終了したことがわからず、
紙コップの判別に支障が出ると考えたため、
多少手間はかかりますがメッセージを使った通信を使いました。

*ロボコンの結果 [#b4d8af3e]
紙コップ2個を運び、優勝しました。
3個目は掴むのに失敗してしまいました。

*反省点 [#q33265a4]
-課題1のときと同じように時間が足りませんでした。
本当は掴み損ねたときに復帰するようなプログラムを書きたかったのですが、
テスト前だったり、他の授業のレポート課題があったりと時間を作るのが難しく、
実装することができませんでした。
-役割分担が偏ってしまいました。
今回のプログラムはほぼ全て私が書いたため、他のメンバーが修正できないということが起こりました。

*感想 [#r5115e82]
予想以上に時間を取られてしまい辛い時もありましたが、ロボットを作るのは楽しかったです。
プログラミングは趣味でやっていたので楽にできそうだと考えていましたが、実際動かしてみると思い通りに動かないことが多く大変でした。
前日は1個しか成功していなかったこともあり、2個成功したことにはとても驚きました。
時間はかかりましたが、ロボコン優勝もできて満足のいく結果になりました。

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