Arduinoのサンプルプログラム

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 Bit 0x03
最大発光パルス幅 0x13
受光スポット対称性閾値 0x1C
受光信号強度閾値 0x2F
Max 受光スポット径閾値 0x33
Min 受光スポット径閾値 0x34
Shift Bit 0x35
中央値フィルタ 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 Bit 0x8F
イメージセンサデータ読出し 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 Bit 0xCA
E-Fuse プログラム Data 0xCD
動作/スタンバイ制御 0xE8
クロックセレクト 0xEC
ソフトウエアリセット 0xEE
バンクセレクト 0xEF
受光スポット座標(C) 0xF8
受光スポット座標(A) 0xF9
受光スポットピーク座標(B) 0xFA


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秒待機)
}

サンプルプログラムでは、距離センサ「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-距離センサ「GP2Y0E03」の使い方』では、Arduino Unoを使用したサンプルプログラムを解説してきました。

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

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

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

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

テキストのコピーはできません。