2005/B7

☆左チーム☆(かずま&サイモン&まさき)

目次

プログラム

「正」を書くプログラム

「左」を書くプログラム

// 「左」を書くプログラム
//
//    作成者:かずま
//    作成日:2005-11-7

#define TURN_TIME 101      // 直角に曲がるのにかかる時間
#define MOVE_TIME 121      // 1秒間に進む距離
#define PEN_TIME 20        // ペンを上下させる時間

sub turn_left()            // 左方向に90度回転
{
    OnRev(OUT_A); OnFwd(OUT_C);
    Wait(TURN_TIME);
    Off(OUT_A+OUT_C);
}

sub turn_right()           // 右方向に90度回転
{
    OnFwd(OUT_A); OnRev(OUT_C);
    Wait(TURN_TIME);
    Off(OUT_A+OUT_C);
}

sub pen_down()             // ペンを下ろす
{
    OnFwd(OUT_B);
    Wait(PEN_TIME);
    Off(OUT_B);
}

sub pen_up()               // ペンを上げる
{
    OnRev(OUT_B);
    Wait(PEN_TIME);
    Off(OUT_B);
}

task main()
{
    SetPower(OUT_A,7);     // パワーを設定
    SetPower(OUT_C,7);

    pen_down();            // ペンを下ろす

    OnFwd(OUT_A+OUT_C);    // 【一画目】行動1(17.1cm直進)
    Wait(17100/MOVE_TIME);
    Off(OUT_A+OUT_C);

    pen_up();              // ペンを上げる

    Wait(100);

    turn_left();           // 行動2(左回転)

    Wait(100);

    OnFwd(OUT_A+OUT_C);    // 行動3(5.2cm直進)
    Wait(5200/MOVE_TIME);
    Off(OUT_A+OUT_C);

    Wait(100);

    turn_left();           // 行動4(左回転)

    Wait(100);

    OnFwd(OUT_A+OUT_C);    // 行動5(8.8cm直進)
    Wait(8800/MOVE_TIME);
    Off(OUT_A+OUT_C);

    Wait(100);

    OnRev(OUT_A);          // 行動6(左にある程度回転)
    OnFwd(OUT_C);
    Wait(87);
    Off(OUT_A+OUT_C);

    pen_down();            // ペンを下ろす

    Wait(100);

    SetPower(OUT_A,7);     // パワーを変更
    SetPower(OUT_C,0);

    OnFwd(OUT_A+OUT_C);    // 【二画目】行動7(左方向に曲がりながら前進)
    Wait(180);
    Off(OUT_A+OUT_C);

    SetPower(OUT_A,7);     // パワーを変更
    SetPower(OUT_C,7);

    pen_up();              // ペンを上げる

    Wait(100);

    OnFwd(OUT_A);          // 行動8(右にある程度回転)
    OnRev(OUT_C);
    Wait(165);
    Off(OUT_A+OUT_C);

    Wait(100);

    OnFwd(OUT_A+OUT_C);    // 行動9(5.8cm直進)
    Wait(5800/MOVE_TIME);
    Off(OUT_A+OUT_C);

    Wait(100);

    turn_right();          // 行動10(右回転)

    Wait(100);

    OnFwd(OUT_A+OUT_C);    // 行動11(2.3cm直進)
    Wait(2300/MOVE_TIME);
    Off(OUT_A+OUT_C);

    pen_down();            // ペンを下ろす

    Wait(100);

    OnFwd(OUT_A+OUT_C);    // 【三画目】行動12(12.2cm直進)
    Wait(12200/MOVE_TIME);
    Off(OUT_A+OUT_C);

    pen_up();              // ペンを上げる

    Wait(100);

    OnRev(OUT_A+OUT_C);    // 行動13(5.5cm後退)
    Wait(5500/MOVE_TIME);
    Off(OUT_A+OUT_C);

    Wait(100);

    turn_right();          // 行動14(右回転)

    Wait(200);

    OnRev(OUT_A+OUT_C);    // 誤差修正1(1.4cm後退)
    Wait(1400/MOVE_TIME);
    Off(OUT_A+OUT_C);

    pen_down();            // ペンを下ろす

    Wait(200);

    OnFwd(OUT_A+OUT_C);    // 【四画目】行動15(7.7cm直進)
    Wait(7700/MOVE_TIME);
    Off(OUT_A+OUT_C);

    pen_up();              // ペンを上げる

    Wait(100);

    OnFwd(OUT_A+OUT_C);    // 誤差修正2(1.1cm直進)
    Wait(1100/MOVE_TIME);
    Off(OUT_A+OUT_C);

    Wait(100);

    turn_left();           // 行動16(左回転)

    Wait(100);

    OnRev(OUT_A+OUT_C);    // 行動17(10.3cm後退)
    Wait(10300/MOVE_TIME);
    Off(OUT_A+OUT_C);

    pen_down();            // ペンを下ろす

    Wait(100);

    OnFwd(OUT_A+OUT_C);    // 行動18(16.7cm直進)
    Wait(16700/MOVE_TIME);
    Off(OUT_A+OUT_C);

    pen_up();              // ペンを上げる

}

いちいちWaitが入ってるのは、ロボットの動きに余裕を持たせるためです。

