2015a/Member

課題の説明

コース

course1.png

黒線の幅は20mmでなるべく均等な濃さにすること。ゴールは1x16のビーム1本、1x8のビーム2本、およびそれらを接続するためのプレートを使用し、コの字に組み合わせて作る。

ロボット本体の説明

全体図

honntai4.png

アームはピンポン玉をしっかりと掴めるように二重にしてそれをモーターの回転を利用して開閉できる。 シュートは、一度アームを開いてからロボット本体がぶつかることでシュートする仕組みとなっている。 またアーム全体を上と下で固定してある。

アーム

arm4.png

写真の赤線で囲まれた部分がかなめであり、モーターが回転することで、ギアが二つ続けてつけてあるギアの上のギアが回転するために、シャフト自体が回転することで、下のギアも同時に回転するので、そのギアとかみ合っているもう片方のシャフトも回転するので、下についているビームに挟まれたアーム部分を開閉することが出来る。

タイヤ部分

基本の物をベースに真ん中のビームでできている部分をなくし、出来るだけ小さくまとまるように組み上げたことでタイヤとセンサーの距離を出来るだけ近づけるようにしたうえでロボットの前方にL字ブロックを組み込めるようにした。

光センサー

光センサーはなるべくタイヤに近い位置に固定した。 センサー1を使っている。

sensor1.png

部品

モーター ビームにさかさまに付いている。

光センサー L字ブロックと組み合わせて入れている。

ビーム   本体上部と走行する下部をつなぐようにL字の形になるように組み上げている。

本体

基本の物の中央部分を外してよりコンパクトに、使いやすいように作り変えた。 アームとの兼ね合いから、大きい方のタイヤを前にした。

問題点

アームはモーターの開展により取れやすく、また光センサーとアームを含む前部分のパーツが本体からとれやすくなってしまった。

プログラムの説明

ではこれからプログラムの説明に入る。

コース説明

course3.png

上の図からも分かる通り、今回、ロボットを走らせるコースは、地点Aから地点Bまでのみちのりである。このコースはP三叉路を過ぎたところにボールがあり、すぐに急カーブがある。Q交差点を渡ったあとも直角カーブがあり曲がりにくい点がポイントである。

プログラムの解説

定義

まずプログラムで定義した物を挙げていく。

 #define THRESHOLD 47   /*しきい値の設定*/
 #define LOWPOWER 3     /*パワーの値*/
 #define set_power_l SetPower(OUT_AC,LOWPOWER); /*パワーの設定*/
 #define straight set_power_l; OnFwd(OUT_AC); /*前進*/  
 #define back set_power_l; OnRev(OUT_AC); Wait(60); /*後退*/
 #define LEFT set_power_l; OnFwd(OUT_C); Off(OUT_A); /*左に曲がる*/
 #define RIGHT set_power_l; OnFwd(OUT_A); Off(OUT_C); /*右に曲がる*/ 
 #define LEFT_L set_power_l; OnFwd(OUT_C); OnRev(OUT_A); /*左に旋回*/
 #define RIGHT_L set_power_l; OnFwd(OUT_A); OnRev(OUT_C);/*右に旋回*/
 #define STOP1 Off(OUT_AC); Wait(200); /*2秒間停止*/
 #define STOP2 Off(OUT_AC); Wait(20); /*0.2秒間停止*/
 #define STEP 1 /*判断に要する時間*/
 #define arm_on OnRev(OUT_B); Wait(11); Off(OUT_B); /*アームを開く*/
 #define arm_close OnFwd(OUT_B); Wait(8); Off(OUT_B); /*アームを閉じる*/
 #define music PlayTone(523,25);  /*ドの音を出す*/
 #define MOVE_TIME 30 /*この間に動く*/
 #define judge_time 33 /*交差点または三叉路であるか判断する際の値*/

サブルーチン

通常のライントレース

 sub line1(){  
         if(SENSOR_1 <= THRESHOLD-10) {
                 LEFT;                    /*光センサーが37以下の数値を検知した時は左に曲がる*/
         }else{
                 if (SENSOR_1 <= THRESHOLD-12) {
                         straight;
                 }else{ 
                         RIGHT;  
                 } ClearTimer(0); 
         } /*光センサーが35以下の値を示した時は直進、37より上の値を示した時は、右に曲がり、そのどちらの場合でも、タイマーはリセットする。
 }

急カーブに使用するライントレース

 sub line2(){
         if(SENSOR_1 <= THRESHOLD-10) {
                 LEFT_L;                  /*光センサーが37以下の数値を検知した時は左旋回をする。*/
         }else{
                 if (SENSOR_1 <=THRESHOLD-12) {
                         straight;}       /*光センサーが35以下の数値を検知した時は直進する。*/
                 }else if (SENSOR_1<= THRESHOLD-3){
                         RIGHT_L;}        /*光センサーが44以下の数値を検知した時は右旋回する。*/
                 }else{
                         RIGHT; }      /*上記以外の状況の場合、右に曲がる。*/
         } 
 }

