課題3 左側 : 光を追いかけるロボット

製作者

Nori , Utsumi , ちぃ

ロボットの特徴

はじめに光源を探し、その光を追いかけていくロボット。
前に取り付けた2つの光センサで明るさを認識する。
後輪駆動で前輪はキャスタになっているため、四輪駆動のときより旋回がスムーズにできる。

kadai03-pic01.jpg


file課題3-1のテストの様子(3GP動画)
音がうまく録音できていませんが…

製作過程

  • 06/30
    課題3の1と2をやることに決定。前回作った明るい方向を向くロボットをほぼそのまま使うことにし、光センサを1つ追加。
    プログラムも前回のものを再利用。明るい方向を見つけた後追いかけるように書き足しをした。
    それとは別に明るさに比例した周波数の音を出すプログラムと"かえるの歌"を再生するプログラムを作成。
  • 07/03
    光センサの位置や角度を調整。いろいろと試すが結局最初の状態がちょうど良かった。
    光を追いかけるプログラムも改良。光源が見つからないのに探すのをやめる問題を起こりにくくし、
    また左右の明るさに少し違いがあっても直進するようにした。数値も調整。
    そのプログラムを、音を出すプログラム、かえるの歌を再生するプログラムと合成。
    少し余裕があったので、ひとつのプログラムに1と2両方の機能を入れ、タッチセンサをスイッチにして作動中に1と2を切り替えられるように
    しようとしたがうまくいかず。結局プログラムは2つに分けた。
    また、ギアの減速比を5から1に変えてみたが、光源をうまく認識することができなくなったため戻した。
    kadai03-pic04.jpg
    この時点でのロボット
  • 07/07
    予定が変わり来週まで課題3をやることになったためさらに改良することに。
    これまで光センサが固定式だったが仰角を変えられるようにした。
    また、ブレで一瞬明るさが低下すると再度光源を探し始めてしまう点を、プログラムの改良で解消した。

プログラム

  • 課題3-1 光源を見失ったらかえるの歌を流しながら光源を探す
作成日: 2006/07/07
作成者: Nori , ちぃ
====================

#define TURN 320     //1回転にかかる時間を定義
#define Do 523     //音の周波数を定義
#define Re 587
#define Mi 659
#define Fa 698
#define So 784
#define Ra 880

task music()     //かえるの歌を流すタスク
{
 while(true)
 {
  PlayTone(Do,15); Wait(20);
  PlayTone(Re,15); Wait(20);
  PlayTone(Mi,15); Wait(20);
  PlayTone(Fa,15); Wait(20);
  PlayTone(Mi,15); Wait(20);
  PlayTone(Re,15); Wait(20);
  PlayTone(Do,15); Wait(40);

  PlayTone(Mi,15); Wait(20);
  PlayTone(Fa,15); Wait(20);
  PlayTone(So,15); Wait(20);
  PlayTone(Ra,15); Wait(20);
  PlayTone(So,15); Wait(20);
  PlayTone(Fa,15); Wait(20);
  PlayTone(Mi,15); Wait(40);

  PlayTone(Do,30); Wait(40);
  PlayTone(Do,30); Wait(40);
  PlayTone(Do,30); Wait(40);
  PlayTone(Do,30); Wait(40);

  PlayTone(Do,7); Wait(10);
  PlayTone(Do,7); Wait(10);
  PlayTone(Re,7); Wait(10);
  PlayTone(Re,7); Wait(10);
  PlayTone(Mi,7); Wait(10);
  PlayTone(Mi,7); Wait(10);
  PlayTone(Fa,7);  Wait(10);
  PlayTone(Fa,7);  Wait(10);
  PlayTone(Mi,15); Wait(20);
  PlayTone(Re,15); Wait(20);
  PlayTone(Do,15); Wait(20);
  Wait(20);
 }
}

