[[2019a/Member]] #contents *課題内容 [#hfbc2c28] **コース図 [#wbebb906] #ref(mission3.png,zoom,400x600) **ルール [#b4f505e8] +図の黄色い丸にあるピンポン玉を左下の円内にあるプラ容器へと運ぶ. +フィールドは課題2で使用した紙を使用する。 +生協のお弁当の四角いプラ容器2つをそれぞれ円内に置き、片方に玉を2個入れる。 +残りの2個の玉は((課題2))と同じ位置に置く。その際、ゴムタイヤやプレートの上に置いてもよい。 +プラ容器には色をつけたり文字や記号を書いてもよい。 +プラ容器は両面テープ等でフィールドに固定してもよい。 +2枚の紙の境界にはそれぞれ幅1cm、合計2cmの黒線を描いてもよい。 **点数計算 [#ga6fffd2] 点数については +基本得点20点 +技術得点20点 の合計40点で審査します.細かな内訳は #ref(http://yakushi.shinshu-u.ac.jp/robotics/?2019a%2FMission3#zb7e8fa1); をご覧ください. *ロボットについて [#p90c0617] **ロボット本体 [#a41ea091] #ref(robotbody.jpg,zoom,400x600); ロボット本体は課題2#ref(http://yakushi.shinshu-u.ac.jp/robotics/?2019a%2FMember%2FOrangestar%2FMission2);で作ったものを改良して作りました. NXTが2つ載せられるようにして,それでいてかつ小型でライントレースの際に起こる左右の揺れの影響を受けにくいようにしました. **アームとその周辺 [#k5532227] #ref(arm01.png,zoom,400x600); アームもできるだけ小型化しました.モーターに直接部品をつなげて回転運動を利用してボールをつかみます. #ref(arm02.png,zoom,400x600); ボールを離す動作です.先ほどと逆向きに回転させます. #ref(sholder.png,zoom,400x600); アームそのものを上げ下げするためのモーターです.取り付けた理由として,今回使うプラ容器にある程度の高さがあるため,このままでは容器の中のピンポン玉が取れなくなってしまうからです. **全体像 [#g8421242] #ref(robot.jpg,zoom,400x600); ロボットの全体像です.予定どおりコンパクトに仕上がりました. *プログラムについて [#g86dfaec] #define SIGNALON1 11 #define SIGNALOFF1 12 #define SIGNALON2 13 #define SIGNALOFF2 14 #define turn_right OnFwd(OUT_C,25);OnRev(OUT_B,23); #define turn_left OnFwd(OUT_B,28);OnRev(OUT_C,20); #define rotate_right OnFwd(OUT_C,25);OnRev(OUT_B,22); #define rotate_left OnFwd(OUT_B,28);OnRev(OUT_C,15); #define go_straight OnFwd(OUT_B,23);OnFwd(OUT_C,20); #define go_straight2 OnFwd(OUT_B,20);OnFwd(OUT_C,17); #define turn OnRev(OUT_C,20);OnFwd(OUT_B,28);Wait(3200);Off(OUT_BC); #define turn2 OnRev(OUT_B,28);OnFwd(OUT_C,20);Wait(1500);Off(OUT_BC); #define sakittyo OnFwd(OUT_C,20);OnFwd(OUT_B,23);Wait(1150);Off(OUT_BC); #define turn3 OnRev(OUT_B,30);Wait(4800);Off(OUT_BC); #define turn4 OnRev(OUT_B,30);Wait(5200);Off(OUT_BC); #define back OnRev(OUT_C,20);OnRev(OUT_B,28);Wait(3000);Off(OUT_BC); #define osidasi OnFwd(OUT_BC,100);Wait(100);Off(OUT_BC); #define arm_down OnFwd(OUT_A,25);Wait(1500);Off(OUT_A); #define arm_up OnRev(OUT_A,35);Wait(1500);Off(OUT_A); #define black 30 #define white 60 #define lightgray 50 #define darkgray 39 #define center 45 sub followline_L(int stop_time) { long t0=CurrentTick(); while(CurrentTick()-t0<stop_time){ if(SENSOR_1<black){ rotate_left; }else if(SENSOR_1<darkgray){ turn_left; }else if(SENSOR_1>lightgray){ turn_right; t0=CurrentTick(); }else if(SENSOR_1<center){ go_straight; t0=CurrentTick(); }else{ rotate_right; t0=CurrentTick(); } } Off(OUT_BC); Wait(1000); } sub followline_R(int stop_time) { long t0=CurrentTick(); while(CurrentTick()-t0<stop_time){ if(SENSOR_1<black){ rotate_right; }else if(SENSOR_1<darkgray){ turn_right; }else if(SENSOR_1>lightgray){ turn_left; t0=CurrentTick(); }else if(SENSOR_1<center){ go_straight; t0=CurrentTick(); }else{ rotate_left; t0=CurrentTick(); } } Off(OUT_BC); Wait(1000); } sub followline_R2(int stop_time) { long t0=CurrentTick(); while(CurrentTick()-t0<stop_time){ if(SENSOR_1<black){ rotate_right; t0=CurrentTick(); }else if(SENSOR_1<darkgray){ turn_right; t0=CurrentTick(); }else if(SENSOR_1>lightgray){ turn_left; }else if(SENSOR_1<center){ go_straight2; t0=CurrentTick(); }else{ rotate_left; } } Off(OUT_BC); Wait(2000); } sub Blackto_White() { while(SENSOR_1<lightgray){ OnFwd(OUT_C,25); OnFwd(OUT_B,25); } Off(OUT_BC); } sub Whiteto_Black() { while(SENSOR_1>darkgray){ OnFwd(OUT_C,25); OnFwd(OUT_B,25); } Off(OUT_BC); } sub Whiteto_Black_R() { while(SENSOR_1>darkgray){ OnFwd(OUT_C,25); OnRev(OUT_B,25); } Off(OUT_BC); } sub Blackto_White_R() { while(SENSOR_1<darkgray){ OnFwd(OUT_C,25); OnRev(OUT_B,25); } Off(OUT_BC); } sub Blackto_White_L() { while(SENSOR_1<lightgray){ OnFwd(OUT_B,25); OnRev(OUT_C,25); } Off(OUT_BC); } sub Whiteto_Black_L() { while(SENSOR_1>black){ OnFwd(OUT_B,25); OnRev(OUT_C,25); } Off(OUT_BC); } task main() { SetSensorLight(S1); RemoteStartProgram(CONN,"kodomo.nxc"); followline_R(200); Blackto_White(); followline_L(150); Blackto_White_R(); followline_R2(150); SendRemoteNumber(CONN,MAILBOX1,SIGNALON1); Wait(1000); arm_up; turn; SendRemoteNumber(CONN,MAILBOX1,SIGNALON2); Wait(1000); followline_R(150); Blackto_White_L(); followline_L(100); Blackto_White(); Whiteto_Black(); Blackto_White(); Whiteto_Black(); Blackto_White(); Whiteto_Black(); Blackto_White(); followline_R(150); Blackto_White(); turn2; sakittyo; arm_down; SendRemoteNumber(CONN,MAILBOX1,SIGNALON1); Wait(1000); arm_up; turn3; Whiteto_Black(); Blackto_White(); Whiteto_Black(); Blackto_White(); followline_R(200); Blackto_White(); turn2; SendRemoteNumber(CONN,MAILBOX1,SIGNALON2); Wait(1000); turn3; Whiteto_Black(); Blackto_White(); Whiteto_Black(); Blackto_White(); followline_R(200); Blackto_White(); turn2; sakittyo; arm_down; SendRemoteNumber(CONN,MAILBOX1,SIGNALON1); Wait(1000); arm_up; turn3; Whiteto_Black(); Blackto_White(); Whiteto_Black(); Blackto_White(); Blackto_White_R(); followline_R(200); Blackto_White(); turn2; SendRemoteNumber(CONN,MAILBOX1,SIGNALON2); Wait(1500); turn4; arm_down Whiteto_Black(); Blackto_White(); Whiteto_Black(); Blackto_White(); followline_L(200); Blackto_White(); followline_R(200); Blackto_White(); followline_L(200); Blackto_White(); followline_R(200); Blackto_White(); followline_L(150); Blackto_White_R(); followline_R2(125); SendRemoteNumber(CONN,MAILBOX1,SIGNALON1); Wait(1000); arm_up; turn; followline_R(100); Blackto_White_L(); followline_L(100); Blackto_White(); Whiteto_Black(); Blackto_White(); Whiteto_Black(); Blackto_White(); Whiteto_Black(); Blackto_White(); followline_R(200); Blackto_White(); turn2; sakittyo; SendRemoteNumber(CONN,MAILBOX1,SIGNALON2); Wait(1000);