Translate

ページ

2015年5月31日日曜日

I²C延長実験(HRM1017+BME280+HDC1000)



結露モニタ プロトタイプ1(BME280とHDC1000使用)にて、LANケーブルを利用したI²Cの延長を試しましたが、何が起こっているのかをLabToolを使って調べてみました。
(真面目にバッファICを使って延長する方法は、NXPのアプリケーションノート(AN10658)。とっつきにくい場合はI²Cサンプルブックから。)

プログラムの動作を見る限りでは、何の違いもなく45mまで延長出来たように見えましたが、アナログ的には随分と状況が悪化していることが分かりました。

主たる原因はバスの容量の増加に伴う信号の立ち上がりの鈍化。
規格上のI²Cバスの容量の400pFですが、
Cat6ケーブルの容量は5~6nF/100m (1kHz)程度らしいので、500~600pF/10m。
現在の何の工夫もない状態では、高々10m位までで使うのが良いようです。

最初の公開時に言及していたリンギングは、測定方法に問題がありました。測定点のそばでGNDを確保したところ無くなりました。

このような状態で一見うまく動いているのは、たまたま、今回の組みあわせ(HRM1017+BME280)が良かったのかもしれません。
電圧降下は激しいので、少なくとも低電圧動作が可能なマイコン/センサの方がうまく動きそうな気がします。

mbed祭 2015@初夏の東銀座用資料

mbed祭 2015@初夏の東銀座で展示した、
「mbed HRM1017+BME280使用 結露モニタと LANケーブル利用I2C延長」
の資料です。

用意したプレゼンテーション資料です。うまく映せずすいませんでした。 

別途用意していた配布資料+回路図です。

HRM1017用のコードは以下で公開しております。


LabToolについて

LabToolはNXP社の光速ADコンバータ搭載マイコンLPC4370を使った簡易測定キットです。
詳しくは、以下のリンク先をご覧ください。

実験装置概要
回路とプログラムは結露モニタ プロトタイプ1(BME280とHDC1000使用)です。液晶表示装置を追加しています。
I²Cバス上のデバイスは、HRM1017を除いて4つ
LANケーブルの手前には、HRM1017そばにHDC1000と液晶表示装置、そのうちHDC1000に10kオームのプルアップ抵抗
LANケーブルの先にはBME280と液晶表示装置、それぞれに10kΩのプルアップ抵抗となります。

測定結果

以下に、バスの接続ケーブルを伸ばしていくにつれ、SCLシグナルがどうなっていくのかを記しています。(HRM1017側のSCLと、ケーブルの先のI²CバスのSCLを取得しています。)

ジャンパケーブル接続(数10cm)