task main()
{
 int lmax=0,lmin=0,tmax=0,i=0,j=0;     //整数型変数lmax,lmin,tmax,i,jを宣言し0を代入

 SetSensor(SENSOR_1,SENSOR_LIGHT);     //センサ1が光センサであることを宣言
 SetSensor(SENSOR_3,SENSOR_LIGHT);     //センサ3が光センサであることを宣言

 Wait(100);     //すぐに動き出さないように待機
 while(true)     //以下無限ループ
 {
  if(i==0){start music;i=1;}     //iが0ならかえるの歌を再生開始し、iに1を代入
  lmax=SENSOR_1;     //lmaxとlminにセンサ1の値を代入
  lmin=SENSOR_1;
  OnFwd(OUT_A);OnRev(OUT_C);     //回転開始
  ClearTimer(0);     //タイマ0をクリア
  while(FastTimer(0)<=TURN)     //1回転する
  {
   if(lmax<SENSOR_1)
   {                       //センサ1の値がlmaxより大きいなら
    lmax=SENSOR_1;         //lmaxにセンサ1の値を代入し,
    tmax=FastTimer(0);     //tmaxにタイマ0の値を代入
   }
   if(lmin>SENSOR_1)
   {                       //センサ1の値がlminより小さいなら
    lmin=SENSOR_1;         //lminにセンサ1の値を代入
   }
  }
  Off(OUT_A+OUT_C);     //回転停止
  Wait(30);
  OnFwd(OUT_C);OnRev(OUT_A);
  Wait(TURN-tmax);     //(TURN-tmax)*10^-2 秒間逆回転
  Off(OUT_A+OUT_C);
  Wait(30);j=0;

  while((lmax>=(lmin+20))&&(j==0))     //lmaxがlminより20以上大きければ光の追跡を開始
  {
   stop music;i=0;     //かえるの歌の再生を停止し、iに0を代入
   while((SENSOR_1>=(lmax-15))||(SENSOR_3>=(lmax-15)))     //センサ1,センサ3の値がlmax-15以上の間光を追いかける
   {
    if(abs(SENSOR_1-SENSOR_3)<=5)     //センサ1とセンサ3の値の差が5以内ならば直進
    {OnFwd(OUT_A+OUT_C);}
    if(SENSOR_1<(SENSOR_3-5))     //センサ1の値がセンサ3の値-5より小さければ左へ
    {Off(OUT_C);OnFwd(OUT_A);}
    if(SENSOR_1>(SENSOR_3+5))     //センサ1の値がセンサ3の値+5より大きければ右へ
    {Off(OUT_A);OnFwd(OUT_C);}
   }
   j=1;
   PlaySound(SOUND_DOUBLE_BEEP);     //センサ1,センサ3の値がlmax-15より小さくなったら警告音を鳴らす
   ClearTimer(0);
   while((FastTimer(0)<=100)&&(j==1))     //センサ1,センサ3の値がlmax-15より小さくなってから
   {                                      //1秒以内に光源を再確認できなければ光源を探す
    if((SENSOR_1>=(lmax-15))||(SENSOR_3>=(lmax-15))){j=0;}
   }
  }
  Off(OUT_A+OUT_C);
 }
}
  • 課題3-2 光源を見失ったら明るさに比例した周波数の音を出しながら光源を探す
作成日: 2006/07/07
作成者: Nori , Utsumi
====================

#define TURN 320     //1回転にかかる時間を定義

task sound()
{
 while(true)
 {PlayTone((10*SENSOR_1),10);Wait(10);}
}

task main()
{
 int lmax=0,lmin=0,tmax=0,j=0;     //整数型変数lmax,lmin,tmax,jを宣言し0を代入

 SetSensor(SENSOR_1,SENSOR_LIGHT);     //センサ1が光センサであることを宣言
 SetSensor(SENSOR_3,SENSOR_LIGHT);     //センサ3が光センサであることを宣言

 Wait(100);     //すぐに動き出さないように待機
 while(true)     //以下無限ループ
 {
  start sound;     //音を鳴らし始める
  lmax=SENSOR_1;     //lmaxとlminにセンサ1の値を代入
  lmin=SENSOR_1;
  OnFwd(OUT_A);OnRev(OUT_C);     //回転開始
  ClearTimer(0);     //タイマ0をクリア
  while(FastTimer(0)<=TURN)     //1回転する
  {
   if(lmax<SENSOR_1)
   {                       //センサ1の値がlmaxより大きいなら
    lmax=SENSOR_1;         //lmaxにセンサ1の値を代入し,
    tmax=FastTimer(0);     //tmaxにタイマ0の値を代入
   }
   if(lmin>SENSOR_1)
   {                       //センサ1の値がlminより小さいなら
    lmin=SENSOR_1;         //lminにセンサ1の値を代入
   }
  }
  Off(OUT_A+OUT_C);     //回転停止
  stop sound;     //音を止める
  Wait(30);
  OnFwd(OUT_C);OnRev(OUT_A);
  Wait(TURN-tmax);     //(TURN-tmax)*10^-2 秒間逆回転
  Off(OUT_A+OUT_C);
  Wait(30);j=0;
 
  while((lmax>=(lmin+20))&&(j==0))     //lmaxがlminより20以上大きければ光の追跡を開始
  {
   while((SENSOR_1>=(lmax-15))||(SENSOR_3>=(lmax-15)))     //センサ1,センサ3の値がlmax-15以上の間光を追いかける
   {
    if(abs(SENSOR_1-SENSOR_3)<=5)     //センサ1とセンサ3の値の差が5以内ならば直進
    {OnFwd(OUT_A+OUT_C);}
    if(SENSOR_1<(SENSOR_3-5))     //センサ1の値がセンサ3の値-5より小さければ左へ
    {Off(OUT_C);OnFwd(OUT_A);}
    if(SENSOR_1>(SENSOR_3+5))     //センサ1の値がセンサ3の値+5より大きければ右へ
    {Off(OUT_A);OnFwd(OUT_C);}
   }
   j=1;
   PlaySound(SOUND_DOUBLE_BEEP);     //センサ1,センサ3の値がlmax-15より小さくなったら警告音を鳴らす
   ClearTimer(0);
   while((FastTimer(0)<=100)&&(j==1))     //センサ1,センサ3の値がlmax-15より小さくなってから
   {                                      //1秒以内に光源を再確認できなければ光源を探す
    if((SENSOR_1>=(lmax-15))||(SENSOR_3>=(lmax-15))){j=0;}
   }
  }
  Off(OUT_A+OUT_C);
 }
}

