初めに

今回の課題は空き缶を探したあとにそれに向かってシュートするというもの。

マシンの説明

 新たに付け足した部分は、アームの上の超音波センサー。 sensor1.jpg.jpg sensor2.jpg 少し不格好ではあるが、正面を向いているのでプログラムを組みやすかった。今回も課題2に記したようにコンピュータは固定せず、車体にのせているだけではあるが、特に問題はなかった。

プログラムの説明

サンプルプログラムを参考にして、機体の角度を使って空き缶の位置を割り出した。

#define SPEED 50
#define SPEED_SLOW 30
 

タイヤや円周率のデータを入力する。

const float diameter = 5.45;
const float track = 10.35;
const float pi = 3.1415;

void fwdDist(float d)
{

角度を計算し、angle度まで回転させる。

    long angle;
    angle = d/(diameter*pi)*360.0;
    RotateMotorEx(OUT_BC, SPEED_SLOW, angle, 0, true, true);
}

ang度時計回りに旋回

void turnAng(long ang)
{
    long angle;
    angle = track/diameter * ang;
    RotateMotorEx(OUT_BC, SPEED_SLOW, angle, 100, true, true);
}

ang度の範囲探す。

int searchDirection(long ang)

{

旋回角度からタイヤの回転を計算し、そこまで反時計回りで戻る。

    long angle,tacho_min=0, tacho_corr ;
    int d_min;

    d_min=300;

    angle = (track/diameter)*ang;
    turnAng(ang/2);
    ResetTachoCount(OUT_BC);

    OnFwdSync(OUT_BC,SPEED_SLOW,-100);
    while(MotorTachoCount(OUT_B)<=angle){
        if(SensorUS(S1)<d_min){
          d_min=SensorUS(S1);
          tacho_min=MotorTachoCount(OUT_B);
         } 
     }
    OnFwdSyncEx(OUT_BC,SPEED_SLOW,100,RESET_NONE);

缶の所まで旋回。

    until(MotorTachoCount(OUT_B)<=tacho_min||SensorUS(S1)<=d_min);

    Wait(14);
    Off(OUT_BC);Wait(500);
    return d_min;
}

缶へシュートする。

task main()
{
    SetSensorLowspeed(S1);



    int d = searchDirection(120);
    if (d > 10) {
        fwdDist(d-25.0);
        OnRev(OUT_A,30);
        Wait(400);
        Off(OUT_A);
        OnFwd(OUT_BC,50);
        Wait(400);
     }
}

反省・感想

角度を扱う方式でプログラムを作った。なかなか複雑で難しかったがいい経験になった。 これをうまく使えば一気にプログラムの自由度が増すなと思った。


添付ファイル: filesensor2.jpg 235件 [詳細] filesensor1.jpg.jpg 252件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-08-16 (日) 00:00:30