May 08, 2009

DS18B20 を使ってみる:1-Wireバスの接続 [computer]

1-Wireバスはコントローラ1台と複数台のスレーブデバイスから構成される。 コントローラは+5Vの電源が供給できて、データ線は1ビットの入出力端子が必要となる。 入出力端子の出力側はTTLレベルの3-stateまたはオープンドレイン出力である必要がある。データ線は5KΩ程度でプルアップされる。

電気的には大きな問題はないが、PCをコントローラにする場合タイミングの条件が比較的厳しい。仕様上タイミングを最低15μS以内で制御する必要がある。これはUnix系のOSのようなラウンドロビンのスケジューリングをするOSの場合、ユーザプログラムでは条件を満たすことができない場合がある。

信頼性を高くする必要のあるアプリケーションの場合、クリチカルな部分ではカーネル内で割り込みを禁止して処理を行う必要がある。 もっとも温度の測定タイミングが数秒ずれても問題が無いような場合(室温の測定や水槽の水温の測定の場合が当てはまる)はそこまで厳密に行う必要がない。 ディスクのアクセスやネットワークからのデータ処理のため温度測定に失敗したとしたらまた最初からやり直せばいい。

今回はプリンタポートを双方向モードに設定してポートのデータ線のうち最下位ビットを1-Wireに割り当てることにした。+5Vはプリンタポートのコントロール信号のうち1本(~AUTOFEED)を利用した。後で仕様の確認をしたところ、電流の供給能力等で問題がないわけではないことが分かったが取り合えずセンサ1,2本をつないで動かしたところ動いてはいるので現状のままにしてある。

DS18B20 - PC Circuit

DS18B20等の1-Wireバスのデバイスはそれぞれ64bitのユニークなID(ROMID)を持っている。コントローラは各デバイスにIDを指定してコマンド(温度測定開始、変換結果の読み取り等)を送る。なお温度測定開始など一部のコマンドについてはバス上のデバイスすべてに対して同時に送ることもできるようになっている。


P.S.
ところで最近ではレガシーなインターフェースが無いマザーボードとかもあって、USB-シリアル変換器とかUSB-パラレル変換器とか後ろ向きなソリューションを使ってる人もいるかと思いやす。

この手の変換器では対応できないことがいくつかあります。ここに書いたような用途もその一つです。現状、USB-パラレル変換器では絶対に動きません(USB3.0が出てきたら可能性はある)。

USBではフレーム単位でデータの送信が行われ、USB1.1では1ms, 2.0のハイスピードモードでは125μsの単位で転送動作が行われます。なのでホスト側でスレーブのデバイスの信号線を15μs以下の間隔でソフトウェア制御するのは不可能です。 USBしか使えない場合素直にUSBの先にPICなりH8なりMAXIMの出しているプロトコルコントローラICなりを繋ぎましょう。

Posted at 00:35 in computer

Archives
Powered by
blosxom 2.0
and
modified by
blosxom starter kit