CP2112を使ってLabVIEWでI2C通信

LabVIEWでI2C温度センサを使いたいがNational InstrumentsのI2C 対応DAQは6万円もするのでちょっと手が出ない。色々探したところサンハヤトのMM- CP2112Aモジュール(1,700円)に対応したWrap ドライバが見つかり、これを使ったら簡単にLabVIEWでI2C通信が行えた。

関連記事:MCP2221Aを使ってLabVIEWで I2C通信

あらかじめやっておくこと


LabVIEW Home Bundleのインストール。

体験版で もいいのでLabVIEW2015以降が使える環境を作っておく。理由は後述。

MM- CP2112Aモジュール、および I2C 温度センサ(ADT7410)の購入。

MM-CP2112A に ADT7410 を接続する。
MM-CP2112A の SCL, SDA は+Vにプルアップ済みなので超簡単。

CP2112をUSB接続するとすぐにPCが認識する。ドライバ等は特に必要ない。

プログラミングの準備


1.CP2112のWrapドライバをVectorからダウンロードする。
http://www.vector.co.jp/soft/winnt/hardware/se514398.html  (toolsbox様)

2.圧縮ファイルを解凍する。¥LV-CP2112¥Projectフォルダの中に
        <builds>
        <Drivers>
        <LVProject>
        LV-CP2212.lvproj
        LV-CP2212.lvlps
        LV-CP2212.aliases
の6つが入っている。
しかし、LV-CP2212.lvproj を起動するとLabVIEW Home Bundle (Ver.2014)で開くことができない。
これはWrapドライバがLabVIEW2015で作成されているためである。

3. そこで、LabVIEW体験版をインストールして最新版でLV-CP2212.lvproj を開き、
「ファイル」→「旧バージョン用に保存」を選んで2014版にダウンコンバートする。
保存先は以下のフォルダにする。
C:\Program Files (x86)\National Instruments\LabVIEW 2014\user.lib



4.新規viを開いて、ブロックダイアグラム画面を右クリックする。
ユーザライブラリ → LV-CP2112 → LVProject → public に入っているものを使用する。


フォルダから直接ドラック&ドロップで使ってるけど、user.lib に入ってるものを使っていれば特に問題はないみたい。



5. それぞれの使い方はtoolsbox 様のHPを必読。


Wrapドライバを使ってみる


ADT7410温度センサモ ジュールを使って実際にプログラミングしてみた。(↓クリックで拡大)

プログラムを開始すると温度センサの計測値がグラフに表示される。

使用したWrapドライバは以下の8つだけ。         CP2112_GetNumDevices.vi
        CP2112_DevOpen.vi
        CP2112_SetSmbusConfig.vi
        CP2112_WriteRequest.vi
        CP2112_ReadRequest.vi
        CP2112_ForceReadResponse.vi
        CP2112_GetReadResponse.vi
        CP2112_DevClose.vi

GetNumDevices
        CP2112がPCに接続されている数を調べる。2つ繋いだら2が,繋がなければ0が返される。
        ここでは1つだけ繋がった場合(1)をTrueにしている。

DevOpen
        CP2112を使い始める。1つしかUSB接続していないので 0 を入力する。
        2つ以上USB接続した場合はそれぞれ 0, 1, 2, …と区別できる。

SetSmbusConfig
        I2C通信の設定をする。writeTimeout と readTimeout の数値は指定したほうがよい。
       

WriteRequest
        ADT7410(スレーブデバイス、アドレスx48)に対して2バイトの書き込みを行う。
        0x03(デバイス設定)
        0x80(101 0000, 16bit分解能, one-shotモード)
        参考:http://akizukidenshi.com/download/ds/analog/ADT7410a.pdf
        参考:I2C 温度センサADT7410を使う(5) 16bitで読み出し

ReadRequest
ForceReadResponse
GetReadResponse
        2バイトの読み込みを行う。サ ンハヤトのHPによると、
                ****************
                ■CP2112のアプリケーション開発時の注意
                Auto read response設定には不具合があります。(2015/8/20時点)
                HidSmbus_SetSmbusConfig()にてautoReadResponseを有効(1)に設定した際、
                不定なデータまたはデータが読み出せない場合があります。
                データを読み出す際は、autoReadResponseを無効(0)に設定し、
                全てのアドレスリードリクエストの後にForce Read Responseを開始してください。
                手順は以下のようになります。
                HidSmbus_AddressReadRequest()
                HidSmbus_ForceReadResponse()
                HidSmbus_GetReadResponse()
                ****************
        とあるので、そのとおりに従っておく。

DevClose
        ループが終了したら最後に終了処理を行う。


アプリケーション(EXE)をビルド


検討中。
Driverフォルダ内にある SLABHIDDevice.dll と SLABHIDtoSMBus.dll を
exeのあるフォルダにコピーする必要があるみたい。


ダウンロード


CP2112_ADT7410.vi  (上で書いたもの)
CP2112_ADT7410_2.vi  (もう少し作り込んでこんな↓感じにした)