TOPに戻る

センサ・シリーズ 温湿度①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年ごろ、クロック・ストレッチには対応されていない話題が見つかりました。

連載 ラズパイ センサ・シリーズ

(1) 温度①確度±0.1℃ TMP117 その1 温度の読み出し

(2) 温度①確度±0.1℃ TMP117 その2 アラートの設定

(3) 温度①確度±0.1℃ TMP117 その3 アラートでLED点灯

(4) 温度①確度±0.1℃ TMP117 その4 アラートでリレー駆動

(5) 温度②温度調節器 その1 Modbusの設定

(6) 温度②温度調節器 その2 Modbusで読み書き

(7) 温湿度①SHT31 その1 測定準備

(8) 温湿度①SHT31 その2 測定と波形

(9) 温湿度①SHT31 その3 CRC

(10) 温湿度①SHT31 その4 BLE