はじめに
赤外線測距センサーGP2Y0E03を一つのI2Cポートで複数使用する方法を学んだので報告連絡相談。
下記サイトを参考にした。
team432.jpn.org
e-Fuseという一回書ききりのメモリーにデバイスアドレスを書き込むことで任意のアドレスを設定できる。しかし、一回しか書き込めないので失敗したら残念なことになるので注意。
本ページを参考にして発生した損害損失については責任取れないのでそこんとこよろしく。
早速ソースコード
#include <Wire.h> //# 変更後の デバイスアドレス -> SET_DATAに設定すべき値(上位4bitが書き込む値) //# 0x40 -> 0x08 //# 0x50 -> 0x0A //# 0x60 -> 0x0C //# 0x70 -> 0x0E #define SET_DATA 0x0E int GP2Y0 = 0x40; //変更前の デバイスアドレス int I2C_ACT = 22; //GPIO1を接続 int GP2Y_VPP = 21; //Vppを接続 void setup() { pinMode(I2C_ACT, OUTPUT); pinMode(GP2Y_VPP, OUTPUT); delay(10) ; digitalWrite(I2C_ACT, LOW); digitalWrite(GP2Y_VPP, LOW); delay(10) ; digitalWrite(I2C_ACT, HIGH); delay(10) ; Serial.begin(115200) ; Wire.begin(); delay(10) ; //<Stage 1> Clock Select(0xEC:R/W) Wire.beginTransmission(GP2Y0) ; Wire.write(0xEC) ; Wire.write(0xFF) ; Wire.endTransmission() ; delay(10) ; digitalWrite(GP2Y_VPP, HIGH); delay(10) ; //<Stage 2> E-Fuse(0xC8:R/W) Wire.beginTransmission(GP2Y0) ; Wire.write(0xC8) ; Wire.write(0x00) ; Wire.endTransmission() ; delay(10) ; //<Stage 3> E-Fuse Bit No/ Bank Assign(0xC9:R/W) Wire.beginTransmission(GP2Y0) ; Wire.write(0xC9) ; Wire.write(0x45) ; Wire.endTransmission() ; delay(10) ; //<Stage 4> E-Fuse Program Data(0xCD:R/W) Wire.beginTransmission(GP2Y0) ; Wire.write(0xCD) ; Wire.write(SET_DATA) ; Wire.endTransmission() ; delay(10) ; //<Stage 5> E-Fuse Program Enable Bit(0xCA:R/W) //0x00=Disable, 0x01=Enable Wire.beginTransmission(GP2Y0) ; Wire.write(0xCA) ; Wire.write(0x01) ; Wire.endTransmission() ; delay(10) ; //<Stage 6> E-Fuse Program Enable Bit(0xCA:R/W) Wire.beginTransmission(GP2Y0) ; Wire.write(0xCA) ; Wire.write(0x00) ; Wire.endTransmission() ; delay(10) ; digitalWrite(GP2Y_VPP, LOW); delay(10) ; //<Stage 7.1> Bank Select(0xEF:R/W) Wire.beginTransmission(GP2Y0) ; Wire.write(0xEF) ; Wire.write(0x00) ; Wire.endTransmission() ; delay(10) ; //<Stage 7.2> E-Fuse(0xC8:R/W) bank3のregisterにload Wire.beginTransmission(GP2Y0) ; Wire.write(0xC8) ; Wire.write(0x40) ; Wire.endTransmission() ; delay(10) ; //<Stage 7.3> E-Fuse(0xC8:R/W) Wire.beginTransmission(GP2Y0) ; Wire.write(0xC8) ; Wire.write(0x00) ; Wire.endTransmission() ; delay(10) ; //<Stage 8> Software Reset(0xEE:W) 0x06=software reset Wire.beginTransmission(GP2Y0) ; Wire.write(0xEE) ; Wire.write(0x06) ; Wire.endTransmission() ; delay(10) ; //<Stage 9.1> Clock Select(0xEC:R/W) Wire.beginTransmission(GP2Y0) ; Wire.write(0xEC) ; Wire.write(0xFF) ; Wire.endTransmission() ; delay(10) ; //<Stage 9.2> Bank Select(0xEF:R/W) Wire.beginTransmission(GP2Y0) ; Wire.write(0xEF) ; Wire.write(0x03) ; Wire.endTransmission() ; delay(10) ; //<Stage 9.3> 設定したデバイスアドレスの確認 Wire.beginTransmission(GP2Y0); Wire.write(0x27); Wire.endTransmission(); Wire.requestFrom(GP2Y0, 1); int readOutData = 0; Serial.print("read"); delay(100) ; readOutData = Wire.read(); Serial.println(" done"); delay(10) ; //<Stage 9.4> Bank Select(0xEF:R/W) Wire.beginTransmission(GP2Y0) ; Wire.write(0xEF) ; Wire.write(0x00) ; Wire.endTransmission() ; delay(10) ; //<Stage 9.5> Clock Select(0xEC:R/W) Wire.beginTransmission(GP2Y0) ; Wire.write(0xEC) ; Wire.write(0x7F) ; Wire.endTransmission() ; delay(10) ; Serial.print("設定したデバイスアドレス = "); Serial.println((readOutData << 3) & 0x7F); } void loop() { }
さいごに
これでいっぱい測距センサ使えるね!!!