練習問題で作成したプログラム (17班)

メンバー: 松本成司清水明士

version 0.1
Last modified: Fri Feb 20 15:03:44 JST 2004


[必須] ロボットに鉛筆またはペンを取り付け、 A3 用紙の上に ★型を描かせなさい (練習問題 3.3)。

/*
     星型を描くロボットのプログラム (17班)

     by Akishi SHIMIZU, 2002.11.07
     modified by Seiji MATSUMOTO, 2002.12.26
*/

#define LINE_TIME 90   //  一辺(約12cm)を描く時間 (単位 1/100秒)
#define TURN_TIME 37   //  36度回転するのに要する時間 (単位 1/100秒)

task main()
{
    repeat(2)
    {
        OnFwd(OUT_A+OUT_C); Wait(LINE_TIME); //  前進
        OnRev(OUT_A); Wait(TURN_TIME);       //  36度回転 (反時計回り)
        OnRev(OUT_C); Wait(LINE_TIME);       //  後進
        OnFwd(OUT_C); Wait(TURN_TIME);       //  36度回転 (反時計回り)
    }
    OnFwd(OUT_A); Wait(LINE_TIME);           //  前進
    Off(OUT_A+OUT_C);                        //  ストップ
}

工夫した点:
両輪のちょうど中間にペンを置くことにより綺麗な頂点を描くことができた。 前進だけでなく後進も使うことによりスピードアップと精度向上が同時に 達成できた。

[必須] 机の上で動き回るロボットを作成しなさい。 ただし方向変換は机の端に来たときに行うこと (練習問題 4.2)。

     作成中

[必須] 前向きに光センサーを取り付けたロボットを作成し、 そのロボットがもっとも明るい方向 (例えば照らした懐中電灯の方向) を向くようにしなさい。 さらにそのロボットが、 懐中電灯の光を追いかけて進むようにプログラムを改良しなさい (練習問題 4.5.1, 4.5.2)

     作成中

[必須] 明るいところでは、長調で、暗いところでは短調で、 曲を演奏するプログラムを作成しなさい (曲は何でもよい) (練習問題 5.2)。

/*
     『メリーさんのひつじ』を明るいときには C-major で、
     暗い時には C-minor で演奏するプログラム
     (曲の途中でも調が変わる)

     タッチセンサーを押せば演奏を開始し、もう一度押せば
     演奏を中止する

     by Seiji MATSUMOTO, 2002.12.26
*/

  
#define THRESHOLD 35    //  明るさの判断基準 (閾値)

#define Do  523
#define Re  587
#define MiFlat 622      //  『ミ』の flat (Eb)
#define Mi  659
#define Fa  698
#define Sol 784

/* 
   残念ながら PlayTone の時間の引数は定数でなければいけ
   ないので『ミ』を0.15秒、0.25秒、0.35秒演奏する関数を
   それぞれ別に定義する
*/

void play_Mi_15 ()     // 『ミ』を 0.15秒演奏する関数
{
    if ( SENSOR_2 >= THRESHOLD ) {
        PlayTone(Mi,15);      // 明るい時は 659Hz (ハ長調の場合)
    } else {
        PlayTone(MiFlat,15);  // 暗い時には 622Hz (ハ短調の場合)
    }
}

void play_Mi_25 ()    // 『ミ』を 0.25秒演奏する関数
{
    if ( SENSOR_2 >= THRESHOLD ) {
        PlayTone(Mi,25); 
    } else {
        PlayTone(MiFlat,25);
    }
}

void play_Mi_35 ()
{
    if ( SENSOR_2 >= THRESHOLD ) {
        PlayTone(Mi,35); 
    } else {
        PlayTone(MiFlat,35);
    }
}

task play_music()   // 音楽を演奏するタスク
{
    while (true)
    {
        play_Mi_25(); Wait(30);
        PlayTone(Re, 5); Wait(10);
        PlayTone(Do,15); Wait(20);
        PlayTone(Re,15); Wait(20);

        play_Mi_15(); Wait(20);
        play_Mi_15(); Wait(20);
        play_Mi_35(); Wait(40);

        PlayTone(Re,15); Wait(20);
        PlayTone(Re,15); Wait(20);
        PlayTone(Re,35); Wait(40);

        play_Mi_15(); Wait(20);
        PlayTone(Sol,15); Wait(20);
        PlayTone(Sol,35); Wait(40);

        play_Mi_25(); Wait(30);
        PlayTone(Re, 5); Wait(10);
        PlayTone(Do,15); Wait(20);
        PlayTone(Re,15); Wait(20);

        play_Mi_15(); Wait(20);
        play_Mi_15(); Wait(20);
        play_Mi_35(); Wait(40);

        PlayTone(Re,15); Wait(20);
        PlayTone(Re,15); Wait(20);
        play_Mi_25(); Wait(30);
        PlayTone(Re, 5); Wait(10);

        PlayTone(Do,55); Wait(60);
        Wait(20);
    }
}

task main()
{
    SetSensor(SENSOR_1, SENSOR_TOUCH);
    SetSensor(SENSOR_2, SENSOR_LIGHT);

    while (true)
    {
        until (SENSOR_1 == 1);  // タッチセンサーが押されたら
        start play_music ;      // 演奏を開始
        Wait(50);               // 最低でも0.5秒は演奏

        until (SENSOR_1 == 1);  // タッチセンサーが押されたら
        stop play_music ;       // 演奏を停止
        Wait(50);               // 最低でも0.5秒は休止
    }
}

工夫した点:
曲の途中でも調が変わるように、明るさによってそれぞれ違う『ミ』の音を 演奏するための関数を定義した。 またタッチセンサーによって演奏開始・停止ができるようにした。

[自由課題] 黒い線に沿って速く走るロボットを作成せよ (例題の改良)。

     作成中

[自由課題]



Seiji Matsumoto