Arduino

赤外線距離センサをArduinoで使ってみる

今回は赤外線距離センサを使って距離の計測をする回路を作成します。赤外線距離センサは、物体との距離を計測してロボットをうまくコントロールするために使われたりします。

赤外線は人の目ではとらえることができないので生活に支障をきたさず、身の回りのあらゆる分野で使われています。

赤外線距離センサ

赤外線距離センサとは、 赤外線を発光して被写体に反射して返ってきた光から距離を計測するセンサです。センサには発光部と受光部にそれぞれレンズがあり、発光部から照射した光が被写体に届き、その反射した光を受光部が受けます。受光部の奥には光センサがあり、遠い距離ほど中心付近に照射されます。この反射した光から距離を算出する方法を「PSD方式」といいます。

GP2Y0E03

今回使う赤外線距離センサはシャープ社の GP2Y0E03 という部品です。

動作に必要な電力は2.7V~5.5Vですので、Arduinoの電力で十分に動作します。 GP2Y0E03に 7つの端子があり、左から順番にVDD(電源電圧)、出力端子、GND、Vin(供給電圧)、スタンバイ端子、SCL、SDAとなっています。基本的にはVDD・Vin・スタンバイ端子ともに5V、通信にはI2Cを使うため出力端子には何も差さないでいいかと思います。

赤外線距離センサを使って距離を取得する

赤外線距離センサを使って距離を計測します。センサに手を近づけるとセンサと被写体間の距離をシリアル通信を通して画面に表示し、計測範囲外になった場合は、画面上に「 被写体と近づき過ぎています。 」とメッセージを表示するとともにLEDを点灯させます。

作成した回路

作成した回路は下図をご覧ください。

作成した使用した装置及び部品は下表をご覧ください。

Arduinoマイコン搭載の小型コンピュータ
ブレッドボード抵抗・ジャンパー線などを使って回路を作る基板
赤外線距離センサ赤外線を発光し、被写体に反射して返ってきた光から距離を計測するセンサ
ジャンパー線電気を中継する線
抵抗510Ω電圧を下げる端子
LED順方向に電圧を加えると発光する半導体

プログラムコード

プログラムコードは以下の通りとなります。

#include <Wire.h>

const int GP2Y0E03_ADDR = 0x40;
const uint8_t SHIFT_BIT_ADDR = 0x35;
const uint8_t DISTANCE114_ADDR = 0x5E;
const int LED_PIN = 13;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Wire.begin();
  pinMode(LED_PIN,OUTPUT);

}

void loop() {
  // put your main code here, to run repeatedly:
  //距離を算出するのに必要な値
  uint8_t dis_value[2];
  uint8_t shift_bit;
  unsigned int distance;

  //shift bitを取得
  Wire.beginTransmission(GP2Y0E03_ADDR);
  Wire.write(SHIFT_BIT_ADDR);
  Wire.endTransmission();
  //値を取得
  Wire.requestFrom(GP2Y0E03_ADDR,1);
  shift_bit = Wire.read();
  
  //距離センサーにコマンドを送信
  Wire.beginTransmission(GP2Y0E03_ADDR);
  Wire.write(DISTANCE114_ADDR);
  Wire.endTransmission(); 
  //値を取得
  Wire.requestFrom(GP2Y0E03_ADDR,2);
  for(int i; i < 2;i++){    
    dis_value[i] = Wire.read();
  }

  if(dis_value[0] >= 255 && dis_value[1] >= 15)
  {
    Serial.println("被写体と近づき過ぎています。");
    digitalWrite(LED_PIN,HIGH);
  }
  else
  {
      //距離を算出
    distance =  ((dis_value[0]*16)+dis_value[1])/16/pow(2,shift_bit);
    Serial.print("距離:"); Serial.print(distance); Serial.println("cm");
    digitalWrite(LED_PIN,LOW);
  
  }

  delay(500);
    
}

GP2Y0E03 のアドレスは0x40です。また距離を算出するのに必要なshift bitと距離の計算の元となる値のレジストリアドレスが0x35と0x5Eになっています。

const int GP2Y0E03_ADDR = 0x40;
const uint8_t SHIFT_BIT_ADDR = 0x35;
const uint8_t DISTANCE114_ADDR = 0x5E;

shift bitの値を取得しています。デフォルトは2になっています。

//shift bitを取得
Wire.beginTransmission(GP2Y0E03_ADDR);
Wire.write(SHIFT_BIT_ADDR);
Wire.endTransmission();
//値を取得
Wire.requestFrom(GP2Y0E03_ADDR,1);
shift_bit = Wire.read();

距離の計算の元となる値はレジストリアドレス0x5Eと0x5Fになりますので、requestFromで2byte読み込んでそれぞれ1byteごとに配列に格納しています。

//距離センサーにコマンドを送信
Wire.beginTransmission(GP2Y0E03_ADDR);
Wire.write(DISTANCE114_ADDR);
Wire.endTransmission(); 
//値を取得
Wire.requestFrom(GP2Y0E03_ADDR,2);
for(int i; i < 2;i++){    
  dis_value[i] = Wire.read();
}

アプリケーションノートを見ると距離を求めるには、『 (0x5E の値×16 + 0x5F の値)/16/2^0x35の値』で算出できます。ただし0x5Eの値が255かつ、0x5Fの値が15以上である場合は正しく計測できないので計測範囲外としています。

distance =  ((dis_value[0]*16)+dis_value[1])/16/pow(2,shift_bit);

実行結果

実行結果は以下の動画をご覧ください。

併せてシリアル通信の結果は下図になります。

まとめ

今回は赤外線距離センサを使って距離を表示する回路を作成しました。このセンサでは、赤外線の反射光を受光部で受けてその値をもとに距離を算出しますので、周りに赤外線が多いと誤計測される可能性が高いです。特にテレビなどのリモコンは赤外線を使っているため、干渉します。

また、ロボットなど自立する物体では、障害物との距離を測るために赤外線距離センサが使われますが、測定距離が短いのが欠点としてあります。

世の中にはより測定距離が長い超音波を使った距離センサもありますので、今度はそのセンサを使って距離を算出する回路を作りたいと思います。

参考書籍

Arduino電子工作