「左」を書くプログラム(改良版)

// 「左」を書くプログラム
//
//    作成者:かずま
//    作成日:2006-2-12

#define TURN_TIME 101      // 直角に曲がるのにかかる時間
#define MOVE_TIME 121      // 1秒間に進む距離
#define PEN_TIME 20        // ペンを上下させる時間
#define ACT6_TIME 87       // 行動6,7,8はズレが生じやすく
#define ACT7_TIME 218      // 調整することが多いので
#define ACT8_TIME 165      // 最初に定義する

void go_straight(int t)
{
    OnFwd(OUT_A+OUT_C);
    Wait(t*100/MOVE_TIME);
    Off(OUT_A+OUT_C);
    Wait(100);
}

void go_back (int t)
{
    OnRev(OUT_A+OUT_C);
    Wait(t*100/MOVETIME);
    Off(OUT_A+OUT_C);
    Wait(100);
}

void turn_left(int t)      // 左方向に90度回転
{
    OnRev(OUT_A); OnFwd(OUT_C);
    Wait(t);
    Off(OUT_A+OUT_C);
    Wait(100);
}

void turn_right(int t)     // 右方向に90度回転
{
    OnFwd(OUT_A); OnRev(OUT_C);
    Wait(t);
    Off(OUT_A+OUT_C);
    Wait(100);
}

sub pen_down()             // ペンを下ろす
{
    OnFwd(OUT_B);
    Wait(PEN_TIME);
    Off(OUT_B);
}

sub pen_up()               // ペンを上げる
{
    OnRev(OUT_B);
    Wait(PEN_TIME);
    Off(OUT_B);
}

task main()
{
    SetPower(OUT_A,7);     // パワーを設定
    SetPower(OUT_C,7);

    pen_down();            // ペンを下ろす
    go_straight(171);      // 【一画目】行動1(17.1cm直進)
    pen_up();              // ペンを上げる
    turn_left(TURN_TIME);  // 行動2(左回転)
    go_straight(52);       // 行動3(5.2cm直進)
    turn_left(TURN_TIME);  // 行動4(左回転)
    go_straight(88);       // 行動5(8.8cm直進)
    turn_left(ACT6_TIME);  // 行動6(左にある程度回転)
    pen_down();            // ペンを下ろす

    SetPower(OUT_A,7);     // パワーを変更
    SetPower(OUT_C,0);

    go_straight(ACT7_TIME);// 【二画目】行動7(左方向に曲がりながら前進)

    SetPower(OUT_A,7);     // パワーを変更
    SetPower(OUT_C,7);

    pen_up();              // ペンを上げる
    turn_right(ACT8_TIME); // 行動8(右にある程度回転)
    go_straight(58);       // 行動9(5.8cm直進)
    turn_right(TURN_TIME); // 行動10(右回転)
    go_straight(23);       // 行動11(2.3cm直進)
    pen_down();            // ペンを下ろす
    go_straight(122);      // 【三画目】行動12(12.2cm直進)
    pen_up();              // ペンを上げる
    go_back(55);           // 行動13(5.5cm後退)
    turn_right(TURN_TIME); // 行動14(右回転)
    go_back(14);           // 誤差修正1(1.4cm後退)
    pen_down();            // ペンを下ろす
    go_straight(77);       // 【四画目】行動15(7.7cm直進)
    pen_up();              // ペンを上げる
    go_straight(11);       // 誤差修正2(1.1cm直進)
    turn_left(TURN_TIME);  // 行動16(左回転)
    go_back(103);          // 行動17(10.3cm後退)
    pen_down();            // ペンを下ろす
    go_straight(167);      // 行動18(16.7cm直進)
    pen_up();              // ペンを上げる
}

指摘があったので関数を使って簡潔にしました。   

感想

難しかった点

  • ロボットが回転することでペンの位置がズレ、プログラムに誤差が生じてしまう。
  • 床上での動きと紙上での動き方が微妙に違い毎回同じように動いてくれない。
  • ロボットの移動時間の設定が難しい。

工夫した点

  • ギアを低速にし、ロボットの走行を安定させた。
  • ペンの位置をロボットの回転の中心に近づける(ペンをロボット内で上下する仕組みにした)ことで、回転時の誤差を減らした。
  • プログラムの最初に、ロボットが90°曲がるのにかかる時間、一秒間に進む距離を定義することで、ロボットが何cm進むかを設定することができ、より正確に動かすことができた。また、そうすることで設定時間を決めるのが簡単になった。
  • 補助輪をつけることでロボのバランスをとった。
  • 「左」の二画目の曲線にSetPowerを使った。

反省点

  • ペンをロボット内で上下させる仕組みにより、ロボットの重心が上になり、バランスが悪くなった。
  • 補助輪が動作の抵抗になってしまうことがあり、誤差が生じた。

感想

  • 最初のロボットにしては完成度が高かったですヾ(@ ̄▽ ̄@)ノ

コメントはこちらまで

  • よくまとまっているプログラムですね。関数を使えばもう少し短く簡潔にできるかもしれません。 -- まいける(TA) 2005-12-02 (金) 17:10:24

戻る


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-02-19 (日) 14:09:22