*課題 [#ja0fc808]
#ref(2015a-mission2.png)
黒い線に沿って移動するロボットを製作した。
私はCからAに向かうコースを選んだ。
C地点からA地点へ (Q交差点では直進、P三叉路では右折)
*ロボットの説明 [#u0efaa8d]
#ref(ピン球とロボ.JPG)
#ref(robo.jpg)
**概要 [#oa1e4b68]
ロボットは、機体前部に光センサーとコの字型のピン球誘導アームを取り付けた。光センサーはできるだけ機体中央に位置するほうが位置ずれを抑えて小回りが効くが、左右の旋回でのライン前進を求めたために中央から遠い位置に設置した。
ロボットは、機体前部に光センサーとピン球保持アームを取り付けた。光センサーはできるだけ機体中央に位置するほうが位置ずれを抑えて小回りが効くが、左右の旋回でのライン前進を求めたために中央から遠い位置に設置した。
**アーム [#m6f348f7]
アームはただのコの字型のため、ピン球をしっかりと運ぶことは難しかった。しかしピン球の認識がタッチセンサーで出来ないことや、そのためにピン球を固定する機構の実行タイミングが合わないことから、モータ駆動のアームによるピン球運搬の採用を見送った。
#ref(arm.jpg)
アームはモーター駆動で開閉するようになっている・しかし走行中の揺れやピン球の慣性でアームに当たるので次第にアームが開いていく欠陥がある。
*プログラム [#b892865b]
ライントレースのプログラムは前半と後半の2パターンに分かれる。これはコース前半の交差点までの部分が他のラインが近くて入り組んでいること、後半は比較的広いことを考えてのことである。なお、このブログラムではあ交差点を認識をさせていない。前述のとおり、後半のコースが広いので、ロボットの旋回による位置ずれを利用し、交差点Qから間違ってB方面に向かったあたりから脱線させて順路に戻させるようになっている。
***定義 [#e9f16468]
 #define THRESHOLD 45
 #define THRESHOLD 44
 #define HIPOWER 5  // 直線用のパワー
 #define LOWPOWER 3   // カーブのパワー
 #define A_LOWPOWER 2 //アーム開閉のパワー
 #define A_set_power SetPower(OUT_B,A_LOWPOWER);
 #define set_power_H SetPower(OUT_AC,HIPOWER);
 #define set_power_L SetPower(OUT_AC,LOWPOWER);
 #define go_forward set_power_H; OnFwd(OUT_AC);
 #define go_forward set_power_H; OnFwd(OUT_A);OnRev(OUT_C);
 #define turn_left1 set_power_L;\
 OnFwd(OUT_C); OnRev(OUT_A);
    OnRev(OUT_C); OnRev(OUT_A);//左折両輪
 #define turn_left0 set_power_L;\
 OnFwd(OUT_C); Off(OUT_A);
    OnRev(OUT_C); Off(OUT_A);//左折片輪
 #define turn_right0 set_power_L;\
 OnFwd(OUT_A); Off(OUT_C);
    OnFwd(OUT_A); Off(OUT_C);//右折片輪
 #define turn_right1 set_power_L;\
 OnFwd(OUT_A); OnRev(OUT_C);
 #define STEP 1
 #define RUN_TIME 90
    OnFwd(OUT_A); OnFwd(OUT_C);//右折両輪
 #define arm_hold A_set_power;\
    OnFwd(OUT_B);//アーム閉じ
 #define arm_open A_set_power;\
    OnRev(OUT_B);Wait(50);Off(OUT_B);//アーム解放
 #define cross1 75
 #define cross2 30
 #define shoot_time 75 

***前半 [#ee7d3229]
 task main()
 {
  SetSensor(SENSOR_2,SENSOR_LIGHT);
  
  ClearTimer(0);                    // Timer(0) をリセット
  while (true) {
***ライントレースのサブルーチン [#ee7d3229]
 sub line_trace() {
    if (SENSOR_2 < THRESHOLD -8) {
	  turn_right1;  // 右旋回
    } else if (SENSOR_2 < THRESHOLD +3) {
      go_forward;   // 直進
    } else if (SENSOR_2 < THRESHOLD +8) {
      turn_left1;   // 左旋回
    }
	Wait(STEP);
  }
#ref(開始地点.JPG)
前半は小回りが効くように設定した。他のラインと干渉しないようにするためである。ライントレースはラインの右側を感知するようにしてある。

***後半 [#ndfe8402]
 while (true) {
	if ( Timer(0) => RUN_TIME ) {
    go_forward;Wait(120);Off(OUT_AC); 
	if (SENSOR_2 < THRESHOLD -8) {
	  turn_right0;  // 大右旋回
    } else if (SENSOR_2 < THRESHOLD +3) {
      go_forward;   // 直進
    } else if (SENSOR_2 < THRESHOLD +8) {
      turn_left0;   // 大左旋回
    }} 
	    turn_right1;  // 右旋回
        } 
	else{if (SENSOR_2 < THRESHOLD +3) {
        go_forward;   // 直進
        } 
    else{
	    turn_left1;   // 左旋回
        }
	ClearTimer(0);
	}
	Wait(1);
 }
#ref(大回り.JPG)
後半はB地点方面へのラインに乗る大まかな時間を測定し、タイマーでプログラムを変更、大回りで脱線させてP〜Qに戻させる。そしてそのままA地点に向かい、ピン球を運ぶ算段である。
ライントレースはラインの右側を沿っていくようになっている。直進無い方が脱線なく走れるが、あまりにも遅いので付け足した。

***メイン [#ndfe8402]
task main() {
    SetSensor(SENSOR_2,SENSOR_LIGHT);
    ClearTimer(0);
    while(FastTimer(0) < 30) {
	    line_trace();
        }
	PlayTone(440,10);//一回目の交差点判定
	Off(OUT_AC);Wait(50);
	turn_left1;Wait(cross2);//向きの修正
	go_forward;Wait(cross1);
	arm_hold;//ピン球の保持
	ClearTimer(0);
    
    while(FastTimer(0) < 30){
	    line_trace();
        }
    PlayTone(440,10);//二回目の交差点判定
	Off(OUT_AC);Wait(50);
	turn_right1;Wait(cross2);//右折
	ClearTimer(0);
    while(FastTimer(0) < 30){
        line_trace();
        }
    PlayTone(440,10);//ゴール判定
    Off(OUT_AC);Wait(50);
    arm_open;
    go_forward;Wait(shoot_time);//ボールをゴールにシュート
}
FastTimerで交差点を感知、それまでサブルーチンのライントレースを行う。最後にA地点の枠に交差点判定することでシュートに入る。アームが次第に開いていく欠陥については常時弱いパワーでアームを閉じることで対策した。
*反省点 [#e433b9d5]
交差点の認識が間に合わなかったことや、ピン球のシュート機構が制作できなかった。ピン球のゴールも数度しか成功していない。精度を高めることが重要である。
PQ間のピン球の保持が難しい。これはピン球が同じ場所になかったり、ロボの振動で動くからだ。他にも、交差点の判定がうまくいかないことがあった。おそらく初期位置がずれていた為と思われる。
*感想 [#r20787bd]
定義付け、行動の略記ができたことや、基本的にライントレースが成功しているので微調整という作業ができたのがよかった。



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