前に測距モジュールのGP2Y0A21YKを動作させて見ました、

この配線の、GP2Y0E03からの出力は
左の電圧レベル変換モジュール(PCA9306)を間に入れています、
---------------------------------------------------------------------
void setup() {
Serial.begin(9600) ; // 9600bpsでシリアル通信のポートを開きます
}
void loop() {
int ans ;
ans = IDMread(0) ; // アナログピン0番のセンサー値を読込む
ans = map(ans,0,1023,0,500) ; // 読込んだ値から電圧値に変換する(0-5V)
ans = map(ans,50,220,50,4) ; // 電圧値から距離に変換する(0.5-2.2V -> 50-4cm)
Serial.print(ans) ; // シリアルモニターに表示させる
Serial.println("cm") ;
delay(500) ; // 500ms後に繰り返す
}
// 赤外線測距モジュールから読み込む処理
int IDMread(int PinNo) {
long ans ;
int i ;
ans = 0 ;
for (i=0 ; i < 100 ; i++) {
ans = ans + analogRead(PinNo) ; // 指定のアナログピンから読取ります
}
return ans/100 ; // 100回の平均値を返します
}
---------------------------------------------------------------------
CIDEツールバーの赤枠部分「Upload」ボタンをクリックしてコンパイルとarduinoボードに書込みを
D正常終了後、ArduinoIDEのシリアルモニター(右側のアイコン)を
---------------------------------------------------------------------
#include <Wire.h>
#define SENSOR_ADRS 0x40 // GP2Y0E03のI2Cアドレス
#define DISTANCE_ADRS 0x5E // Distance Value のデータアドレス
// 電源起動時とリセットの時だけのみ処理する関数
void setup()
{
Serial.begin(9600) ; // シリアル通信の初期化
Wire.begin() ; // I2Cの初期化、マスターとする
delay(1000) ; // 1秒後に開始
}
// 繰り返し実行されるメインの処理関数
void loop()
{
int ans ;
byte c[2] ;
Wire.beginTransmission(SENSOR_ADRS) ; // 通信の開始処理
Wire.write(DISTANCE_ADRS) ; // 距離値を格納したテーブルのアドレスを指定する
ans = Wire.endTransmission() ; // データの送信と終了処理
if (ans == 0) {
ans = Wire.requestFrom(SENSOR_ADRS,2) ; // GP2Y0E03にデータ送信要求をだし、2バイト受信する
c[0] = Wire.read() ; // データの11-4ビット目を読み出す
c[1] = Wire.read() ; // データの 3-0ビット目を読み出す
ans = ((c[0]*16+c[1]) / 16) / 4 ; // 取り出した値から距離(cm)を計算する
Serial.print(ans) ; // シリアルモニターに表示させる
Serial.println("cm") ;
} else {
Serial.print("ERROR NO.=") ; // GP2Y0E03と通信出来ない
Serial.println(ans) ;
}
delay(500) ; // 500ms後に繰り返す
}
---------------------------------------------------------------------
I2Cスレーブアドレスについて
アドレスは7ビットで表します、左図の1〜7ビットです。
スケッチでは
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()はべき乗関数
なので、本当ならsetup( )内でテーブルアドレス0x35を読込んで置いてそれを計算に使うとした方が
左は実験風景の写真です。
記事一部追記(*1) 2019/01/27
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.