Arduino-距離センサ「GP2Y0E03」の使い方

当記事では、Arduinoで距離センサ「GP2Y0E03」を使う方法を詳しく解説します。

距離センサ「GP2Y0E03」はI2C制御での12bitデータを出力するため、ArduinoのWireライブラリを使ったプログラムで動作する方法をご紹介します。

なお、その他のArduino関数・ライブラリについては、以下の記事をご覧ください。

目次

距離センサ「GP2Y0E03」の基本スペック

「GP2Y0E03」はI2C制御またはアナログ出力で、距離を測定できるセンサです。

当記事では、秋月電子通商で販売されている「シャープ測距モジュールGP2Y0E03 (I2C&アナログ出力)」を使用して、サンプルプログラムを解説していきます。

基本スペックGP2Y0E03
距離出力形態アナログ/I2C
端子数7
電源電圧2.7~5.5V
検出距離4~50cm
検出精度L=50cm
50±5cm

L=10cm
10±1cm

L=4cm
4±1cm
アナログ出力電圧L=50cm
0.55±0.25V

L=10cm
2±0.1V

L=4cm
2.2±0.1V
平均消費電流26mA
(Max 36mA)
スタンバイ時
消費電流
20uA
(Max 60uA)
応答時間Max 40ms
モジュールサイズ11.0mm(L) × 16.7mm(W) × 5.2mm(H)

GP2Y0E03のより詳細なスペックを確認したい場合は、以下のリンク先にあるデータシートとアプリケーションノートをご覧ください。

距離センサ「GP2Y0E03」のコマンド

コマンド内容アドレス
Slave ID (write cycle)0x80
Slave ID (read cycle)0x81
Hold Bit0x03
最大発光パルス幅0x13
受光スポット対称性閾値0x1C
受光信号強度閾値0x2F
Max 受光スポット径閾値0x33
Min 受光スポット径閾値0x34
Shift Bit0x35
中央値フィルタ0x3F
SRAM アクセス0x4C
Distance[11:4]0x5E
Distance[3:0]0x5F
AE[15:8]0x64
AE[7:0]0x65
AG[7:0]0x67
カバー補正係数[5:0]0x8D
カバー補正係数[10:6]0x8E
カバー補正 Enable Bit0x8F
イメージセンサデータ読出し0x90
信号積算回数0xA8
Enable Bit(信号強度)0xBC
Enable Bit(Min スポット径)0xBD
Enable Bit(Max スポット径)0xBE
Enable Bit(スポット対称性)0xBF
E-Fuse アドレス指定
E-Fuse 読み出し設定
E-Fuse Enable Bit
0xC8
E-Fuse ビット数/バンク指定0xC9
E-Fuse プログラム Enable Bit0xCA
E-Fuse プログラム Data0xCD
動作/スタンバイ制御0xE8
クロックセレクト0xEC
ソフトウエアリセット0xEE
バンクセレクト0xEF
受光スポット座標(C)0xF8
受光スポット座標(A)0xF9
受光スポットピーク座標(B)0xFA

GP2Y0E03のより詳細なスペックを確認したい場合は、以下のリンク先にあるデータシートとアプリケーションノートをご覧ください。

サンプルプログラム(サンプルスケッチ)-I2C制御の測定

Arduino Uno 距離センサ GP2Y0E03 I2C制御の測定 配線図
用意するもの
  1. シャープ測距モジュールGP2Y0E03 (I2C&アナログ出力)
  2. I2Cバス用双方向電圧レベル変換モジュール(PCA9306)
  3. Arduino Uno
  4. USBケーブル
  5. ブレッドボード
  6. ジャンパ線
  7. PC(プログラム書き込み・シリアルモニタ表示)

「GP2Y0E03」の信号レベルが3.3Vとなるため、秋月電子通商のI2Cバス用双方向電圧レベル変換モジュール(PCA9306)を使ってArduino Unoと同じ5Vにレベル変換をします。変換モジュールにはすでにプルアップ用の抵抗が取り付けられているので、別途、外部でプルアップ抵抗を接続する必要はありません。

サンプルプログラム(サンプルスケッチ)で、ブレッドボードを使います。ブレッドボードの詳しい使い方は、以下の記事をご覧ください。

#include <Wire.h>

//アドレス指定
#define GP2Y0E03_ADDR 0x40
#define DISTANCE_ADDR 0x5E

void setup()
{
  Serial.begin(9600);//シリアル通信を9600bpsで初期化
  Wire.begin();//I2Cを初期化

  delay(500);//500msec待機(0.5秒待機)
}

void loop() {
  //変数宣言
  unsigned int dac[2];
  unsigned int i, distance;

  Wire.beginTransmission(GP2Y0E03_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
  Wire.write(DISTANCE_ADDR);//距離の測定
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了

  Wire.requestFrom(GP2Y0E03_ADDR, 2);//I2Cデバイス「GP2Y0E03」に2Byteのデータ要求
  for (i=0; i<2; i++){
      dac[i] = Wire.read();//dacにI2Cデバイス「GP2Y0E03」のデータ読み込み
  }
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了

  distance = ((dac[0]*16+dac[1]) / 16) / (2*2);//距離(cm)を計算

  Serial.print("距離:");//文字列「距離:」をシリアルモニタに送信
  Serial.print(distance);//「distance」をシリアルモニタに送信
  Serial.println("cm");//文字列「cm」をシリアルモニタに送信、改行

  delay(1000);//1000msec待機(1秒待機)
}
シリアルモニタ例

距離:50cm
距離:50cm
距離:50cm
距離:50cm
距離:50cm
距離:50cm
距離:50cm
距離:50cm
距離:50cm
距離:50cm

サンプルプログラムでは、距離センサ「GP2Y0E03」から取得した距離の12bitデータをcm単位に換算して、シリアルモニタに表示させます。

注意点としては、「GP2Y0E03」のアドレスは7bitの「0x40」(2進数:1000000)になります。データシートには、Slave ID( write cycle) が「0x80」(2進数:10000000)、Slave ID(read cycle)が「0x80」(2進数:10000001)と8bitで記載されています。

おすすめのArduinoボードはどれ?

Arduinoボード

当記事『Arduino-距離センサ「GP2Y0E03」の使い方』では、Arduino Unoを使用したサンプルプログラムを解説してきました。

やはり、たくさんの種類のあるArduinoボードの中でも、最も基本的なエディションのArduino Unoがおすすめなのですが、Arduino Unoと電子部品を組み合わせたキットも存在します。

電子工作初心者にとっては、いちいち電子部品を別途購入する必要がないので非常に有用です。以下の記事で初心者でもわかりやすいように、ランキング形式でおすすめのArduino Unoを紹介しているので、ぜひご覧ください。

また、以下の記事で、安価でWi-Fi/Bluetoothに対応している「ESP32開発ボード」についてもまとめてみました。

このボードは、Arduinoボードではありませんが、Arduino IDEでソフト開発ができるため、電子工作でIoTを実現したい方におすすめです。

よかったらシェアしてね!
目次
閉じる