*課題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]


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS