目次

ロボットについて

全体像_01.jpg

今回の目的

今回のロボットはライントレースを行うためのものです。ライントレースとは、ロボットに光センサーを取り付け、線に沿って動かすことです。コースについては後ほど...

光センサー拡大図_01.jpg

ロボット上部から見て左側にある光センサーを光センサー1,右側にある光センサーを光センサー2とする。今回は黒い線の上ではなく、その両サイドの白い部分に沿って進むませ、黒い部分に光センサーが反応した場合、軌道修正を行うように設計しました。

直線部分走行の場合...

光センサー.jpg

白い部分に両光センサーがある限り、直進する以外の行動を起こさないので、直進し続けます。

右折部分走行の場合...

1.jpg

光センサー2が黒い部分に反応すると...

右方向修正.jpg

ロボットは赤い矢印の方向に軌道修正し、再び動き始めます。

左折部分走行の場合...

2.jpg

センサー1が黒い部分に反応すると...

左方向修正.jpg

ロボットは赤い矢印の方向に軌道修正し、再び動き出します。

交差点での一時停止...

交差点.jpg

黒い部分に両光センサーが反応し、後退と停止を行います。

激突した場合...

タッチセンサー拡大図_01.jpg

前方タッチセンサーが反応し、後退と停止を行い、再び動き出します。

ラインを挟んで進む利点...

交差点で直行させるラインを描く必要はありますが、黒いラインの上を沿わせる光センサーよりも二つのセンサーの幅が広くなることにより、速いスピードでカーブを曲がる場合でもコースから外れにくいです。

コース

上記したように、交差点にて、コースと直角に黒い線を描くことによって、その位置に達すると両光センサーが反応します。すると、後退と停止を行い、再び動き出します。

コース_01.jpg

プログラム

ライントレース用プログラム

task main ()
{
   SetSensor(SENSOR_1, SENSOR_LIGHT);
   SetSensor(SENSOR_2, SENSOR_TOUCH);
   SetSensor(SENSOR_3, SENSOR_LIGHT);
   while (true) 
   {
       while(SENSOR_2 == 0)
       {
           if (SENSOR_1 < THRESHOLD) {
                if (SENSOR_3 < THRESHOLD) {
                     Off(OUT_A+OUT_C);   //停止
                     Wait(100);
                     OnFwd(OUT_A+OUT_C);  //直進
                     Wait(100);
               } else {
                   OnFwd(OUT_C);   //右に方向修正
                   OnRev(OUT_A);
               }
          } else {
               if (SENSOR_3 < THRESHOLD) {
                   OnFwd(OUT_A);  //左に方向修正
                   OnRev(OUT_C);
               } else {
                   OnFwd(OUT_A+OUT_C);  //直進
               }
           }
       }
       OnRev(OUT_A+OUT_C);  //ぶつかった時に後退、停止、直進する
       Wait(100);
       Off(OUT_A+OUT_C);
       Wait(500);
       OnFwd(OUT_A+OUT_C);
       Wait(100);
       Off(OUT_A+OUT_C);
   }
}

ライントレースを行うためのプログラムです。

音楽用プログラム

マリオのテーマ(スター状態)

#define C1  131
#define C2  262
#define C3  523
#define Ds1 139
#define Ds2 277
#define Ds3 554
#define D1  147
#define D2  294
#define D3  587
#define Es1 156
#define Es2 311
#define Es3 622
#define E1  165
#define E2  330
#define E3  659
#define F1  175
#define F2  349
#define F3  698
task play_music()
{
    while(true)
    {
         PlayTone(F3,14); Wait(19);
         PlayTone(F3,14); Wait(19);
         PlayTone(F3,14); Wait(19);
         PlayTone(D3, 7); Wait(12);
         PlayTone(F3,14); Wait(19);
         PlayTone(F3,14); Wait(19);
         PlayTone(D3, 7); Wait(7);
         PlayTone(F3, 7); Wait(12);
         PlayTone(D3, 7); Wait(7);
         PlayTone(F3,14); Wait(19);
         PlayTone(E3,14); Wait(19);
         PlayTone(E3,14); Wait(19);
         PlayTone(E3,14); Wait(19);
         PlayTone(C3, 7); Wait(12);
         PlayTone(E3,14); Wait(19);
         PlayTone(E3,14); Wait(19);
         PlayTone(C3, 7); Wait(7);
         PlayTone(E3, 7); Wait(12);
         PlayTone(C3, 7); Wait(7);
         PlayTone(E3,14); Wait(19);
    }
}

