[[2016a/Member]] *課題3 [#g37c48fe] **目次 [#f68cc65a] #CONTENTS **ロボットの説明 [#ne4d7075] 一つのロボットで、紙コップを重ねながら持ち運びたかったので、一体型にしました。 #ref(本体.jpg) 本体と腕に分かれており、お互いの動きは信号を送りあって動かします。~ #ref(本体2.jpg) 超音波センサは半径9cmに物があるとロボットが停止するようにしています。 **紙コップを持つ・離す方法 [#u344a46e] タイヤを利用して紙コップを持ち上げることにしました。~ 図に書いてある黄色の矢印の方向に回すことで紙コップを持つ(巻き上げる)ことができます。~ タイヤがゴムでできているので、人間の力を加えない限り紙コップを落とすことはありません。 #ref(持ち上げ.jpg) 持った後はアームを上げ、ロボットのバランスを安定にしてから移動をします。 #ref(持ち上げ2.jpg) 紙コップを離すのは、アームを下ろす→タイヤを逆回転させて紙コップを離すという順番です。 **自分たちが決めた経路 [#g9b67f11] #ref(マップ.png) 私達はロボコン直前まで、光センサでAからCへ動かそうとしたのですが、ロボットの幅が広すぎてカーブを曲がることができませんでした。~ よって、BからCへ直接向かい、紙コップを回収して円の中にせめて一つ置こうということにしました。 **プログラム説明 [#h013f8c2] ***本体について [#o05789e9] #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); } } } } ***腕について [#p48faf26] #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); } **考察・気付いた点 [#bad6495c] 電池は新しい物にして試しました。ロボットの横幅をより狭くし、軽量化をすれば良かったのかなと思います。~ 紙コップは一度に3つまで確実に持ち上げられました。4つめは成功率がとても低かったです。~ **感想 [#eb6308d0] 紙コップを確実に持ち上げられたので、ロボットをライントレースさせることができなかったのが残念でした。限られた時間の中で一緒に協力して作ってくれたメンバーに感謝してます。