目次 #contents *課題3の内容 [#u2fb7e32] 紙コップに入っている赤ボール2個と青ボール2個をそれぞれ空の紙コップに移し替える~ フィールドは課題2で作成した紙を2枚つなぎあわせて使用する。~ &ref(http://yakushi.shinshu-u.ac.jp/robotics/?plugin=ref&page=2014b%2FMission3&src=robotics-2014b-3.png); #br 参照:[[課題3:http://yakushi.shinshu-u.ac.jp/robotics/?2014b%2FMission3]]~ 今回はNXTを2台分使用して、4人一組で制作する。 #br *ロボット本体 [#t13bd40a] 今回の課題は4人一組のチームを組んで行うので、プログラム担当とロボット制作担当の二人ずつに分かれて進めていった。自分はプログラム担当で、ハサミの部分(スレーブ側)のプログラムを作成した。何度も問題が発生したため、そのたびに改良を重ねた。それぞれの段階ごとに説明する。 **完成形 [#e5b45c86] #br 全体像~ #ref(normal.jpg)~ #br 私達のチームのロボットの特徴はカニのような大きなハサミが付いていることである。~ このハサミでコップを掴み、うで全体を回すことでコップを持ち上げて中の玉をからのコップに注ぐ。~ ハサミにはコップから玉が落ちないようにフタもついていて、腕を持ち上げてから蓋を開くことで玉をからのコップに落とす。 #ref(normal0.jpg)~ #br 腕を上げた状態~ #ref(up.jpg)~ この状態からフタを開くことで、下にあるからのコップに玉を落とす。 #br #ref(pour.jpg)~ **試作品ver1 [#cacc142f] #ref(ver1.0.jpg)~ 一番最初に制作したロボットはこのような状態で、フタはなく、シンプルな作りだった。腕はハサミで掴むためのモーターとそれを持ち上げるモーターを2つつなげただけで、コップを傾けて玉を注ぐ予定だった。~ しかし、腕を本体に接続している部分がただピンで刺しているだけでとても弱く、腕の重さで垂れ下がってしまっていた。~ 実際に動かしてみると注ぐときにコップのくちに全然届かなかった。~ #br **試作品ver2 [#kae552a3] そこで、腕の高さを確保するために本体上部にレールを装備し、そのレール上にモーターを置くことにした。このレールはコンピューター部分の両側から固定されているので、モーターをガッチリと固定することができた。 #ref(ver1.1_2.jpg)~ #br #ref(ver1.1.jpg)~ #br このように、両側からガッチリと固定している。 #ref(rel.jpg)~ **フタを装着(完成品) [#t4141f74] これらのような改良をしたあとに実際にプログラムを走らせたところ、コップから玉を注ぐすときにどうしても落下する位置がからコップからズレてしまった。この問題を解決するために、ハサミの上に可動式の蓋を付けた。このフタをモーターで開閉することで、任意のタイミングでたまを落とすことが可能になった。 #ref(close.jpg)~ #br このように持ち上げてから、任意のタイミングで蓋を開く #ref(ready.jpg)~ *プログラム [#aa5811a4] **本体(マスター)のプログラム [#gd47347a] **ハサミ(スレーブ)のプログラム [#t84401d7] ***コップをつかむプログラム [#pcdc5b9a] /* モーターAがハサミ、モーターBが腕、モーターCが蓋 */ #define HOLD OnFwdReg(OUT_A,-40,OUT_REGMODE_IDLE); //コップを挟む task main() { HOLD; //掴む Wait(500); //ちょっと待つ Off(OUT_A); //モーターAを切る(※) Wait(500); PlaySound(SOUND_UP); Wait(100); PlaySound(SOUND_UP); Wait(100); } ※ OnFwdRegでスピードをOUT_REGMODE_IDLEとしたところ、なぜかプログラム終了時にモーターが少し逆回転してハサミが勝手に開いてしまったため、この文を加えた。 ***コップを離すプログラム [#r09c11a0] /* モーターAがハサミ、モーターBが腕、モーターCが蓋 */ #define RELEASE RotateMotor(OUT_A,50,50); //コップをはなす task main() { ResetTachoCount(OUT_AB); //モーターABの回転角をリセット RELEASE; //コップを放す Wait(300); PlaySound(SOUND_DOWN); Wait(100); PlaySound(SOUND_DOWN); Wait(100); } ***持ち上げてボールを移すプログラム [#g7b268da] /* モーターAがハサミ、モーターBが腕、モーターCが蓋 */ #define HOLD OnFwdReg(OUT_A,-40,OUT_REGMODE_IDLE); //コップを挟む #define UP_MAX RotateMotor(OUT_B,-80,185);OnFwdReg(OUT_B,0,OUT_REGMODE_IDLE); //コップを持ち上げてそのままキープ #define CLOSE RotateMotor(OUT_C,50,-120); //蓋を閉める task main() { ResetTachoCount(OUT_ABC); //モーターABCの回転角をリセット /*コップを掴んで蓋をする*/ HOLD; //掴む Wait(1000); CLOSE; //蓋をする Wait(1000); /*180度持ち上げて静止*/ UP_MAX; //もちあげる Wait(500); /*音で作業の終了を伝える*/ PlaySound(SOUND_FAST_UP); Wait(300); PlaySound(SOUND_FAST_UP); Wait(300); Off(OUT_A); //モーターAを切る(※) } ***フタを開き、玉を落とすプログラム [#ibd45400] /* モーターAがハサミ、モーターBが腕、モーターCが蓋 */ #define OPEN RotateMotor(OUT_C,50,120); //蓋を開ける task main() { ResetTachoCount(OUT_ABC); //モーターABCの回転角をリセット /*玉を移す*/ OPEN; //蓋を開ける PlaySound(SOUND_FAST_UP); Wait(100); PlaySound(SOUND_FAST_UP); Wait(100); } ***コップを下ろすプログラム [#j6e86885] /* モーターAがハサミ、モーターBが腕、モーターCが蓋 */ #define DOWN RotateMotor(OUT_B,45,185); //腕を下げる task main() { ResetTachoCount(OUT_ABC); //モーターABCの回転角をリセット /*コップをおろす*/ DOWN; Wait(300); /*音で作業の終了を伝える*/ PlaySound(SOUND_UP); Wait(100); PlaySound(SOUND_UP); Wait(100); } *結果 [#g22c049d] *反省・考察 [#x47d3297]