測距モジュール(GP2Y0E03)で物体の距離を測ってみます
〔PICの動かせ方入門に戻る〕
前にArduinoで測距モジュールGP2Y0A21YKを動作させて見ました、
今度シャープから新型の測距モジュールGP2Y0E03が出たので
PICで動作させて見ます。
尚、ArduinoでGP2Y0E03の記事はこちらです。
左写真の上がGP2Y0A21で、下がGP2Y0E03です、
かなり小さくなっていますね。
これならロボット等にも搭載しようかなって思えますね。
が、取り付け穴ぐらいは欲しいような気がします....
GP2Y0E03は秋月電子のこちらから購入しています。
GP2Y0E03の測距範囲は4〜50cmです、出力はアナログ電圧出力とI2C出力が有ります。
GP2Y0E03のデータシート(アプリケーションノート)はこちらです。
下のグラフはデータシートからの抜粋ですが、出力電圧と距離の関係グラフです。
左がGP2Y0A21で、右がGP2Y0E03です。

GP2Y0A21では、電圧と距離の関係が一直線でなかった為に距離を割り出すのが大変で誤差が大きく
距離を測ると言うよりは物体を検知する的な使い方しか出来なかったです。
GP2Y0E03は、赤外線を使い三角法で距離を測定するらしくグラフが一直線ですねぇ、すばらしぃ、
ですので距離の割り出しも簡単で精度もかなり良いです、±1cm以内位でした。
ただ、三角法ゆえんかぁ、放射する光が垂直に物体に当たる様にする必要が有り、
ズレても±3°以内位で光を反射させなといけないです。
でないと距離がズレます、結構シビアかもね、この辺が若干なんだなぁ。
《配線図》
左図はPIC16F1827のピン構成図です。
今回使用するピンは、
電源ピンの14番(VDD)と5番(VSS)に
I2Cピンの7番(SDA1)と10番(SCL1)、
アナログ入力の1番(AN2)です。
電源はセンサとLCD表示器が3.3Vなので
回路も3.3V電源で統一しています。
16F1827にはMSSP機能が2個有りますがここではMSSP1(SDA1/SCL1)のみ対応
この配線の、GP2Y0E03からの出力は
アナログ出力(Vout)とI2C出力(SCL/SDA)の
両方を配線していますが、自分の利用する方のみを
配線を行えば良いでしょう。
GP2Y0E03は付属のコネクタケーブルで
接続します、7本線が出ています。
VDDは2.7-5.5Vですが、I/Oが1.8-3.3Vです
なので3.3Vで利用しましょう。
VIN
I/Oへの電圧供給端子Cです。
「I2C通信とGPIO1端子の入力電圧の
入力/出力電圧は、VIN(IO)端子の
入力電圧によって決定される。」
と書いて有ります。
GPIO1
アクティブ/スタンバイ切替端子Dです。
アクティブはHIGH(VINと同じ電圧)に接続し、スタンバイはLOW(GND)に接続
アナログ出力
GP2Y0E03のAVoutとPICの1番(AN2)端子を接続しています、上配線図のオレンジ色線です。
上のグラフでも解る様に大体、4〜50cm で2.2V〜0.55V の出力電圧が得られます。
I2C出力
GP2Y0E03のESCL/FSDAとPICの10番(SCL)/7番(SDA)とをそれぞれ接続します。
上配線図の青色線(SDA)と緑色線(SCL)です。
I2Cのプルアップ抵抗はPIC内蔵を使っているので外での抵抗は付けていません。
《ダウンロードプログラムについて》
↓ここからサンプルプログラムソースファイルをダウンロードして下さい。
DMSU2.lzh
プログラムソースをダウンロードしたら、MPLAB Xにてプロジェクトを作成します。
以下のファイルをプロジェクトディレクトリにコピーしてプロジェクトに取込んで下さい。
次にコンパイルとPIC書き込みを実行して下さい。
MPLAB(R) XC8 C Compiler Version 1.32コンパイラを使用しています。
ダウンロードしたら解凍して下さい、以下のファイル構成です。
DMSU21.c・・・・・・・GP2Y0E03からアナログ出力で読み取るソースプログラム
DMSU22.c・・・・・・・GP2Y0E03からI2C出力で読み取るソースプログラム
skI2CLCDlib.c・・・・I2C接続LCDライブラリ関数ソースファイル
skI2CLCDlib.h・・・・I2C接続LCDライブラリ用インクルードファイル
skI2Clib.c・・・・・・・・I2C通信を行う関数ソースファイル
skI2Clib.h・・・・・・・・I2C通信を行う関数のインクルードファイル
自分の作成する物に応じてDMSU21.c/DMSU22.cの何方か一つでコンパイルして下さい。
尚、CPUのクロックは8MHzを想定しています。
DMSU21.c
このプログラムはアナログ出力を利用する場合のサンプルプログラムです。
アナログ端子(AN2)に接続したセンサーから、100回読込み単純平均化させた値から距離に変換し
表示させるだけのプログラムです。
赤外線距離センサーの前に反射物をかざしてみましょう、
左図の様に値が表示せれるはずです。
近場はかなり正確です、50cmに近づくと±1cmぐらいの誤差が
出るような感じです。
実際に電圧を測ったりしてmap( )関数の値を少し上下に変更すればもう少し精度が出ると思いますが
実験していません。
DMSU22.c
このプログラムではI2Cで接続をする場合のサンプルプログラムです。
実行させた結果は上図と同じ様になります。
I2Cスレーブアドレスについて
アドレスは7ビットで表します、左図の1〜7ビットです。
0ビット目はR/Wでこれはスレーブに対する読書き指示ビットです。
R/W=0 : 書き込み要求です(スレーブは受信モード)
R/W=1 : 読み込み要求です(スレーブは送信モード)
今回のGP2Y0E03アドレスは、7ビット"1000000"(0x40)です。("1000000"+R/W)
データシートには、
R/W=0 : "1000000"+"0"で0x80
R/W=1 : "1000000"+"1"で0x81
と8ビットで記載されています注意しましょう。
よってここでは
#define SENSOR_ADRS 0x40 // GP2Y0E03のI2Cアドレス
となっています。
GP2Y0E03アドレスは変更する事が出来ます、GP2Y0E03内部の不揮発性メモリに書込まれています。
これを変更(E-Fuse Programming)すれば良いでしょうその方法はデータシートを参照して下さい。
距離計算について
GP2Y0E03の距離用データ格納先は、テーブルアドレスの0x5E,0x5Fに格納されています。
データは12ビットです、0x5Eに上位11-4ビットが格納され、0x5Fに下位3-0ビットが格納されています。
プログラムでは
ans = ((c[0]*16+c[1]) / 16) / 4 ; // 取り出した値から距離(cm)を計算する
となっています。
c[0] = 0x5E (11-4 Bit)
c[1] = 0x5F ( 3-0 Bit)
4 = 2^n // n=Shift Bit(テーブルアドレス0x35の内容で0x01か0x02です、デフォルトは0x02)
よって実際は
ans = ((c[0]*16+c[1]) / 16) / pow(2,0x02) ; // pow()はべき乗関数
なので、本当ならプログラムの立上げ時にテーブルアドレス0x35を読込んで置いてそれを計算に使うと
した方が良いです、が、0x35は自分で設定を行うデータで有りどんな値(デフォルトは0x02)が設定
されているか解っているはずです。
また、pow( )関数を使うとコンパイル後の使用メモリが23.9%から81.7%程に増えます、
だからスケッチは 2^2 = 4としました。
skI2CLCDlib.c
skI2CLCDlib.h
skI2Clib.h
skI2Clib.c
このプログラムはLCDに表示を行う為の物とI2C関連の物です、詳しくはこちらの説明を参照下さい。
《その他》
左は実験風景の写真です。
I2C接続でのコンパイルは23.9%ですが、
アナログ接続でのコンパイルは31.9%です
これは、map( )関数で、long変数を使っている為です。
って事で、I2C接続をお勧めしておきましょう。
反射物に光が垂直に当たる様にしないと
距離が結構ずれるのが気にかかります
移動する物(ロボット・車)に搭載して
果たして上手く行くのか気になりますねぇ。
こちらも有りますがアナログ出力のみしかもお値段が大して変わらない。
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.