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]などと代入しようとすると、エラーとなる。