距離センサーを使ってみる

距離センサーを使ってみる

シャープ測距モジュール GP2Y0A21YKを用いて距離を測定します。

右側の長細いセンサーがPSDで、左側の小さいのが赤外線の発光ダイオードになっています。


このPSD(Position Sensitive Detector)というセンサーは、半導体位置検出素子といい、スポット状の光の位置を検出します。構造的にはPIN構造を持つ広い面積のフォトダイオードで、光のスポットの位置から電極までの距離に反比例した電流が流れる仕組みを利用しています。また、その値はスポット光の重心からの位置情報なので、ピンボケをしていても問題なく距離を測定できます。また、物体からの赤外線の反射を利用していますので、物体の色には左右されないで距離が測れるというのがあります。
また、距離は10cmから80cmまで測れます。

電源電圧は4.5Vから5.5Vです。従って、mbedの通常の電源3.3Vを利用できないので、mbedの39番ピンVUから電源を取ります。

ヘッダーファイル
IrDistance.h
#ifndef _IRDISTANCE
#define _IRDISTANCE
#include <mbed.h>
#include "AnalogIn.h"

class IrDistance
{
private:
  AnalogIn *left, *right;

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

#endif
 1 ヘッダーの再定義禁止用
 2 
 3 mbed用ヘッダー
 4 アナログ入力用へっだー
 5 
 6 
 7 
 8 
 9 左右のアナログオブジェクトへの参照
10 
11 
12 コンストラクタ
13 引数付きコンストラクタ
14 左の距離を得る
15 右の距離を得る
16 
17 
18 1行目に対応する

赤外線距離センサーのクラス
IrDistance.cpp
#include "IrDistance.h"

IrDistance::IrDistance()
{
  left  = new AnalogIn(p19);
  right = new AnalogIn(p20);
}

IrDistance::IrDistance(PinName L, PinName R)
{
  left  = new AnalogIn(L);
  right = new AnalogIn(R);
}
float IrDistance::getLeft()
{
  return *left;
}

float IrDistance::getRight()
{
  return *right;
}
 1 赤外線距離センサー用のヘッダー
 2 
 3 コンストラクタ
 4 左のセンサーはp19につなげる
 5 右のセンサーはp20につなげる
 6 
 7 
 8 
 9 ピンを指定してのコンストラクタ
10 
11 
12 
13 
14 左の距離データを求める
15 
16 
17 
18 
19 右の距離データを求める
20 
21 
22 


メインプログラムです。 距離の表示は他の項目で紹介しているI2CLCDディスプレーを用いています。
I2CLCD.hとI2CLCD.hをsrcフォルダにコピーして入れてください。


main.cpp
#include "mbed.h"
#include "IrDistance.h"
#include "I2CLCD.h"
IrDistance distance(p19,p20);
I2CLCD lcd;

int main() {
  lcd.clear();
  while(true) {
     lcd.write((int)(distance.getLeft()*1000),6,0);
     lcd.write((int)(distance.getRight()*1000),6,0);
     wait(0.3);
     lcd.clear();
  }
}
 1 mbed用ヘッダー
 2 赤外線距離センサー用のヘッダー
 3 I2CLCDディスプレー用ヘッダー
 4 左のセンサーをp19、右のセンサーをp20に繋げる
 5 I2CLCDディスプレーのオブジェクト
 6 
 7 
 8 LCDをクリアする
 9 
10 左側の距離データをLCDに表示する
11 右側の距離データをLCDに表示する
12 300ミリ秒待つ
13 LCDをクリアする
14