[[2016a/Member]]

*課題3 [#hf557d04]

**目次 [#n03a4175]
#contents

**ロボット本体の説明 [#de0d83db]

ロボットは2つのNXTを組み合わせた一体型を選んだ。
タイヤをつけた本体に2種類のアームをつけたモノである。
片方のアームはアームの中に入ったコップをつかむためのモノ。
ここにコップを固定して積んでいくために使う。(アーム1とする)
もう一つのアームは上からコップをつかんで移動させることができるモノである。
これで他のところにあるコップを先ほどのコップの上にのせるために使う。(アーム2とする)
また、アーム1の逆側にY字状の突起をつけここに紙コップが入るとその付近につけた超音波センサーが反応するようにした。

マスターにはタイヤとアーム1に用いているモーターをつなぎ、超音波センサーもつないだ。
スレーブにはアーム2に用いているモーターをつないでいる。

#ref(robon31.png)


**プログラムの説明 [#kedefccd]

簡単に説明するとアーム12を用いて紙コップを拾いつつ円の中に4つを運ぼうというモノである。

***マスターのプログラムの説明 [#l4dd1957]

 #define CONN 1   // スレーブの接続番号
 #define tyouonpa 7.75  //超音波センサーの距離

 task main()
 {
     SetSensorLowspeed(S1);
     RotateMotorEx(OUT_AC,75,-600,0,true,true);  //AからDへと向かう
     Wait(2000);
     until (BluetoothStatus(CONN) == NO_ERR); // 接続できるまで待つ
     OnRevSync(OUT_AC,50,0);
     until (SensorUS(S1) <= tyouonpa);  //7.75cmまで近づく
     Off(OUT_AC);
     RemoteStartProgram(CONN,"cup_hold_first.rxe");  //コップをつかんで下ろすプログラムを起動
     Wait(10000);
     RotateMotor(OUT_B,30,-20);
     Wait(15000);
     RotateMotor(OUT_B,50,-28);
     OnRevSync(OUT_AC,50,0);
     until (SensorUS(S1) <= tyouonpa);  //7.75cmまで近づく
     Off(OUT_AC);
     RemoteStartProgram(CONN,"cup_hold.rxe");  //コップをつかんだままのプログラムを起動
     Wait(10000);
     RotateMotorEx(OUT_AC,75,500,100,true,false);  //方向転換
     RotateMotorEx(OUT_AC,75,-1500,0,false,false);  //Cに向かう
     OnRevSync(OUT_AC,75,0);
     until (SensorUS(S1) <= tyouonpa);  //7.75cmまで近づく
     Off(OUT_AC);
     RemoteStartProgram(CONN,"cup_yoko_oki.rxe");
     Wait(15000);
     RemoteStartProgram(CONN,"cup_hold_next.rxe");  //コップをつかんで下ろすプログラムを起動
      Wait(20000);
     RemoteStartProgram(CONN,"cup_yoko_toru.rxe");
     Wait(20000);
     OnRevSync(OUT_AC,75,0);
     until (SensorUS(S1) <= tyouonpa);  //7cmまで近づく
     Off(OUT_AC);
     RemoteStartProgram(CONN,"cup_hold_next.rxe");  //コップをつかんで下ろすプログラムを起動
     Wait(20000);
     RotateMotor(OUT_A,75,180);  //方向転換
     RotateMotor(OUT_B,30,50);  //アームを開く
 }

まずマスターのプログラムでスレーブのプログラムを起動しつつ動かしていくプログラムを選んだ。
また、総重量や時間、メンバーの技術などの都合上ライントレースを用いずにRotateMotorExなどを用いることで誤差を減らし進ませることにした。
プログラム内でも書いてある通り、まずAからスタートしDへと向かい超音波センサーを用い紙コップをつかみ乗せていくプログラムをつぎつぎと作動させていく。
そして、2つ掴むとCへと向かいまた紙コップをのせ、その後旋回し紙コップをもったアームが円内に入りアームを話すというプログラムである。

***スレーブのプログラムの説明 [#dbb9a2db]
次にスレーブのプログラムである。
またアーム2のプログラムでもある。
これらは自分で書いたプログラムではないので詳しくは分からないがざっくりと説明していく。

【cup_hold】
 #define hold_up RotateMotor(OUT_C,50,500); Wait(1000); RotateMotor(OUT_B,50,-88); RotateMotor(OUT_C,80,-500);
 #define hold_down RotateMotor(OUT_C,50,500); Wait(1000); RotateMotor(OUT_B,50,88); RotateMotor(OUT_C,80,-500);

 task main()
 {
     ResetTachoCount(OUT_ABC);
     hold_up;                      //手(先端)がモータB 肘(中間)がモータC 肩(根本)がモータA
     Off(OUT_B);
 }

これはカップを掴んで持ち上げたままにしておくプログラムである。
持ち上げたまま他の場所に運ぶときに使う。



【cup_hold_first】
 #define hold_up RotateMotor(OUT_C,50,500); Wait(1000); RotateMotor(OUT_B,50,-88); RotateMotor(OUT_C,80,-500);
 #define hold_down RotateMotor(OUT_C,50,500); Wait(1000); RotateMotor(OUT_B,50,88); RotateMotor(OUT_C,80,-500);
 #define kata_hanten 860

 task main()
 {
     ResetTachoCount(OUT_ABC);
     hold_up;                      //手(先端)がモータB 肘(中間)がモータC 肩(根本)がモータA
     RotateMotor(OUT_C,90,-100);
     Off(OUT_B);
     Wait(2000);
     RotateMotor(OUT_A,75,kata_hanten);    //肩180度回転(正で正面右)
     Wait(1500);
     RotateMotor(OUT_C,75,100);
     hold_down;
     RotateMotor(OUT_A,75,-kata_hanten); //手がマイナスで手を閉じる
     ResetTachoCount(OUT_ABC);
 }

カップを持ち上げアーム1へと運びアーム1の中に入れてから戻ってくるというモノである。

【cup_hold_next】
 #define hold_up RotateMotor(OUT_C,50,540); Wait(1500); RotateMotor(OUT_B,50,-88); RotateMotor(OUT_C,80,-540);
 #define hold_down RotateMotor(OUT_C,50,450); Wait(1500); RotateMotor(OUT_B,50,88); RotateMotor(OUT_C,80,-450);
 #define kata_hanten 860

 task main()
 {
     ResetTachoCount(OUT_ABC);
     hold_up;                      //手(先端)がモータB 肘(中間)がモータC 肩(根本)がモータA
     RotateMotor(OUT_C,90,-100);  
     RotateMotor(OUT_B,80,-3);
     Off(OUT_B);
     Wait(2000);
     RotateMotor(OUT_A,75,kata_hanten);    //肩180度回転(正で正面右)
     RotateMotor(OUT_C,50,50);
     Wait(2000);
     hold_down;
     RotateMotor(OUT_C,50,50);
     RotateMotor(OUT_B,80,3);
     RotateMotor(OUT_A,75,-kata_hanten); //手がマイナスで手を閉じる
     ResetTachoCount(OUT_ABC);
 }

先ほどと似たようにコップを掴み下ろすプログラムである

【cup_yoko_oki】

 #define hold_up RotateMotor(OUT_C,50,540); Wait(1000); RotateMotor(OUT_B,50,-88); RotateMotor(OUT_C,80,-540);
 #define hold_down RotateMotor(OUT_C,50,500); Wait(1000); RotateMotor(OUT_B,50,88); RotateMotor(OUT_C,80,-500);
 #define kata_hanten 860

 task main()
 {
     ResetTachoCount(OUT_ABC);                    //手(先端)がモータB 肘(中間)がモータC 肩(根本)がモータA
     RotateMotor(OUT_A,75,kata_hanten/2);    //肩90度回転(正で正面右)
     Wait(1500);
     hold_down;
     RotateMotor(OUT_A,75,-kata_hanten/2); //手がマイナスで手を閉じる
     ResetTachoCount(OUT_ABC);
 }
カップを掴みアーム1に運ぶのではなく横に運ぶプログラムである

【cup_yoko_toru】
 #define hold_up RotateMotor(OUT_C,50,540); Wait(1000); RotateMotor(OUT_B,50,-88); RotateMotor(OUT_C,80,-540);
 #define hold_down RotateMotor(OUT_C,50,500); Wait(1000); RotateMotor(OUT_B,50,88); RotateMotor(OUT_C,80,-500);
 #define kata_hanten 860

 task main()
 {
     ResetTachoCount(OUT_ABC);    //手(先端)がモータB 肘(中間)がモータC 肩(根本)がモータA
     RotateMotor(OUT_A,75,kata_hanten/2);    //肩90度回転(正で正面右)
     Wait(1000);
     hold_up;
     RotateMotor(OUT_C,90,-100);  
     RotateMotor(OUT_B,80,-5);
     Off(OUT_B);
     Wait(2000);
     RotateMotor(OUT_A,75,kata_hanten/2); //手がマイナスで手を閉じる
     RotateMotor(OUT_C,50,50);
     Wait(1000);
     hold_down;
     RotateMotor(OUT_C,50,50);
     RotateMotor(OUT_A,75,-kata_hanten);
     ResetTachoCount(OUT_ABC);
 }
先ほどの横に置いたカップをアーム1に運ぶプログラムである。

**結果 [#o7bc0694]
結果としては超音波センサーの不具合やモーターの端子が刺さっていなかったことなどもありうまく動かすことができず、途中までしか動かすことができなかった。

**考察・まとめ [#kb9deac4]
***良かった点 [#e5d89ed0]
アームの動きや見た目などで他の部分で点数を稼げたことは良かった。
時間が少ない中分業することで雑ながら間に合ったことは良かった。

***反省点 [#p13626db]
あまり時間がとれず動作時間の調整などが完璧にできなかったこと。
RotateMotorを用いたにもかかわらず左右のタイヤの回転数が異なったことが誤算であった。重量などのせいであろうか?
また、本番に思った通りに動かず直前のメンテナンスの大事さを強く感じた。

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