センサ・シリーズ 温湿度①SHT31 その2 測定と波形
前回の測定の波形を見ます。使っているのは2チャネルのオシロスコープPicoScope 5242Bです。I2Cのシリアル・デコードは標準機能です。使用環境のノイズが多いので、カットオフ周波数1MHzのローパス・フィルタの機能を有効にしているので、波形は少しなまっています。
前回のプログラムでは、転送速度は設定していないので100kHzです。
前回のプログラムの出力です。
詳しく見ていきます。繰り返されているのは次の命令です。コマンド0xffを送ったら、6バイトを各変数に読み取ります。
dataTmsb, dataTlsb, dataTcrc, dataHmsb, dataHlsb, dataTcrc = i2c.read_i2c_block_data(addr,0xff,6)
●スタート・コンディションとスレーブ・アドレスから始まる
通信開始部分の拡大です。スレーブ・アドレスが書き込みで発行されました。
0xffがバスに出たので、スレーブはそれを取り込んでACKを出します。
再度スレーブ・アドレスが出ますが、今度はReadです。マスタはスレーブ・デバイスがセンサの値をバスに出すのを読もうと待ちかまえます。
最初は温度の3バイトです。温度2バイトとCRCが1バイトの構成です。ACK(黄色)を出しているのはマスタです。
次は湿度の3バイトです。
5回1バイトを受け取るごとにマスタはACKを出しました。最後の1バイトを受け取るとNACK(Negative ACKnowledgement)を出します。そして、ストップ・コンディションに移行し、一連の通信が終了します。
●転送速度を400kHzに上げる
ターミナルで、sudo nano /boot/config.txt と打ち込んでファイルを開きます。次の行を最後に追加し、書き込みます(CTRL-o CTRL-x)。
dtparam=i2c_arm_baudrate=400000
rebootします。イコールの前後にスペースがあると有効になりません。
正常に通信できています。
SHT31の上限1MHzに変更しましたが、Remote I/O errorが出ました。400kHzに戻します。
●単発測定コマンド、クロック・ストレッチの有無
ここまでは、周期的連続測定コマンドを利用しました。ここから、単発測定コマンド、クロック・ストレッチ無効、繰返し精度レベル-高のコマンド0x24、0x00を設定します。
プログラムです。単発なので、ループの中でコマンドを発行し、読み取ります。
import smbus
import time
i2c = smbus.SMBus(1)
addr = 0x44
#main
while 1:
i2c.write_byte_data(addr, 0x24, 0x00)
time.sleep(0.015)
dataTmsb, dataTlsb, dataTcrc, dataHmsb, dataHlsb, dataTcrc = i2c.read_i2c_block_data(addr, 0xff, 6)
rawT = dataTmsb << 8 | dataTlsb
rawR = dataHmsb << 8 | dataHlsb
print (' tempData= {0:0>16b} 0x{1:x} HumidityData= {2:0>16b} 0x{3:x}'.format(rawT, rawT, rawR, rawR) )
temp = -45 + rawT * 175 / 65535
RH = 100 * rawR / 65535
print(' temp= {0:.1f} `C, humi= {1:.1f} RH%'.format(temp, RH))
time.sleep(3)
print ("---")
|
実行結果の表示です。
波形です。想定通りのタイミングで書き込みと読み出しが行われています。
データのやり取り部分を拡大しました。
単発コマンド0x24, 0x00を発行した後の待ち時間を15ms以下にしたら、Remote I/O errorになりました。
●単発測定コマンド、クロック・ストレッチあり
つぎに、クロック・ストレッチありの単発コマンド0x2c, 0x06を発行しました。待ち時間はなしです。正常に温度と湿度を読んできました。
波形です。クロック(赤色)に注目です。
拡大します。前半です。単発コマンド0x2c, 0x06を発行し、6バイトの読み込みをするためにアドレスをRead属性で出した時点で、クロックSCLがLowのままになり、上記のように12ms維持されます。
12ms経過後の拡大波形です。温度と湿度のデータがバス上に現れました。
(※)検索すると、2012年ごろ、クロック・ストレッチには対応されていない話題が見つかりました。