【Arduino】GP2Y0E03のデバイスアドレス変更の方法【Slave Address】

はじめに

赤外線測距センサーGP2Y0E03を一つのI2Cポートで複数使用する方法を学んだので報告連絡相談。
下記サイトを参考にした。
team432.jpn.org

e-Fuseという一回書ききりのメモリーにデバイスアドレスを書き込むことで任意のアドレスを設定できる。しかし、一回しか書き込めないので失敗したら残念なことになるので注意。
本ページを参考にして発生した損害損失については責任取れないのでそこんとこよろしく。

GP2Y0E03

早速ソースコード

#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()
{


}

さいごに

これでいっぱい測距センサ使えるね!!!