第五章 赤外線距離センサー


赤外線距離センサーを用いるときの注意

赤外線距離センサー



赤外線距離センサーはA/Dコンバーターの0chと1chに付いていると仮定します。

赤外線距離センサーのチェック
void main(void)
{
  startInit("\n*** 距離センサテスト ***\n");
  Timer tm;
  ADCon ad;
  int left, right;
  while(true) {
    left = ad.value(0);
    right = ad.value(1);
    tm.wait(200);
    printf("%3d %3d\n", left, right);
  }
}
 1 
 2 
 3 
 4 タイマーオブジェクトを作る
 5 A/Dコンバーターのオブジェクトを作る
 6 
 7 永久ループ
 8 左側の距離を測る
 9 右側の距離を測る
10 200ms待ち
11 表示
12 
13 


この赤外線距離センサーは、A/Dコンバーターで計測しその結果モーターを動かすためにあると考えます。従って、この二つを取り込んでプログラムするのが簡単になります。
IrDistanceクラスはライブラリに入れていないので、コンパイル・リンクする必要があります。

IrDistance.h
#ifndef _IRDISTANCE
#define _IRDISTANCE
#include "ADCon.h";
#include "MCPWM.h";

class IrDistance : public ADCon, public MCPWM
{
private:
  int left, right;

public:
  IrDistance();
  IrDistance(int left, int right);
  int getLeft();
  int getRight();
};

#endif
 1 多重読み込み禁止
 2 
 3 ヘッダーの読み込み
 4 ヘッダーの読み込み
 5 
 6 ADConクラスとMCPWMクラスから派生させる
 7 
 8 
 9 左右のA/Dのチャンネルを格納する変数
10 
11 
12 A/Dの0と1チャンネルをデフォールトとする
13 任意のチャンネルを指定する
14 左の距離データを得る
15 右の距離データを得る
16
17
18


以下はC++のクラスファイルです。

IrDistance.cpp
#include "IrDistance.h"

IrDistance::IrDistance()
{
  left = 0;
  right = 1;
}

IrDistance::IrDistance(int L, int R)
{
  left = L;
  right = R;
}
int IrDistance::getLeft()
{
  return value(left); 
}

int IrDistance::getRight()
{
  return value(right); 
}
 1 ヘッダファイルの読み込み
 2 
 3 デフォールトコンストラクタ
 4 
 5 
 6 
 7 
 8 
 9 引数付きコンストラクタ
10 
11 
12 
13 
14 左側の距離を測定する
15
16
17
18
19 右側の距離を測定する
20
21
22

上記のクラスのテストプログラムです。

赤外線距離センサテスト
void main()
{
  startInit("\n*** 赤外線距離センサテスト ***\n");
  IrDistance robo;
  int right, left;
  while(true)
  {
    left = robo.getLeft();
    right = robo.getRight();
    printf("%5d %5d\n", left, right);
  }
}
 1 
 2 
 3 
 4 赤外線距離センサオブジェクトを作る
 5 
 6 永久ループ
 7 
 8 左側の距離を得る
 9 右側の距離を得る
10 表示
11 
12 


上記テストプログラムではモーターを動かしていませんが、roboオブジェクトにはモーターを動かすメソッドがあります。メソッドについては第三章を参照してください。
上級


超音波レンジファインダー


通信プロトコル(計測の方法)

  1. 用いるIOビットを出力に設定する。
  2. 1を出力する。
  3. 約5μ秒1を維持する。
  4. 0を出力する。
  5. そのビットを入力に変更する。
  6. 1になるまで待つ。待つが、最大約18.5msまでしか待たない。
  7. 0になるまでカウントをする。0になるまで待つが、最大約18.5msまでしか待たない。
  8. カウントした数が距離に比例する。
  9. 6,7でタイムアウトの時は1に戻るか、エラーを知らせる。


使用するセンサーの電源は5Vです。コントロールするCPUの電源は3.3Vなので直接繋げると、CPUあるいはセンサー、あるいは両方壊れる可能性がありますが、このセンサーは、入出力とも3.3VのCPUに繋げる事が出来る特殊なポート構造になっています。ですからそのままつなげることが出来ます。しかし、電源は5Vでないと動作しません。
 他にも5Vを使うので、006P型の電池から三端子レギュレータを用いて5Vに落とします。基板上にこの回路を作っても良いのですが、バッテリースナップ(電池スナップ)プラスチック製 の蓋を取り、そこに組み込み、グルースティックにて封止してみました。


このセンサーを用いて距離を測定する機能はライブラリにはありませんので、全てをプログラムする必要がありますが、機能が重複するところは継承させてプログラムします。
つまり、PingクラスはPortクラスから派生させて作ります。

Ping.h
#ifndef _PING
#define _PING
#include "Port.h"

class Ping : public Port
{
  public:
    Ping()
    {
      port=7;   // Portクラス
      bit=0;
    }

    Ping(unsigned int port, unsigned int bit)
    {
      this->port = port;
      this->bit  = bit;
    }
    int value();
};

#endif
 1 再定義禁止用
 2  以前に定義してなかった場合
 3  親クラスの定義を読み込む
 4 
 5 クラスの宣言、親はPortクラスである
 6 
 7 
 8 デフォールトコンストラクタ
 9 
10 ボート7、ビット0を用いる
11 
12 
13 
14 通常のコンストラクタ
15
16
17
18
19 距離データを戻すメソッド
20
21
22


Ping.cpp
#include "Ping.h"

int Ping::value()
{
  int i,x;
  setOutput();
  writePin(true);
  for(i=0; i<11; i++) ;
  writePin(false);
  setInput();     
  x=0;
  while(!readPin())
    if(x++>15000) break;

  if(x<=15000) {
    x=0;
    while(x<15000) {
      if(!readPin()){   
        writePin(false);
        break;       
      }
      x++;
    } // while
  } //if
  setOutput(); 
  writePin(false);
  return x;
}
 1 ヘッダーファイルの読み込み
 2 
 3 メソッドの定義
 4 
 5 
 6 出力に設定する
 7 1を出力する
 8 5.28μs
 9 0を出力する
10 入力に設定する
11 あきらめカウンタをゼロにする
12 返事が来るまで待つ
13  15000数えて、超えたらあきらめる
14 
15 あきらめなかった場合
16  距離カウンタをゼロにする
17  あきらめない間
18  パルスがゼロになったら計測終了
19
20
21
22   この値は距離に比例する
23
24
25 出力に設定する
26 0を出力する
27 距離を答えとして返す
28


第六章に行く    ホームに戻る