*コース、ルール [#defe44c4] http://yakushi.shinshu-u.ac.jp/robotics/?plugin=ref&page=2017b%2FMission3&src=2017b-mission3.png **基本ルール [#k8bdae2a] ◦競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。 ◦図のA地点または(および)D地点からスタートする。ただし接地している部分はそれぞれの領域内 に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。 ◦ピンポン玉をX地点に運び、割り箸で正方形に囲まれた領域に入れる。 ◦紙コップをY地点がある黒線に囲まれた領域に運ぶ。 ◦開始の合図から5秒以内にスタートボタンを押す作業を完了すること。 ◦競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。 ◦途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。 **フィールドの説明 [#ba047647] ◦フィールドは課題2で使用した紙を使用する。 ◦図のマジェンタの円に逆さまにした紙コップを置き、その中にピンポン玉を2つずつ入れておく。 ◦図の黄色い円に紙コップを通常の向きに置き、障害物とする。直径6cmの円の外周をペンまたは鉛筆でマークしておく。 ◦紙コップには色をつけたり文字や記号を書いてもよい。 ◦割り箸を使って一辺が14cmの正方形を作り、X地点を中心とした円に接するように置く。 *ロボット制作過程 [#l4705ab3] 最初はR34の班がやっていたような上下のアームを作っていたが完成はしなかった。R34の仕組みはほ んとにすごいと思った。 次に考えたのが斜めに上げてくるものである。しかしこれも失敗に終わった。アーム部分が重く、2つのモータを使っても上げることができなかった。 そして最後に考えられ本番に使用されたのが、これである。 **ロボット説明 [#xaf9185a] &ref(2017b/Member/DAI/Mission3/a-m.JPG,25%); &ref(2017b/Member/DAI/Mission3/a-m2.JPG,25%); &ref(2017b/Member/DAI/Mission3/a-m3.JPG,20%); &ref(2017b/Member/DAI/Mission3/a-m4.JPG,25%); アームは軽量化することで上げ下げをすることができた。アームの構造としてはギアを多めに使うことでモータの負荷を少なくしようと考えた。 アームで紙コップを持ちやすくするためにゴム製のタイヤを取り付け滑り止めにした。 また電源は2つ使った。2つのロボットを作ろうというアイデアは出てはこなかった。 モータはなるべく近くのところに設置した。繋げやすいからだ。 *定義(t=秒数) [#lf1daa43] アーム用のルーチンがこの通りである。 #define up(t) OnRev(OUT_A);Wait(t);Off(OUT_AC);//アーム上げる #define down(t) OnFwd(OUT_A);Wait(t);Off(OUT_AC);//アーム下げる #define st(t) Off(OUT_AC);Wait(t);//待機 ロボット本体用がこの通りである。 #define rightSENKAI OnFwd(OUT_C);OnRev(OUT_A);//右旋回 #define rightMAGARU OnFwd(OUT_C);Off(OUT_A);//右曲がる #define carb 46//46でセット #define ch OnFwd(OUT_B);Wait(30);Off(OUT_B);//0.3秒前へ #define re OnRev(OUT_B);Wait(20);Off(OUT_B);//0,2秒後ろへ #define go(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC);//t秒間進む #define back(t) OnRev(OUT_AC);Wait(t);Off(OUT_AC);//t秒間後ろへ #define cross_stop Off(OUT_AC);Wait(100);//交差点判断 *プログラム [#tf85f828] task main () { Wait(870); up(30); st(200); down(30); } sub r() { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while(FastTimer(0)<=24) { if(SENSOR_2>carb+5) { leftSENKAI ClearTimer(0); } else if(SENSOR_2>carb+3) { leftMAGARU ClearTimer(0); } else if(SENSOR_2>carb) { OnFwd(OUT_AC); ClearTimer(0); } else if(SENSOR_2>carb-3) { rightMAGARU ClearTimer(0); } else { rightSENKAI } } Off(OUT_AC); } task main () { go(30); r(); leftSENKAI; Wait(5); re; go(160); cross_stop; ch; rightSENKAI; Wait(140); cross_stop; ch; go(90); cross_stop; re; back(100); leftSENKAI; Wait(30); go(200); rightSENKAI; Wait(40); re; go(250); }