通常走行状態で流れる音楽です。タッチセンサーが反応しない限りは流れ続けます。

マリオのテーマ(地下ステージ)

#define DO1  262
#define DO2   523
#define RA1  110
#define RA2  220
#define SI1   117
#define SI2   233
#define RE1   147
#define RE2   294
#define MI1   165
#define MI2   330
#define FA1   175
#define FA2   349
task play_music() 
{
   while (true)
   {
       PlayTone(DO1, 15); Wait(20);
       PlayTone(DO2, 15); Wait(20); 
       PlayTone(RA1, 15); Wait(20);  
       PlayTone(RA2, 15); Wait(20);
       PlayTone(SI1, 15); Wait(20);
       PlayTone(SI2, 15); Wait(20);
       Wait(60);
       PlayTone(DO1, 15); Wait(20);
       PlayTone(DO2, 15); Wait(20);  
       PlayTone(RA1, 15); Wait(20);  
       PlayTone(RA2, 15); Wait(20);
       PlayTone(SI1, 15); Wait(20);
       PlayTone(SI2, 15); Wait(20);
       Wait(60);
       PlayTone(FA1, 15); Wait(20); 
       PlayTone(FA2, 15); Wait(20);  
       PlayTone(RE1, 15); Wait(20);  
       PlayTone(RE2, 15); Wait(20);
       PlayTone(MI1, 15); Wait(20);
       PlayTone(MI2, 15); Wait(20);
       Wait(60);
       PlayTone(FA1, 15); Wait(20);
       PlayTone(FA2, 15); Wait(20); 
       PlayTone(RE1, 15); Wait(20);  
       PlayTone(RE2, 15); Wait(20);
       PlayTone(MI1, 15); Wait(20);
       PlayTone(MI2, 15); Wait(20);
       Wait(60);
   }
}

激突した場合に流れる音楽です。

トレース&音楽プログラム

下のプログラムは、前述した3つのプログラムをまとめて実際に使用したプログラムです。

