*課題3 [#q2036ad9] #ref(./robo_3.png,50%,コース説明) 上のコースの上に置かれたピンポン玉を掴んでコースの左側のトレーの中に入れるロボットを作る. **ルール [#aa2f06a5] 競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。 図のA地点または(および)A'地点からスタートする。ただし接地している部分はそれぞれの領域内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。 開始の合図から5秒以内にスタートボタンを押す作業を完了すること。 競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。 途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。 競技終了後、ロボットが、ゴールのプラ容器に触れていてはいけない。 競技終了後、もともと玉が入っていたプラ容器が、ゴールのプラ容器に触れていてはいけない。 **得点の計算方法 [#icebcaeb] プラ容器内の玉を1個運べば8点。二つとも運べば20点。 L地点とL'地点の玉をどちらか1個運べば4点、2個とも運べば12点。 競技終了後、ゴールのプラ容器が完全に円から出しまった場合、もとの基本点の1/4を減点。 競技終了後、ゴールのプラ容器の半分以上が円から出ていれば、もとの基本点の3/4を減点。 競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれば、もとの基本点の1/2を減点。 競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれば、もとの基本点の1/2を減点。 競技終了後、ゴールのプラ容器にロボットが触れていれば、もとの基本点の1/4を減点。 *ロボットについて [#f55ed492] 今回は2つのNQCを使えるため,1体型にして,トレーごと掴む部分と車体を動かす部分に仕事を分けている. このロボットはトレーの中の玉を運ぶだけのロボットのため,ここからはそれを考慮に入れて見てほしい. #ref(./image1.jpeg,50%,ロボット全体) 上はロボットの全体の写真.前のアームでトレーを掴んで運び,ゴールにバックして近づいて,トレーからボールが出るまで持ち上げて後ろのレールに転がしてゴールに入れる.アームは,最初は邪魔にならないように上げておき,トレーに近づいたら下す. #ref(./image2 (1).jpeg,50%,ロボット下) ロボットの前の部分に2つの光センサーを付けている. #ref(./image2.jpeg,50%,レール) ボールがうまくレールに乗るように,漏斗のような形にしている.また,途中でレールから外れないように壁を作っている. #ref(./image1 (1).jpeg,50%,レール後方) 2つのNQCを向かい合わせに配置して,通信ができるようにしている. *プログラムについて [#y481e704] **車体を動かすプログラム [#t018fbfe] 車体部分で使うマクロである. #define Line 43 //ライントレースの黒の値 #define UP 13 //アームを上げさせるときに送信する信号 #define DOWN 12 //アームを下げさせるときに送信する信号 #define STOP 11 //アームの動きを止めるための信号 ライントレースのサブルーチン sub follow_line() { SetSensor(SENSOR_2,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); int t; t=FastTimer(0); while(FastTimer(0)<250) //2.5秒間この動きを繰り返す { if(SENSOR_2>43 && SENSOR_3>43){OnFwd(OUT_BC); //センサーが両方白の間前進 }else if(SENSOR_2<Line && SENSOR_3>Line){OnFwd(OUT_C);Off(OUT_B); //右センサーが黒,左が白の間左折 }else if(SENSOR_2>Line && SENSOR_3<Line){OnFwd(OUT_B);Off(OUT_C); //右が白,左が黒の間右折 }else {Off(OUT_BC);} //そうでないとき停止 } PlaySound(SOUND_UP); //ループを抜けたら音で合図 Off(OUT_BC); } sub turn_left() //左折のサブルーチン { OnFwd(OUT_B); Off(OUT_C); Wait(50); Off(OUT_B); } task main() { ClearTimer(0); //タイマーをリセット follow_line(); //C地点まで移動 Wait(20); OnFwd(OUT_BC); //トレーを掴めるように位置を調整 Wait(95); Off(OUT_BC); OnFwd(OUT_C); //車体をトレーに向かせる OnRev(OUT_B); Wait(100); Off(OUT_BC); OnRev(OUT_BC); //後退して,アームを下げたときにトレーに当たらないようにする Wait(230); Off(OUT_BC); Wait(40); SendMessage(DOWN); //アームを下げるための信号を送信 Wait(1); SendMessage(STOP); //アームの動きを終了させる信号を送信 OnFwd(OUT_BC); //アームの間にトレーを入れる Wait(300); Off(OUT_BC); OnFwd(OUT_B); //ロボットを左側のコースのほうに向かせる OnRev(OUT_C); Wait(220); Off(OUT_BC); Wait(20); OnFwd(OUT_BC); //左側のコースに移動 Wait(400); Off(OUT_BC); OnFwd(OUT_C); //ゴールに背を向ける OnRev(OUT_B); Wait(120); Off(OUT_BC); OnRev(OUT_BC); //ゴールに近づきながらアームを持ち上げ,ボールをレールの上に転がす SendMessage(UP); Wait(200); SendMessage(STOP); //アームの上昇を止める Off(OUT_BC); } **アームを動かす部分のプログラム [#c1986e27] アーム部分のマクロ #define arm_up SetPower(OUT_AC,6);OnFwd(OUT_AC); Wait(30); Off(OUT_AC); //アームを上げる #define arm_down SetPower(OUT_AC,1);OnRev(OUT_AC); Wait(50); Off(OUT_AC); //アームを下げる #define UP 13 //アームを上げる時の信号 #define DOWN 12 //アームを下げる時の信号 #define STOP 11 //アームの動きを終了するときの信号 メインのプログラム task main() { ClearMessage(); //信号を一度リセットする while(true) { if(Message() == STOP) { //STOPという信号を受信したときアームの動きを終了 Off(OUT_AC); } else if (Message() == DOWN) { arm_down; //DOWNという信号を受信したときアームを下ろす } else if(Message() == UP) { arm_up; //UPという信号を受信したときアームを上げる } } } *まとめ [#j85e3277]