☆目次

マシン紹介

DSC00260.JPG

今回のマシンは実際、光を追いかける仕事をするにあたってマシンに手を加えることがほとんどありませんでした。

モーターを2つつけたドライブベースに光センサー2つをくっつけただけです。赤く光っているレーザーポインタのようなものが光センサーです。

課題1のマシンと比べても明らかにマシンは簡単な構造になっていてほとんど時間がかかっておりません。

ただそれではあまりに貧相なので、まぁなんというか写真の通り思い切ってやっちゃいました。リンゴスター曰く「え、これかなりいいんじゃない?」とのことです(´-`)v

DSC00261.JPG

これは課題1,2からずっとうちの専属操縦士のメカ崎君です。

特等席です。

パーツが足りなくなったらスクラップにしようと思っていましたがしぶとく生き残っています。

しかし彼の働きなしにこの課題を乗り越えることは不可能だった、と関係者は口をそろえて言います。

 
 
 
DSC00262.JPG

右からのアップ。

腕とか意味ねー

 
 
 
 
 
 
 
 
 
DSC00263.JPG
 
 
 

今回このマシンは3輪にしました。

後ろはキャスターになっていてこのことで動きすごい早くなりました

なかなかいい動きします、これ。

また、写真はありませんが非常に分解、組立が簡単です。(A7のロボットのコンセプトでもあります)

 
 
 
 
 
 

つぎはいよいよプログラム紹介。非常に複雑です

なんてったって「明るさに比例した周波数の音を出しながら全方角の中から光源のある方角を探し、探した後は、光源の光を追いかけて進むロボット」ですから、そりゃぁ複雑です。でもなんとかなりました。ではそのプログラムをご覧くださいヾ(´ー`)

プログラム紹介

#define TURN_TIME 250                    //一周回る時間を定義
task play_music()                        //音楽を演奏するタスク
{
  SetSensor(SENSOR_1,SENSOR_LIGHT);   //光センサー1を指定(ここポイント!)
  while(true)
  {
      PlayTone(10*SENSOR_1,5);           //センサー1の値×10の周波数の音を0,05秒鳴らす
      Wait(10);
   }
   }
task main()
{
  SetSensor(SENSOR_3,SENSOR_LIGHT);
   int time_peak,light_peak=0;      //光の明るさの最大値とそのときの時間の値を変数で定義(最初は0)
   ClearTimer(0);
   OnFwd(OUT_A);                         //基本は右旋回
   OnRev(OUT_C);
   start play_music;
   while(FastTimer(0)<TURN_TIME)         //一周するまでwhileのなかを繰り返す
   {
      if(SENSOR_1>light_peak)            //もしセンサー1で計った値が現在の最大値より大きいときは…
      {
      light_peak=SENSOR_1;          //センサー1の値を最大値に代入
      time_peak=FastTimer(0);       //そのときの時間をtime_peakに代入
      }
   }
   Off(OUT_A+OUT_C);
   Wait(50);
   OnRev(OUT_A);
   OnFwd(OUT_C);
   Wait(TURN_TIME-time_peak);        //一周の時間から光の最大値が計測された時間を引いた時間だけ回って(逆回転)もっとも明るい方向に向く
   stop play_music;
   Off(OUT_A+OUT_C);
   Wait(100);                            //ここまでのプログラムで最も明るい方向を向いています
   
   
   while(true)                           //whileの中を繰り返し、光源を追いかける                
   {
   if(SENSOR_1<SENSOR_3)                 //センサー3(右側)の方が明るかったら…
   {
   Off(OUT_A+OUT_C);
   OnFwd(OUT_A);                         //右に旋回
   }
   if(SENSOR_3<SENSOR_1)                 //センサー1(左側)の方が明るかったら…
   {
   Off(OUT_A+OUT_C);
   OnFwd(OUT_C);             //左に旋回
   }
   else                 //どちらでもなければ…
   {
   Off(OUT_A+OUT_C);
   OnFwd(OUT_A+OUT_C);         //直進
   }
   }
}

工夫と課題

  • 工夫したところ
    • プログラムで、センサー1を音楽のタスクではじめに定義しないとセンサー1の周波数を鳴らすことができなかった
    • 発見した光の最大値のところまで回転してもどるとき、一周の時間が状況によって違うので、ただ単に計った時間だけ正回転すると誤差が出た。だからほぼ一周の時間から計った時間を引いた時間分逆回転させた
    • forを使う方法もあったがタイマーの方が動きは滑らかだったのでタイマーを使用した
    • ある一定の明るさになったら方向を決めるというのではなく、その状況で最も明るい方向を向くようにした
  • 課題と反省
    • 光源を探すとき光源が突然真後ろなどに移動したとき、その光を探すというプログラムも作れたと思う
    • センサー1に比例した周波数を鳴らす際、本当に比例してるのか分からないぐらいの音になってしまった(実際にはちゃんと比例してます)

コメントをお願いします

  • 光源を追いかけて移動しているとき、左右のセンサがどちらもある値以下になってしまった場合には再び一回転して探す、といったプログラムに改良することは容易ですね。 -- 松本(教員)? 2007-01-09 (火) 14:06:31


添付ファイル: fileDSC00263.JPG 191件 [詳細] fileDSC00262.JPG 202件 [詳細] fileDSC00261.JPG 185件 [詳細] fileDSC00260.JPG 209件 [詳細]

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