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制御の測定
- シャープ測距モジュールGP2Y0E03 (I2C&アナログ出力)
- I2Cバス用双方向電圧レベル変換モジュール(PCA9306)
- Arduino Uno
- USBケーブル
- ブレッドボード
- ジャンパ線
- 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-距離センサ「GP2Y0E03」の使い方』では、Arduino Unoを使用したサンプルプログラムを解説してきました。
やはり、たくさんの種類のあるArduinoボードの中でも、最も基本的なエディションのArduino Unoがおすすめなのですが、Arduino Unoと電子部品を組み合わせたキットも存在します。
電子工作初心者にとっては、いちいち電子部品を別途購入する必要がないので非常に有用です。以下の記事で初心者でもわかりやすいように、ランキング形式でおすすめのArduino Unoを紹介しているので、ぜひご覧ください。
また、以下の記事で、安価でWi-Fi/Bluetoothに対応している「ESP32開発ボード」についてもまとめてみました。
このボードは、Arduinoボードではありませんが、Arduino IDEでソフト開発ができるため、電子工作でIoTを実現したい方におすすめです。