[[2013b/Member]]
*ライントレースをしながら缶を積んでいくロボット [#bc98846e]

#contents

**はじめに [#ha42c211]

前回の失敗を踏まえ、今回はクリアしなければいけない課題を細かく分けてひとつずつクリアさせ、最終的にそれらを統合して課題の解決を目指す。

具体的には今回の課題の難点は次のように分類できる。

・ライントレース
・缶の積み上げ
・缶を積んだ状態での移動
・2つのNXTの連携

まずはこれらを一つずつつぶしていく。

**ロボットの制作 [#u1e286d7]

***大まかな指針 [#z62c2ee3]

Φまず缶をどのように積むか?
→クレーン式?フォークリフト式?アームの上げ下げ式?2台に分けて作業分担?

結論:アームの上げ下げ式。因みにアームは水平移動しない。

理由:いろいろと試した結果、ほかの方法ではパーツが足りない。また缶を掴む際にしっかり掴めない。

Φ主に使う部品

モーター数:4つ
(タイヤ:2つ、缶の上げ下げ:1つ、缶を掴む,離す:1つ)

NXT本体:2つ(モーターを4使うため)

用いるセンサ:光センサ、超音波センサ
(光センサ⇀ライントレースに使用、超音波センサ⇀缶の発見に使用)



***試作機 [#y7066b49]

&ref(2013b/Member/chikuwa/Mission2/試作機.jpg,70%,試作機);

Φ問題点

上図ではまだアームをつけていないが、もしこの状態でアームをつけると重みで本体が前に傾く可能性がある。また中央部がスカスカなのでもう一台NXTをつけると重みで機体が沈む。

Φ改善

そこで土台の隙間をさらにうめて、NXTを倒した状態で2つくっつけてみた。重心を前回より後方に
することで安定度が向上するようにしてみた。


そして次のような完成品が出来上がった。

***完成品 [#vce5cfa4]

Φ全体

&ref(2013b/Member/chikuwa/Mission2/完成品.jpg,70%,完成品);

↑アームをつけた状態で前に倒しても前のめりになることは無かった。
NXT本体2つは通信させながら使用する。因みに

Masater側がタイヤ、光センサ、超音波センサを司る。

Slave側が缶のキャッチ、上げ下げを司る。

Φ後部

&ref(2013b/Member/chikuwa/Mission2/後ろ.jpg,50%,後ろ);

↑赤丸で示したように小さなタイヤ二つをつけた。これはきちんと360°回転する。四輪駆動も試してみたが、カーブが曲がり切れなかったため最終的にこの方法を採用した。試しに動かしてみたところ、ゆっくりではあるがきちんと機体は一回転した。

Φアーム部

&ref(2013b/Member/chikuwa/Mission2/アーム部.jpg,50%,アーム部);


&ref(2013b/Member/chikuwa/Mission2/アーム部の正面.jpg,50%,アーム部の正面);


↑初めは、キャッチしても缶の重みでアームをすり抜けてしまうことが多かったが、ゴムをつけると安定して掴めるようになった。







**まずは簡単な動作から... [#cb057c59]
 前進→缶を発見→アームを下ろす→前進→缶を掴む→缶を上げる→前進

という単純な動作をまずは出来るようにする。

***ソースコード [#nf18e47f]
✡マスター側
 #define CONN 1
 #define SIGNAL_A 11
 #define SIGNAL_B 12
 #define SIGNAL_C 13
 #define SIGNAL_D 14
 #define go_forward OnFwd(OUT_AB,60);
 task main()
 {
  SetSensorLowspeed(S1);
  int msg;
  int msg_2;
  go_forward;
  if(SensorUS(S4)<10){//もし10センチ以内に缶を発見したら
   SendRemoteNumber(CONN,MAILBOX1,SIGNAL_A);
     /*SのメールボックスにSIGNAL_Aを送信*/ 
   ReceiveRemoteNumber(MAILBOX2,true,msg);
     /*Sからメールボックス2にメッセージを受信*/
    if(msg==SIGNAL_B){ //もしSIGNAL_Bを受信したら
     OnFwd(OUT_AB,60);Wait(1000);//1秒間前進
     SendRemoteNumber(CONN,MAILBOX3,SIGNAL_C);
       /*Sのメールボックス3にメッセージを送信*/
     ReceiveRemoteNumber(MAILBOX4,true,msg_2);
       /*Sからメールボックス4にメッセージを受信*/
      if(msg_2==SIGNAL_D){//もしメッセージがSIGNAL_Dなら
       go_forward;Wait(2000);//2秒前進         
       } 
     }
    }
 } 
 
&#10017;スレイブ側
 #define CONN 1
 #define SIGNAL_A 11
 #define SIGNAL_B 12
 #define SIGNAL_C 13
 #define SIGNAL_D 14
 task main()
 {
  int msg;
  int msg_2; 
  ReceiveRemoteNumber(MAILBOX1,true,msg);
   /*Mからメールボックス1にメッセージを受信*/
   if(msg==SIGNAL_A){//もしメッセージがSIGNAL_Aなら
    RotateMotor(OUT_B,75,4270);//アームを下ろす
    SendResponseNumber(MAILBOX2,SIGNAL_B);
     /*MのメールボックスにSIGNAL_Bを送信*/
    Off(OUT_AB);Wait(1000);//1秒間待機
    ReceiveRemoteNumber(MAILBOX3,true,msg_2);
     /*Mからメールボックス3にメッセージを受信*/
     if(msg_2==SIGNAL_C){//もしメッセージがSIGNAL_Cなら
      RotateMotor(OUT_A,85,-110);//缶を掴む
      RotateMotor(OUT_B,75,-4270);//アームを上げる
      SendResponseNumber(MAILBOX4,SIGNAL_D);
       /*MのメールボックスにSIGNAL_Dを送信*/
      }
     }
 }

**次に缶をどうやって見つけるか [#g7b05218]

**ライントレースはどうする? [#k30a9f9a]

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS