目次

ロボットについて

全体像_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 256件 [詳細] file左方向修正.jpg 235件 [詳細] file右方向修正.jpg 225件 [詳細] file光センサー.jpg 220件 [詳細] file2.jpg 224件 [詳細] file2-2.jpg 128件 [詳細] file1.jpg 213件 [詳細] fileコース_01.jpg 224件 [詳細] file光センサー拡大図_01.jpg 218件 [詳細] fileタッチセンサー拡大図_01.jpg 225件 [詳細] file全体像_01.jpg 216件 [詳細] file20071206192810.jpg 114件 [詳細] file20071206184040.jpg 129件 [詳細]

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