micro:bitのmicroPythonのi2c.writeの書き方 (TMP102温度センサのモード変更)

micro:bitに接続したTMP102温度センサのモード変更をやってみようとして、microPythonのi2c.writeの書き方でちょっと戸惑ってしまった。
自分がmicroPythonやPythonに不慣れというのもあるが。

TMP102で普通に気温とかの温度を計測するには、TMP102の電源投入後のデフォルトの計測モードのまま使えばよいのでモード変更の必要はない。
その場合、このようなプログラムのコードで計測ができる。

i2c.init(freq=10000, sda=pin20, scl=pin19)
addr = 0x49
i2c.write(addr, b'\x00')
data1, data2 = i2c.read(addr, 2)

i2c.write(addr, b’\x00′)でI2Cバスのaddrというアドレスのデバイスに0x00という値を書き込んでいる。
これは、TMP102の内部のレジスタの0番にこれからアクセスするために、レジスタアドレスをセットしたということだ。

そして、その次のdata1, data2 = i2c.read(addr, 2)で、I2Cバスのaddrというアドレスのデバイスから2バイトを読み出している。
これは、先ほどセットしたレジスタアドレス0x00のレジスタ(16bit = 2バイト)のデータを読み出したということだ。
レジスタアドレス0番は、TMP102の計測値が格納されているレジスタなので、それを取り出すことで温度の計測値を得ることができる。

ここまでは前回の復習だ。

次に、TMP102のレジスタアドレスの1番について調べてみる。
レジスタアドレス1番は、Configration Registerとなっていて、TMP102の動作に関する設定値が格納されている。
この16bitのレジスタの内容を書き換えることでTMP102の動作をいろいろと変更することができる。
(内容についてはTMP102のデータシートを参照のこと)

このレジスタを書き換えるコードは次のようになる。

buf = bytearray(2)
i2c.write(addr, b'\x01')
buf[0] = 設定データの上位8bit
buf[1] = 設定データの下位8bit
i2c.write(addr, buf)

2回i2c.writeをしているのだが、1回で済ませる方がよい。

buf = bytearray(3)
buf[0] = 0x01
buf[1] = 設定データの上位8bit
buf[2] = 設定データの下位8bit
i2c.write(addr, buf)

bufへの代入をもっと短く書くと次のようになる。

buf = bytearray([0x01, 設定データの上位8bit, 設定データの下位8bit] )
i2c.write(addr, buf)

あるいは、値が例えば0x1234とか決め打ちであれば次のように短く書くこともできる。

i2c.write(addr, bytearray(b'\x01\x12\x34'))

ちゃんとbytearrayに変換してやらないと動かないので注意が必要だ。
例えば、buf = [0x01,0x12,0x34]などと代入しようとすると、エラーとなる。




コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Time limit is exhausted. Please reload CAPTCHA.

38 − 34 =