改良前(07/03)のプログラムはこちら

工夫した点

  • 前輪をキャスタにし、光源を探すときにスムーズな旋回が行えるようにした。
    kadai03-pic03.jpg

  • 光源を探すときに明るさの最大値だけでなく最小値も記録し、最大値と最小値の差が小さすぎる場合は光源を探しなおすようにすることで、
    光源を確実に見つけられるようにした。
    光源が見つからないのに探すのをやめ、変な方向へ移動してしまうことが起こりにくくなっている。

  • 光センサの仰角を、状況に応じて自由に調節できるようにした。
    kadai03-pic05.jpg
    07/03の時点では前部を上げることで仰角をつけていたため細かい調整が不可能だったが…
    kadai03-pic02.jpg
    これは矢印の部分を中心に、自由に動かすことができる。

  • 光を追跡中、明るさが一瞬低下しても直前の動作を続け、1秒以上明るさが戻らなかったら光源を探すようにした。
    こうすることで、ブレなどで光がわずかにズレて明るさが一瞬低下しても、光源を再度探すことなく光の追跡を行えるようになっている。
    明るさが低下したことが分かるように、低下時には音が鳴る。

苦労した点

  • 光センサの位置、角度の調整。
    光源を認識できる範囲を広くしようと2つのセンサを離したり外側を向かせたりするなど試行錯誤を繰り返すが、
    そうすると光源をすぐに見失うようになってしまい結局まっすぐ前を向かせるようにした。その方が調子が良かった。
    また、はじめは前部を上げることで仰角をつけていたが、状況によって最適な角度が変わるので、
    取り付け部を改良し調整可能にすることで対処した。
    角度を調節するためのブロックにどれを使うのかが全くわからず、奮闘。結局わからず、他の班の方に教えてもらいました。C2のみなさんありがとう。
    キャスタの位置を上に持ってきすぎると、少しキャスタが浮いてしまった。動きにこれといって問題はないのだが、少し浮いたキャスタほど見苦しいものはなかったので、しっかりと地面につかせるようにしました。

残っている問題点

  • 光センサがまっすぐ前を向いているため光源を認識できる範囲が狭い。

  • 光源を探すのに時間がかかる。

  • 装飾がまったくもってされていない。

反省

少し光源を動かしただけでセンサの値が変わってしまうなど予想より難しい点が多く、また集まれる時が少なくいくつか 問題が残ってしまった。
プログラムの作成では、はじめは簡単なプログラムだったためサブルーチン等を用いなかったが、
そのせいかどんどん手を加えていった結果分かりにくいものになってしまった。
音楽が「かえるのうた」だけ、と寂しいものになってしまったのでバリエーションをもっと増やせばよかった。

コメント

コメントをどうぞ。

  • main プログラムがあまり長くなるようでしたらサブルーチンを定義してすっきりとしたプログラムにしましょう。 -- 松本(教員)? 2006-07-11 (火) 14:33:43
  • かなり気合の入ったプログラムですね。素晴らしい。 -- ゆき(TA)? 2006-07-27 (木) 13:09:56

2006a/C4 に戻る


添付ファイル: filekadai03-pic05.jpg 172件 [詳細] filekadai03-pic04.jpg 166件 [詳細] filekadai03-pic03.jpg 168件 [詳細] filekadai03-pic02.jpg 168件 [詳細] filekadai03-pic01.jpg 161件 [詳細] filekadai03-mov01.3gp 303件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-07-27 (木) 18:24:05