#define THRESHOLD 40   // 閾値
#define DO1  262
#define DO2  523
#define RA1  110
#define RA2  220
#define SI1  117
#define SI2  233
#define RE1  294  
#define RE2  587
#define MI1  311
#define MI2  622
#define FA1  349
#define FA2  698
#define C3  523
#define Ds3  554
#define D3  587
#define Es3  622
#define E3  659
#define F3  698
task play_music_1()
{
    while(true)
    {
        PlayTone(F3,14); Wait(19);  //マリオのテーマ(スター状態)
        PlayTone(F3,14); Wait(19);
        PlayTone(F3,14); Wait(19);
        PlayTone(D3, 7); Wait(12);
        PlayTone(F3,14); Wait(19);
        PlayTone(F3,14); Wait(19);
        PlayTone(D3, 7); Wait(7);
        PlayTone(F3, 7); Wait(12);
        PlayTone(D3, 7); Wait(7);
        PlayTone(F3,14); Wait(19);
        PlayTone(E3,14); Wait(19);
        PlayTone(E3,14); Wait(19);
        PlayTone(E3,14); Wait(19);
        PlayTone(C3, 7); Wait(12);
        PlayTone(E3,14); Wait(19);
        PlayTone(E3,14); Wait(19);
        PlayTone(C3, 7); Wait(7);
        PlayTone(E3, 7); Wait(12);
        PlayTone(C3, 7); Wait(7);
        PlayTone(E3,14); Wait(19);
   }
}
task play_music_2()  // 音楽を演奏するタスク
{
    while (true)
    {
        PlayTone(DO1, 15); Wait(20);  //マリオのテーマ(地下ステージ)
        PlayTone(DO2, 15); Wait(20);
        PlayTone(RA1, 15); Wait(20);
        PlayTone(RA2, 15); Wait(20);
        PlayTone(SI1, 15); Wait(20);
        PlayTone(SI2, 15); Wait(20);
        Wait(60);
        PlayTone(DO1, 15); Wait(20);
        PlayTone(DO2, 15); Wait(20);
        PlayTone(RA1, 15); Wait(20);
        PlayTone(RA2, 15); Wait(20);
        PlayTone(SI1, 15); Wait(20);
        PlayTone(SI2, 15); Wait(20);
        Wait(60);
        PlayTone(FA1, 15); Wait(20);
        PlayTone(FA2, 15); Wait(20);
        PlayTone(RE1, 15); Wait(20);
        PlayTone(RE2, 15); Wait(20);
        PlayTone(MI1, 15); Wait(20);
        PlayTone(MI2, 15); Wait(20);
        Wait(60);
        PlayTone(FA1, 15); Wait(20);
        PlayTone(FA2, 15); Wait(20);
        PlayTone(RE1, 15); Wait(20);
        PlayTone(RE2, 15); Wait(20);
        PlayTone(MI1, 15); Wait(20);
        PlayTone(MI2, 15); Wait(20);
        Wait(60);
   }
}
task main ()
{
   SetSensor(SENSOR_1, SENSOR_LIGHT);
   SetSensor(SENSOR_2, SENSOR_TOUCH);
   SetSensor(SENSOR_3, SENSOR_LIGHT);
   while (true) 
   {
   stop play_music_2 ;     // 後退用音楽(マリオのテーマ(地下ステージ))を停止
   start play_music_1 ;    //  直進用音楽(マリオのテーマ(スター状態))を開始
       while(SENSOR_2 == 0)
       {
           if (SENSOR_1 < THRESHOLD) {
                if (SENSOR_3 < THRESHOLD) {
                     stop play_music_1 ;    //  直進用音楽(マリオのテーマ(スター状態))を停止
                     Off(OUT_A+OUT_C);   //停止
                     Wait(100);
                     OnFwd(OUT_A+OUT_C);  //直進
                     Wait(100);
                     start play_music_1 ;    //  直進用音楽(マリオのテーマ(スター状態))を開始
               } else {
                   OnFwd(OUT_C);   //右に方向修正
                   OnRev(OUT_A);
               }
          } else {
               if (SENSOR_3 < THRESHOLD) {
                   OnFwd(OUT_A);  //左に方向修正
                   OnRev(OUT_C);
               } else {
                   OnFwd(OUT_A+OUT_C);  //直進
               }
           }
       }
       stop play_music_1 ;     // 直進用音楽(マリオのテーマ(スター状態))を停止
       start play_music_2 ;     // 後退用音楽(マリオのテーマ(地下ステージ))を開始
       OnRev(OUT_A+OUT_C);  //ぶつかった時に後退、停止、直進する
       Wait(100);
       Off(OUT_A+OUT_C);
       Wait(500);
       OnFwd(OUT_A+OUT_C);
       Wait(100);
       Off(OUT_A+OUT_C);
   }
}

工夫した点

苦労した点

コメントをお願いします。



添付ファイル: file交差点.jpg 356件 [詳細] file左方向修正.jpg 334件 [詳細] file右方向修正.jpg 64件 [詳細] file光センサー.jpg 326件 [詳細] file2.jpg 320件 [詳細] file2-2.jpg 178件 [詳細] file1.jpg 314件 [詳細] fileコース_01.jpg 329件 [詳細] file光センサー拡大図_01.jpg 349件 [詳細] fileタッチセンサー拡大図_01.jpg 338件 [詳細] file全体像_01.jpg 321件 [詳細] file20071206192810.jpg 156件 [詳細] file20071206184040.jpg 176件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-02-01 (金) 17:10:20