##距離センサーについて
距離センサーといってもいくつか種類があります。
-光学式
-超音波
-レーザー など
今回使用してみたいセンサーは、PSD(position sensitive detector)という素子を利用する赤外線光学センサーで、対象物との距離を反射光の入射角度によって読み取る方式です。
この方式で有名?個人的に昔から使っていたのが、シャープのGP2Y0A21YKです。このセンサーは対象物との距離をアナログ出力してきます。マイコンなどのA/D変換機能を用いると簡単に読み取ることが出来ますが、出力値が線形で無い(非線形)となり補正を必要とするなど、扱いにくい点もあります。
今回は新たにGP2Y0E03以下E03を利用することにしました。
また、今回アナログポートを利用せずにI2Cで値を取得することで、PINの節約もしたいと考えました。
ArduinoのI2C(アイスクエアシー)については、Arduinoを30分でI2C通信するにてご説明頂いておりますので、ありがたく紹介させていただきます。
##シャープ製光学距離センサーGP2Y0E03について
引用GP2Y0E03 秋月電子通商
■特徴
・信号処理回路内蔵
・CMOSイメージセンサ
・赤外LED採用
・小型(16.7×11×5.2 mm)
・高精度
・デジタル(I2C)/アナログ電圧出力
■主な仕様
・出力:I2Cおよびアナログ出力
・電源電圧(VDD):2.7~5.5V
・測距範囲:4~50cm
L=50cmにおいて
VOUT(A)1=0.3~0.8V
D1=45~50cm
L=4cmにおいて
VOUT(A)3=2.1~2.3V
D3=3~5cm
・サイズ:18.9x8.0x5.2mm
となっています。
小さいこと、アナログ、I2Cどちらにも対応している点がうれしいです。
測定距離ですが、実感として60cm程度までが範囲かなと思います。
30cm程度の近距離は精度も安定しています。
##I2C接続
###GP2Y0E03単独でArduinoと接続
ArduinoのSCL(A5)とSDA(A4) をそれぞれ接続し、プルアップすればよいのですが、E03の電源電圧が3.3Vなので5V系のディバイスと接続する場合は、レベル変換を行う必要があります。
今回はPCA9306を使いました。
販売されている基板では、プルアップ抵抗が取付済みですので、改めて取り付ける必要はありません。
また、E03はI2C通信を行う場合GPIO1をHレベルにする必要があります。Lレベルのままだとスタンバイとなります。
###複数ディバイスでArduinoと接続
スレーブアドレスが異なるディバイスをバス上に接続する数場合の結線図です。
試に加速度センサーADXL345を組み込みました。
##通信プログラム
#include <Wire.h>
// デバイスアドレス(スレーブ)
uint8_t E03_DEVICE_ADDRESS 0x40
uint8_t DISTANCE_ADDRESS 0x5E
void loop(){
uint8_t dis[2];
uint16_t distance;
Wire.beginTransmission(E03_DEVICE_ADDRESS);
Wire.write(DISTANCE_ADDRESS );
Wire.endTransmission();
Wire.requestFrom(E03_DEVICE_ADDRESS, 2);
for (i=0; i< 2; i++){
while (Wire.available() == 0 ){}
dis[i] = Wire.read();
}
distance = dis[0]<<4;
distance |= dis[1];
distance = (distance / 16) / 4;
Serial.print(dis[0]);
Serial.print(" ");
Serial.print(dis[1]);
Serial.print(" ");
Serial.println(distance);
}
設定については全てDefaultです。いじってません。
距離の値は12バイト長となっており、
E03のアドレス0x5eにDistance[11:4] 0x5fにDistance[3:0]か格納されています。
従って、2バイとに分けられてデータが受信されます。
上位を4ビット左シフトし、下位の4ビットとORすることで12ビットのデータを生成できます。
distance = (distance / 16) / 4; にて[cm]に変換しています。
実測で確認しましたが、式が間違っていたらごめんさい。
最後にシリアルモニターで確認します。
①0x5e_Distance[11:4]の値(上位)
②0x5f_Distance[3:0]の値(下位)
③距離[cm]
##最後に
3.3V系のディバイスでは、非常に便利です。
しきい値など細かい設定が出来ます。さらに用途に応じた設定が出来ると思います。