2mのCat6 LANケーブル
少し信号がなまっている位で、あまり違いは見えません。



    7mのCat6 LANケーブル使用
    電圧降下、波形のなまり



    15m Cat6 LANケーブル使用
    さらに信号は悪化
    回路自体は動作している



    30m(15mLANケーブル2本連結)
    波形の悪化に伴い、動作周波数が勝手に50kHzに落ちている。クロックストレッチという現象が発生している?
    プログラム自体は正常に動作しているように見える。値も正常。



    45m(15mLANケーブル3本連結)
    30mの時と同様
    プログラム自体は正常に動作しているように見える。値も正常。




    2015年5月1日金曜日

    結露モニタ プロトタイプ(BME280とHDC1000使用)

    mbed祭 2015@初夏の東銀座用資料

    mbed祭 2015@初夏の東銀座で展示した、
    「mbed HRM1017+BME280使用 結露モニタと LANケーブル利用I2C延長」
    の資料です。

    用意したプレゼンテーション資料です。うまく映せずすいませんでした。 

    別途用意していた配布資料+回路図です。

    HRM1017用のコードは以下で公開しております。


    以下、投稿当時の内容


    スイッチサイエンス社から、BME280という温湿度気圧センサーが発売されました。


    また、秋月で購入したHDC100という温湿度センサーを持っています。


    これらを利用して、結露に関する情報を得られるモニタのプロトタイプを作ってみました。

    概要

    • mbedマイコン (最終的にBLEで情報を飛ばしたいと思っているので、mbed HRM1017を使っていますが、現段階では使っていないので他のmbedでも動くと思います。)
    • 屋内用センサ: 秋月で購入したHDC1000 (温湿度センサ)
    • 屋外用センサ: スイッチサイエンス社で購入したBME280(温湿度+大気圧センサ)
      • プルアップ抵抗 10kΩ
    • LANコネクタDIP化キット:秋月で購入したK-05404
    • LANケーブル:LD-GPT/WH70 (7m Cat6対応ケーブル)
      • カテゴリー6ケーブル(Wikipedia)参照
      • T568B結線の半分(4本)を使っています。
        ピン番号
        ケーブル色
        信号名称
        1
        /
        VDD (+3.3V)
        2
        SDA
        3
        /
        VSS (GND)
        6
        SCL


    • LEDは通常のLED(OSNG3133A, OSNR3133A)。電流制限抵抗3.9kΩ (3.3kΩ可)


    配線図など

    • パーツリスト
      • 屋内(想定)モジュール
        #
        モジュール
        製品名称
        購入先
        備考
        1
        mbed
        mbed HRM1017
        スイッチサイエンス

        2
        I2C温湿度センサ
        HDC1000使用
        温湿度センサーモジュール
        秋月電気通商
        I2Cのプルアップ抵抗搭載
        3
        LED1
        OSNG3133A
        秋月電気通商

        4
        LED2
        OSDR3133A
        秋月電気通商

        5
        抵抗
        3.3kΩ
        秋月電気通商
        HRM1017GPIO電流制限0.5mA用に調整
        LEDは定格よりはかなり低い電流値で使用
        6
        抵抗
        3.3kΩ
        秋月電気通商
        同上
        7
        RJ45
        LANコネクタ
        DIP化キット
        秋月電気通商

      • 屋外(想定)モジュール
        #
        モジュール
        製品名称
        購入先
        備考
        1
        I2C温湿度・気圧センサ
        BME280搭載 温湿度・
        気圧センサモジュール
        スイッチサイエンス
        I2Cのプルアップ抵抗未搭載
        2
        抵抗
        10kΩ
        秋月電気通商
        I2Cのプルアップ用
        3
        抵抗
        10kΩ
        秋月電気通商
        同上
        4
        RJ45
        LANコネクタ
        DIP化キット
        秋月電気通商

    • 実体配線図など


    プログラム

    今回使ったプログラムはmbed上に公開しました。
    https://developer.mbed.org/users/takafuminaka/code/Condensation_Monitor/


    • 起動後10秒間、LED1(緑)とLED2(赤)を点灯させ、消灯します。
    • 10秒周期で2つのセンサーの値を読み取ります。
    • 結露を検知すると、LED2(赤)が点灯します。コンソール出力が有効な場合はそちらにメッセージを出します。(後述)
    • 結露が近いと判断する(結露までの温度差がwarn_wid(℃)を下回る)と、LED1(緑)が点灯します。コンソール出力が有効な場合はそちらにメッセージを出します。(後述)
      • warn_widは20℃と大きく設定しています。実運用では2~3℃に設定すると良いです。
    • コンソール出力はmain.cppの”#define NEED_CONSOLE_OUTPUT 1”をコメントアウトすると抑制出来ます。
      • コンソールをPC側で表示させない場合は抑制しないとmbed側の動作が停止すると思います。
    • コンソール出力について
    • 出力例
      In: 24.90 degC, 60.85 % Out: 26.10 degC, 55.20 %, 1011.04 hPa
      Humidity Ratio [g/kg] : In 11.79 Out 11.49
      Due Point Temperature [degC] : In 16.40 Out 16.81
      9.70 degC to Condensation at Outside
      8.08 degC to Condensation at Inside
      9.29 degC to Condensation at Window Inside
      8.49 degC to Condensation at Window Outside
      • 1行目に室内センサーの温度と湿度、室外センサーの温度、湿度、気圧が表示されます。
      • 2行目に屋内外の絶対湿度が[g/kg]単位で表示されます。
        • 結露対策のために換気をしても良いかどうかの目安となります。
          例えば、屋内の湿度が高い場合に、屋外の絶対湿度が屋内よりも低ければ、換気をするだけで湿度が低下します。
          逆に屋外の絶対湿度が屋内よりも高い場合は、湿分を取り込むことになるので換気をすると屋内の湿度が上がります。
      • 3行目に屋内外の露点が表示されます。
      • 4行目以降は警告あるいは注意表示です。
        • 上記の例は、後何度下がると何が起こるかが表示されています。
          • 最初の行は屋外の温度と露点を比較し、あと何度で結露するかを表示
          • 次の行は屋内の温度と露点を比較し、あと何度で結露するかを表示
          • 次の行は屋外の温度と屋内の露点を比較し、あと何度屋外が冷えると窓が結露するかを表示
          • 次の行は屋内の温度と屋外の露点を比較し、あと何度屋内が冷えると窓が結露するかを表示
        • もし、露点を下回った場合は結露が発生したとみなし、” Condensation at  XXX”あるいは” Condensation at Window XXX”の様にメッセージを出します。


    理屈


    温湿度が分かれば、露点が計算できます。
    さらに気圧が分かれば、絶対湿度が計算できます。


    室内外の計測情報を活用すると、結露しているのかどうか、あるいは、あと何度で結露するのかが分かります。

    今回のプログラムでは、ここここの式を利用して計算しています。


    LANケーブルによるI2C延長について

     シリアル拡張ICサンプルブックI2C仕様書等を参考に考察と実験を行い、上記ケーブルを使いました。ツイストペアケーブルを使ったバス延長はI2C仕様書p.60に説明があります。

     そこで、Cat6の15mケーブルを借りてきて試したところ、3.4Mhz(設定値ベース)で通信可能でした。

     プロの方いわく、「シングルエンドの信号なんで,インピーダンスの低い線とペアで扱うことにより良好な結果が得られる」のだそうです。

     

    写真は載せませんがその後もう少し実験をした結果です。

    • Cat5e 15mのケーブルでも成功(100kHz設定)
    • Cat6 15mのケーブル3本を延長コネクタで接続(つまり45m!!)しても成功(100kHz設定)

     結局限界は今回は分からずじまいでした。私の用途では、十分すぎる性能です。
    本当は、数mでうまく動かなくなり、サンプルブック付属のバッファICで延長するという計画だったのですが、無くても動くという、思わぬうれしい誤算でした。

    (2015-05-19追記)
    Labtoolで取得したI2Cバスの様子です。
    アナログ波形はずいぶん歪んでいるようです。
    また、I2Cの周波数指定はうまく効いていなかったようで、100kHz動作です。