三叉路、交差点を通過する時

 sub cross()
 { 
     STOP1;     /* 二秒間停止する*/
     RIGHT_L; Wait(30); /*ロボットの向きを調整するために右に旋回する。*/
     music;   /*交差点、三叉路についたことを示すために鳴らす。*/
     straight; Wait(MOVE_TIME); /* 交差点、三叉路を横断する。*/
 }

今回の課題では、交差点や三叉路を判断し二秒間停止する必要があった。そこでタイマーを使用した交差点の識別方法を使うことにした。

サブルーチンのline1は、タイマー0が設定してある時、光センサーが黒い線を検知している間だけ、タイマー0を進ませて、それ以外の状況の時は常にタイマー0をリセットし続けるライントレースである。交差点や三叉路では、黒い線が続けて判断されることを利用し、黒い線が続いていることでタイマー0をwhileを用いてある値(今回ではjudge_timeと定義つけた値)まで動くようにすることで、それ以外の場所では、ライントレースをし続け、交差点や三叉路では次の動作に移ることができる。

しかし、急カーブに差し掛かると交差点の判断をしてしまう他、曲がり切れないので、急カーブを曲がるために、line2のサブルーチンを作った。

line2は曲がる際は旋回を使うことで急カーブを曲がり切り、設定したタイマーを使うことで、急カーブを曲がる時間を指定することで、急カーブを曲がるまで動き続けるようになっている。

また、三叉路や交差点を通過するときに、どうしてもまっすぐに行かないため、仕方なく旋回を使い位置を調整している。

ボールは急カーブの位置に置くことでline1を使用して判断する。

メインタスク

 銑

 task main()
 {
   SetSensor(SENSOR_1, SENSOR_LIGHT);
   ClearTimer(0);
   while( FastTimer(0) <= judge_time) {
           line1(); Wait(STEP);   /*交差点に差し掛かるまで通常のライントレースをする。*/
   }cross();                      
   ClearTimer(0);  

◆銑

   while( FastTimer(0) <= judge_time) {
          line1(); Wait(STEP);   
   }STOP2; arm_close;              /*ボールのあるところで、判断して止まりボールを掴む*/

   while( FastTimer(0) <= judge_time) {
           line1();  Wait(STEP);   /*急カーブに差し掛かるまで、通常のライントレースを行う。*/
   }ClearTimer(0); /*タイマー0をリセットする。*/

ぁ銑

   while( Timer(0) <= 200) {
           line2(); Wait(STEP); /*タイマーで200の値まで急カーブ用のライントレースで急カーブを走り切る。*/
   }ClearTimer(0); /*タイマー0をリセットする*/
   while( FastTimer(0) <= judge_time){
           line1(); 
   }cross();       /*交差点の位置まで通常のライントレースを行い、交差点に差し掛かったら渡る。*/
   ClearTimer(1); ClearTimer(0); /*タイマー0とタイマー1をリセットする。*/

ァ銑

   while( Timer(1) <= 180){
          line2(); Wait(STEP); /*直角カーブの部分を渡るためにタイマー1の180の値になるまでに急カーブ用のライントレースを行う。*/
   }

Α銑

   while(FastTimer(0) <= judge_time){
           line1(); Wait(STEP);        /*シュートするB地点の前で止まるために、通常のライントレースを行う。*/
   }STOP2;     /*B地点に来たら停止する。*/
   arm_on; music;back; straight; Wait(80); STOP2;/*シュートの動作*/
 }

全体の反省点

一 Α銑Г隆屬如誤作動で先に動いてしまうためにTimer(0)だけでなく、Timer(1)を使わざるを得なかった点。

二 また急カーブを曲がり切れずに何回か、やり直さなければならなかった点。

三 旋回ではどうしても時間指定でなければなれず、時間を測らなければならなかった点。

感想

今回の課題も初めはできるか不安であったが、何とかやり終えることが出来た。一度プログラムを全部書き直すしたこともあり、完成してよかった。


添付ファイル: filearm4.png 106件 [詳細] filecourse3.png 137件 [詳細] filesensor1.png 120件 [詳細] filearm5.png 57件 [詳細] filehonntai4.png 128件 [詳細] filecourse1.png 121件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-08-12 (水) 20:26:36