[[2016a/Member]]
*ルール説明 [#k39b19cf]
http://yakushi.shinshu-u.ac.jp/robotics/?plugin=ref&page=2016a%2FMission2&src=2016a-mission2.png
 

ロボット2台を用いてC地点、D地点においてある紙コップを目的地の輪の中に運ぶ。紙コップはC地点から持ってきたものD地点から持ってきたものを交互に重ねていく。n段目のコップを重ねて3n点の得点を得る。

*ロボットの説明 [#a67ccf68]
#ref(2016a/Member/funatsu/Mission3/IMG_3196.jpg,50%)
 ロボットの土台と紙コップを持ち上げるための腕である。土台に二つのコンピューターをのせて一つは車輪および超音波を担当しもう一つは腕を担当した。光センサーをできるだけ車体の真ん中に設置し超音波センサーに反応しないようにした。腕には二つのモーターがつけられており一つは車輪の回転をもう一つは腕全体の持ち上げを担当した。

#ref(2016a/Member/funatsu/Mission3/IMG_5300.jpg,50%)
 完成した姿である。

#ref(2016a/Member/funatsu/Mission3/IMG_1130.jpg,50%)
 紙コップの持ち上げ方だが、まず上図のように二つの車輪が紙コップのふちを挟む。
#ref(2016a/Member/funatsu/Mission3/IMG_2138.jpg,50%)
 それから一つ目のモーターで紙コップを巻き込みあげ、二つ目のモーターで上に持ち上げる。

 このままD地点へ移動し紙コップを回収。再びC地点への往復を繰り返し全ての紙コップを回収する。最後にQ地点の円のの中に全ての紙コップを設置する予定であった。

*製作途中において [#kea1ddf5]
 ロボットは課題2で作ったプログラミングを用いながらライントレースをこなし、上記のように腕を動かし目標を達成する計画であった。しかしロボットの重量が大きくなりすぎてカーブの途中で止まってしまった。モーターの動力を大きくしたがうまくいかず、また幅の広さが大きくなったことで交差点の認識が困難になった。以上の修正をする時間がなかったのでライントレースすることをあきらめ直接C地点に向かいQ地点へ紙コップを一つ持ち帰ることにした。

*プログラミングについて [#p2894362]
 車体がマスター、腕がスレーブである。
 
 まずは腕のプログラミングから
 #define SIGNALON 21                    //腕を動かすためにマスターがスレ  ーブに送る信号
 #define SIGNALOFF 22                    //腕を動かし終わったことをスレーブがマスターに送る信号
 #define LIFT_up OnRev(OUT_C,35);Wait(520);Off(OUT_BC);   //腕を上げる
 #define LIFT_down OnFwd(OUT_C,20);Wait(550);Off(OUT_BC);   //腕を下ろす
 #define CATCH OnFwd(OUT_B,60);Wait(2000);Off(OUT_B);    //紙コップを持つ
 #define RELEASE OnFwd(OUT_B,50);Wait(1500);Off(OUT_B);   //紙コップを離す
 #define CONN 0                       //マスターとつながっている
 #define SIGNALON2 31
 #define SIGNALOFF2 32

 void ude()                               //サブルーチン
  {
	LIFT_down;
	CATCH;
	LIFT_up;
	CATCH;
	Off(OUT_B);
   }

 task main ()
 {
    int msg;
  while (true) {
    ReceiveRemoteNumber(MAILBOX1,true,msg);    //msgを受けている間
    if (msg == SIGNALON) {            //信号を受け取ったら紙コップを持ち上げる
     ude();
    SendResponseNumber(MAILBOX2,SIGNALOFF);    //車体に信号を送る
    } 
    if (msg == SIGNALON2) {                    //信号を受け取ったら紙コップを離す
     RELEASE;
    SendResponseNumber(MAILBOX2,SIGNALOFF2);   //車体に信号を送る
    } else {                    //どちらでもなかったら動かない
     Off(OUT_BC);
	
    }
	
 	
  }
 }

 車体のプログラミング
 #define SPEED 50                              //スピード50
 #define go_forward OnFwd(OUT_BC,SPEED);       //前進
 #define CONN 1                //スレーブを表している
 #define SIGNALON 21              //腕を動かすためにマスターがスレーブに送る信号
 #define SIGNALOFF 22                          //腕を動かし終わったことをスレーブがマスターに送る信号
 #define SIGNALON2 31
 #define SIGNALOFF2 32
 #define turn_leftC  OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED);  //左旋回
 #define turn_rightC OnFwd(OUT_C,SPEED);OnRev(OUT_B,SPEED);  //右折

 task main()
 {
	int msg                     //MAILBOXに来る信号をmsgと定義する
	
 	
  	SetSensorLowspeed(S1);                           //端子1に超音波センサ               
	go_forward;                   //前進
	until(SensorUS(S1) <= 9);            //センサの半径9cmに紙コップが入ったら停止
	Off(OUT_BC);
  	SendRemoteNumber(CONN,MAILBOX1,SIGNALON );    //信号を送る
	
 while (true){
		ReceiveRemoteNumber(MAILBOX2,true,msg); //msgを受け取っている間
		if (msg == SIGNALOFF ){         //信号を受け取ったら左旋回する
    			turn_leftC;
   			Wait(1600);
        		Off(OUT_BC);
	
	go_forward;                   //前進
	Wait(1000);
	Off(OUT_BC);
	SendRemoteNumber(CONN,MAILBOX1,SIGNALON2 );   //腕に信号を送る
		if (msg == SIGNALOFF2 ){         //信号を受け取ったら左旋回し、停止
			
    			turn_leftC;
   			Wait(1000);
        		Off(OUT_BC);
 }else {                         //それ以外では停止したまま
 Off(OUT_BC);
 }
 }
 }
 }

 以上のプログラミングを各々のパソコンに入れる。

*反省 [#ydfe7c68]
 結果としては紙コップを一つも運ぶことはできなかった。ライントレースできなければ正確に移動できないからだ。また幅が広くなってしまったのが原因で重心がづれやすくなり安定性がなくなったように思われる。走るほど骨組みがゆがんでいき光センサーの明るさが調節できなくなったのも大きな原因であろう。腕はいい動きをしていた。テスト期間でありみんな時間がない中でも集まってくれたのはとても良かった。


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