micro:bitの標準I2Cブロックでシャープ測距モジュールGP2Y0E03を接続する際の備忘録です。

1.GP2Y0E03 I2C接続の配線

(1) VDD → 3.3V
(2) Vout(A) → アナログ出力なので不使用
(3) GND → Ground
(4) VIN(IO) → 3.3V
(5) GPIO1 → 3.3V固定かmicro:bitのデジタルPinでHに
(6) SCL → micro:bitのI2C用のP19
(7) SDA → micro:bitのI2C用のP20


2.GP2Y0E03のI2C アドレス関係

1) センサの固定されたスレーブアドレス

アプリケーションノートではWrite:0x80, Read:0x81だが,,,
標準的なI2CではAddressは7bitで指定し,それに読み書きのR/Wを示す1bitを足すので



R/Wの1bitはI2Cブロックで自動的につくので,スレーブアドレスとしてブロックに書き込む数値は0x40の10進数で4*16+0=64である。




2) 測長データの格納されたレジスタの内部アドレス

測長データは12bit長で,センサ内部では二つの連続したレジスタに上位8bitと下位4bitに分けて書き込まれる。

内部のレジスタアドレスはデータの上位8bitが0x5E,下位4bitが0x5Fである。このアドレスを10進数に変換した5*16+14=94と5*16+15=95がブロックに書き込むレジスタの内部アドレスになる。

ただしレジスタアドレス95(0x5F)のデータの下位4bitはバイトの下位に書かれているので16bitデータとして読み込んでも良いが,後の数値処理は異なってくる。


それぞれのレジスタのデータを8bitとして読み込んだ場合は,上位のデータを16倍して4つ左にシフトした後に下位と足せば良い。


得られたデータは16で割って再度右に4つシフトし,更に2^n(デフォルトのnは2)で割ってcm単位となる。

値としてはmicro:bitの小数点の取り扱いがよく分からないので,整数扱いが良いのかもしれない。


2.micro:bitでGP2Y0E03のデータをI2Cで読み込む

1) micro:bit(マスタ)でI2C接続のセンサ(スレーブ)のデータを読み込む時は,基本的には

(1)まず マスタ側からスレーブアドレスでセンサを指定し,そのセンサの内の読み込みたいデータレジスタの内部アドレスをセンサに伝える(センサ側に書き込む)。
(2)その後,再度センサをスレーブアドレスで指定し,先に伝えた内部アドレスのデータレジスタから読み込みを行う。

*アプリケーションノート的には,このセンサモジュールのI2Cはリピートスタート機能(Repeat-Start)と連続読み出し機能(Burst-Read)があるので,micro:bitは読み込みたいデータレジスタの内部アドレスを書き込んだ後に一旦ストップ(P)をかけなくても良い。

ただし,標準ブロックエディタでI2Cを使う場合,Repeat-Startは有効だがBurst-Readはうまく働かないので,8bit毎に読み込む場合は個別のアドレスを指定する。(下線部は8/13 追記)

2) micro:bitからのACK, NACK, P などのパルスはブロックの「つづく」項目の「真/偽」設定で発生する。

しかし,最初の1Byte読み込みの後は「つづく」項目が「真」」でも「偽」でもNACK, P が出ているので,次のプログラムはうまく働かない。


このため,この読取り部は次のプログラムのように各レジスタ毎にアドレスを指定し読み込むのが確実である。




3.その他のI2C関係のメモ

1)micro:bit内部で使われている I2Cアドレス


(micro:bit:developer community より転載)


2) micro:bit のドキュメントリンク

入力ピンについて
数値のフォーマットについて

(ブロックエディタ ーで数値はBASICには)
A Number is an integer such as 42 or -42. More precisely, a Number is a signed 32-bit integer (two’s complement).

(出入力フォーマットの例)
Int8LE: one byte, signed, little endian
UInt8LE: one byte, unsigned, little endian
Int8BE: one byte, signed, big endian
UInt8BE: one byte, unsigned, big endian
Int16LE: two bytes, signed, little endian
UInt16LE: two bytes, unsigned, little endian
Int16BE: two bytes, signed, big endian
UInt16BE: two bytes, unsigned, big endian
Int32LE: four bytes, signed, little endian
Int32BE: four bytes, signed, big endian